OpenCV cvtColor 也修改原始图像
OpenCV cvtColor modifies original image too
我有一个函数可以获取图像,将其转换为 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;
}
您的 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
函数的情况下测试它(仅显示原始图像)?
如果你想保持创建 windows 一段时间,请使用此代码代替 waitKey(0);
:
while(waitKey(100) != 'q')
{
//all imshow calls
}
现在,当您想要退出时,只需按 'q'(您需要激活其中一个应用 windows)。
我有一个函数可以获取图像,将其转换为 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;
}
您的 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
函数的情况下测试它(仅显示原始图像)?如果你想保持创建 windows 一段时间,请使用此代码代替
waitKey(0);
:while(waitKey(100) != 'q') { //all imshow calls }
现在,当您想要退出时,只需按 'q'(您需要激活其中一个应用 windows)。