opencv split hsv images

时间:2017-10-29 11:09:37

标签: c++ opencv

我想将图像分成h,s和v通道。但每次都会出现错误,原因似乎是 opencv split函数无法正常运行

我的代码:

Mat src, srcHSV;
Mat srcH;
vector<Mat> channels;
VideoCapture cap(0);
for(int frame = 0; ; frame++)
{
    cap >> src;

    imshow("camera image", src);
    cvWaitKey(1);

    cvtColor(src, srcHSV, CV_BGR2HSV);
    imshow("hsv image", srcHSV);
    cvWaitKey(1);

    split(srcHSV, channels);
    srcH =  channels[0];
    ...  //do something with srcH
}

相机图片和hsv图片都可以。但是当它执行srcH = channels[0]时,会显示一条错误消息:

Unhandled exception at 0x012d1602 in xxx.exe: 0xC0000005: Access violation reading location 0x00000014.

我在这里设置断点并检查channels的值。它由许多元素组成,但每个元素都是一个未知的对象 channels 我看到一篇文章谈论类似的问题,但没有答案。 split image to 3 channels opencv error

[解决]
根据@nowaqq的评论和@Andrey Smorodov的回答,我的代码现在看起来像这样:

for(int frame =0 ; ; frame ++)
  {
    vector<Mat> channels; //put the channels declaration inside the for-loop

    cap >> src;

    imshow("camera image", src);
    cvWaitKey(1);
    srcHSV = Mat::zeros(Size(src.rows, src.cols), CV_8UC3);
    cvtColor(src, srcHSV, CV_BGR2HSV);
    imshow("hsv image", srcHSV);
    cvWaitKey(1);

    channels.clear();
    channels.resize(srcHSV.channels());  //resize channels
    cv::split(srcHSV, &channels[0]);  //&channels[0] instead of channels as the second parameter to split function
    srcH = channels[0];
    ...//do something with srcH
 }

[更新]
我努力解决另一个问题,这个问题也解决了副作用。请参阅下面的答案。

2 个答案:

答案 0 :(得分:1)

将通道声明放入循环中,拆分似乎将越来越多的Mat推入向量,并且这些Mats在下一次迭代中会被破坏。或者在使用拆分之前每次清洁它。

答案 1 :(得分:0)

解决方案似乎与这个问题无关,但确实解决了这个问题! 由于我正在调试我的图像处理代码,因此我的解决方案配置为debug和平台win32,但在我配置项目时,为了使其更加兼容&#34;,我添加了发布和调试libs路径,并添加了两个版本的lib作为依赖项,例如,opencv_calib3d2412.lib(发行版本库)和opencv_calib3d2412 d .lib(调试版本库)。简而言之,我在this question on SO之后设置了opencv + vs2008 +(C ++项目)。顺便说一下,问题描述中的第7步确实是误导性的。或许我误解了它。删除版本库路径并从依赖项中释放版本库后,它运行良好 错误的配置导致另一个问题,除了我上面描述的问题。窗口的标题显示了一些奇怪的特征。为了解决这个问题,solution here使我摆脱了所有奇怪的事情。