OpenCV cvtColor也修改了原始图像

时间:2015-03-15 22:48:14

标签: c++ opencv rgb hsv

我有一个拍摄图像的功能,将其转换为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;
}

1 个答案:

答案 0 :(得分:1)

  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.colsimg.rows / result.colsresult.rows没有区别,因为两个数组(图像)的大小相同,但一般情况下别忘了:)第二条评论不再需要解释了。

  2. 一般来说,你的代码看起来很好,在我看来它应该可行。您是否尝试过不调用hsvFilter函数进行测试(只显示原始图像)?

  3. 如果您希望将创建的窗口保留一段时间,请使用此代码而不是waitKey(0);

    while(waitKey(100) != 'q')
    {
        //all imshow calls
    }
    
  4. 现在,当您想要退出时,只需按“q”(您需要激活其中一个应用程序窗口)。