仅在HSV系统中访问V通道

时间:2014-02-22 22:12:06

标签: opencv

我只想显示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; }

2 个答案:

答案 0 :(得分:1)

由于V-channel属于float v=intensity[2];类型,因此您无法直接通过撰写intensity获取Vec3f中的值。

因此,如果您想在V-channel中访问强度值,请使用以下内容:

float v=intensity.val[2];

这是你代码中的问题。

其次,我建议您使用<uchar>

Vec3b intensity= HSV.at<Vec3b>(r, c);

然后进行类型转换将值转换为float,即

float v= (float) intensity.val[2];

答案 1 :(得分:0)

您正在为尚未初始化内存的图像V分配值。执行imread后你应该写:

V.create(image.size(), CV_8U);

你还确定你正在阅读的png图像是HSV格式而不是RGB吗?