我只想显示V通道图像,所以我写了这个,为什么我在尝试时失败了?
我可以编译它,但是当我imshow(“V”,V);时我不能执行它;

 #include <opencv2/opencv.hpp>
  using namespace cv;
    int main(){
    Mat image;
    Mat V;
   namedWindow( "Gray image", 2 );
     while(1){
 image = imread( "d://Gaa6P.png", 1 );
        for (int r=0; r< image.rows; r++ ){
         for( int c =0;c< image.cols; c++){
            Vec3b intensity= image.at<Vec3b>(r, c);
            uchar v=intensity.val[2];
            V.at<uchar>(r,c)=v;
             }
          }
      imshow( "Gray image", image );
      imshow("V",V);
      waitKey(0);
           }
     return 0; }

谢谢,现在可以使用了。
 #include <opencv2/opencv.hpp>
 using namespace cv;
 int main(){
 Mat image;
 Mat V;
 namedWindow( "Gray image", 2 );
while(1){
image = imread( "d://Gaa6P.png", 1 );
cvtColor(image,image,CV_RGB2HSV);
V.create(image.rows,image.cols,CV_8UC1);
    for (int r=0; r< image.rows; r++ ){
     for( int c =0;c< image.cols; c++){
        Vec3b intensity= image.at<Vec3b>(r, c);
        uchar v=intensity.val[0];
        V.at<uchar>(r,c)=v;
         }
      }
  imshow( "Gray image", image );
  imshow("V",V);
  waitKey(0);
       }
  return 0; }

最佳答案

您无法通过编写V-channel直接获得float v=intensity[2];中的值,因为intensityVec3f类型。

因此,如果要访问V-channel中的强度值,请使用以下命令:

float v=intensity.val[2];

那就是你的代码中的问题。

其次是,我建议您使用<uchar>
Vec3b intensity= HSV.at<Vec3b>(r, c);
然后执行类型转换将值转换为float,即
float v= (float) intensity.val[2];

关于opencv - 仅在HSV系统中访问V channel ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21961301/

10-11 01:53