Mat OpenCV Rect ROI:访问冲突

Posted

技术标签:

【中文标题】Mat OpenCV Rect ROI:访问冲突【英文标题】:Mat OpenCV Rect ROI: access violation 【发布时间】:2014-01-21 17:38:05 【问题描述】:

我是 OpenCV 图像处理的新手。我的任务很简单。我必须得到图像的 1/4(下 1/4)。图像大小为 320 x 240。我在 Mat 对象中使用了 ROI Rect 来获取它。

Mat img_roi;
img_roi= image(cv::Rect(0,180,320,240));

我收到以下错误:

first.exe 中 0x7669c41f 处的第一次机会异常:Microsoft C++ 异常:cv::Exception >在内存位置 0x0041ec30.. first.exe 中 0x7669c41f 处未处理的异常:Microsoft C++ 异常:cv::Exception at >memory location 0x0041ec30..

如果我在上面的代码中指定Rect(0,0,320,60),我会得到结果(上半部分)并且代码适用于其他一些值,例如Rect (0,0,320,240),即完整图像。但不适用于较低的季度值 (0,180,320,240)。

我还应该告诉我,我通过使用Iplimage 得到了结果。只有Mat 对象会产生问题。

如果有人能指导我解决这个问题,我将非常感激。

【问题讨论】:

【参考方案1】:

图片的下 1/4 为 Rect(0,180,320,60)。不是Rect(0,180, 320, 240),也不是Rect(0,0,320,60)

【讨论】:

非常感谢迈克尔·伯迪诺夫。有效。重要的是,我理解我的错误。我想知道,它是如何与 Iplimage 一起工作的? 不客气。至于为什么它与 IplImage 一起工作,我认为你得到的异常是由 OpenCV 本身抛出的,即 Mat 构造函数在完整性检查时失败。我不确定 IplImage 是否执行了相同的完整性检查。访问未分配的内存总是不好的,但并不总是会产生异常。 非常感谢您的解释。【参考方案2】:

cv::Rect 的参数是:

cvRect(int x, int y, int width, int height);

这里的 x 和 Y 代表左上角,而宽度和高度代表您想要在图像中包含的列数和行数。

在你的情况下:rows = 320, cols =240

所以要获得左下角,请使用:

Rect( 0, image.rows/2, image.cols/2, image.rows/2 )

如果您想要右下图像,请使用:

Rect( image.cols/2, image.rows/2, image.cols/2, image.rows/2 )

【讨论】:

以上是关于Mat OpenCV Rect ROI:访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

关于opencv中cv::Mat设置roi

opencv入门之二感兴趣区域ROI,线性混合addWeighted

[C++][转载]opencv截取图像中某一区域的方法

Opencv比较矩形

如何在opencv2中手动编写Roi函数

请问大虾们,opencv如何只对图像选择区域提取特征点