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;
}
  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. 如果你想保持创建 windows 一段时间,请使用此代码代替 waitKey(0);:

    while(waitKey(100) != 'q')
    {
        //all imshow calls
    }
    

现在,当您想要退出时,只需按 'q'(您需要激活其中一个应用 windows)。