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:访问冲突的主要内容,如果未能解决你的问题,请参考以下文章