我有一个拍摄图像的功能,将其转换为HSV,并将V设置为100.但是,它似乎也会修改原始图像。
Mat hsvfilter(const Mat& img) {
Mat result;
cvtColor(img, result, CV_BGR2HSV);
for (int j = 0; j < img.rows; j++)
for (int i = 0; i < img.cols; i++)
result.at<Vec3d>(i, j)[2] = 100;
return result;
}
以下是我的称呼方式:
Mat original = imread( "pic.png" );
Mat converted = hsvfilter(original);
namedWindow( "original", CV_WINDOW_AUTOSIZE );
imshow( "original", original );
namedWindow( "converted", CV_WINDOW_AUTOSIZE );
imshow( "converted", converted );
waitKey(0);
原始图像和转换后的图像最终都有奇怪的黑色竖条。我相信我的代码有一些指针或内存的问题,但我无法弄清楚在哪里。任何帮助将不胜感激。
编辑:这里是固定代码
Mat hsvfilter(const Mat& img) {
Mat result;
cvtColor(img, result, CV_BGR2HSV);
for (int j = 0; j < result.rows; j++) {
for (int i = 0; i < result.cols; i++) {
result.at<cv::Vec3b>(j, i)[2] = 100;
}
}
return result;
}
答案 0 :(得分:1)
您的hsvFilter函数应如下所示:
Mat hsvfilter(const Mat& img) {
Mat result;
cvtColor(img, result, CV_BGR2HSV);
for (int j = 0; j < result.rows; j++) //you are modyfying "result" object, not img
for (int i = 0; i < result.cols; i++) //same as above
result.at<Vec3d>(j, i)[2] = 100; //OpenCV uses (y,x) indexing
return result;
}
在这种情况下,使用img.cols
,img.rows
/ result.cols
,result.rows
没有区别,因为两个数组(图像)的大小相同,但一般情况下别忘了:)第二条评论不再需要解释了。
一般来说,你的代码看起来很好,在我看来它应该可行。您是否尝试过不调用hsvFilter
函数进行测试(只显示原始图像)?
如果您希望将创建的窗口保留一段时间,请使用此代码而不是waitKey(0);
:
while(waitKey(100) != 'q')
{
//all imshow calls
}
现在,当您想要退出时,只需按“q”(您需要激活其中一个应用程序窗口)。