我想将图像分成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
的值。它由许多元素组成,但每个元素都是一个未知的对象
我看到一篇文章谈论类似的问题,但没有答案。 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
}
[更新]
我努力解决另一个问题,这个问题也解决了副作用。请参阅下面的答案。
答案 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使我摆脱了所有奇怪的事情。