我只想显示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; }
答案 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吗?