【问题标题】:opencv split hsv imagesopencv split hsv 图片
【发布时间】: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 splitchannels现在只包含三个元素,但是每个元素仍然是一个很奇怪的对象dims,'rows'和cols都等于0,而data一个坏指针.这意味着我不能使用channels 或任何频道。
  • 另外,由于 split 需要一个指针,我认为你应该传递 &channels[0] 而不是 vector。
  • 如果 srcHSV 不为空,您的代码应该可以正常工作。你能检查你的openCV安装吗?你可以尝试不同的openCV版本吗?你可以试试 cv::split 吗?也许您的环境中有多个名称拆分的函数?

标签: c++ opencv


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    解决方案似乎与这个问题无关,但确实解决了问题!
    由于我正在调试我的图像处理代码,我的解决方案配置是debug 和平台win32,但是当我配置我的项目时,为了使其“更兼容”,我添加了发布和调试库路径,并添加了两个libs 的版本作为依赖,例如 opencv_calib3d2412.lib(发布版本库)和 opencv_calib3d2412d.lib(调试版本库)。简而言之,我按照this question on SO设置了opencv+vs2008+(C++项目)。顺便说一句,该问题描述中的第 7 步确实具有误导性。或者,也许我误解了它。在我从依赖项中删除发布库路径并发布版本库后,它运行良好。
    错误的配置会导致除了我上面描述的问题之外的另一个问题。窗口的标题显示了一些奇怪的字符。为了解决这个问题,solution here 把我从所有奇怪的事情中解救了出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2022-08-16
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多