【发布时间】:2017-10-29 11:09:37
【问题描述】:
我想将图像拆分为 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 的 cmets 和 @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
}
[更新]
我努力解决另一个问题,这个问题也作为副作用解决了。请参阅下面的答案。
【问题讨论】:
-
opencv 文档说:“在函数的第一个变体中,数组的数量必须与 src.channels() 匹配;如果需要,数组本身会被重新分配。”在调用 split 之前,您是否尝试过
channels.resize(srcHSV.channels())? -
@nowaqq 谢谢你的指点。我刚才试了
channels.resized(srcHSV.channels()) before calling split,channels现在只包含三个元素,但是每个元素仍然是一个很奇怪的对象dims,'rows'和cols都等于0,而data一个坏指针.这意味着我不能使用channels或任何频道。 -
另外,由于 split 需要一个指针,我认为你应该传递 &channels[0] 而不是 vector。
-
如果 srcHSV 不为空,您的代码应该可以正常工作。你能检查你的openCV安装吗?你可以尝试不同的openCV版本吗?你可以试试 cv::split 吗?也许您的环境中有多个名称拆分的函数?