gpt4 book ai didi

c++ - OpenCV cvtColor 也修改原始图像

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:35 24 4
gpt4 key购买 nike

我有一个函数可以获取图像,将其转换为 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 没有区别。行,因为两个数组(图像)的大小相同,但通常不要忘记这一点 :) 第二条评论不需要更多解释。

  2. 一般来说,您的代码看起来不错,在我看来它应该可以工作。您是否尝试在不调用 hsvFilter 函数(仅显示原始图像)的情况下对其进行测试?

  3. 如果您想将创建的窗口保留一段时间,请使用此代码代替 waitKey(0);:

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

现在,当您想要退出时,只需按“q”(您需要激活您的应用程序窗口之一)。

关于c++ - OpenCV cvtColor 也修改原始图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29067120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com