C++ opencv copyTo() 函数的执行中断
Posted
技术标签:
【中文标题】C++ opencv copyTo() 函数的执行中断【英文标题】:Execution breaks at C++ opencv copyTo() function 【发布时间】:2014-07-19 10:07:52 【问题描述】:我的目标是在我需要关闭它时沿边界用零填充我的分段图像(用于填充前景中的小孔)。这里tmp
是从我的图像frame
获得的CV_8UC3 分割图像Mat
,其中我的所有背景像素都已被涂黑。我已经从 tmp 手动创建了一个二进制掩码并将其存储在Mat bM
中,它与我的图像Mat frame
的大小和类型相同。
Mat bM = Mat::zeros(frame.rows, frame.cols, CV_8UC1);
for(i=0;i<frame.rows;i++)
for(j=0;j<frame.cols;j++)
if(tmp.at<Vec3b>(i,j)[0] != 0 && tmp.at<Vec3b>(i,j)[1] != 0 && tmp.at<Vec3b>(i,j)[0] != 0)
bM.at<uchar>(i,j) = 255;
Mat padded;
int padding = 6;
padded.create(bM.rows + 2*padding, bM.cols + 2*padding, bM.type());
padded.setTo(Scalar::all(0));
bM.copyTo(padded(Rect(padding, padding, bM.rows, bM.cols)));
我的执行在 Visual Studio 的最后一行中断,出现以下错误:
Assertion failed <0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0<=roi.height && roi.y+roi.height <=m.rows>
虽然我理解这意味着什么,但我无法弄清楚为什么它会抛出这个错误,因为我的源图像在我的目标图像的范围内。我已经逐步完成了我的代码,并且确信它会在该特定行中断。
根据我的阅读,可以给 cv::Rect 构造函数提供偏移量,就像我通过偏移量padding
和padding
一样,这些偏移量取自图像的左上角。可以这样使用copyTo函数吗?还是我的错误在别处?
【问题讨论】:
【参考方案1】:CV::Rect 构造函数不同于 CV::Mat 构造函数。
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
cv::Rect 参数在 x 中偏移,在 y 中偏移,然后是宽度,最后是高度。
所以当你这样做时:
bM.copyTo(padded(Rect(padding, padding, bM.rows, bM.cols)));
您创建一个宽度为 bM.rows 和高度为 bM.cols 的 cv::Rect。这与您需要的相反。 将其更改为:
bM.copyTo(padded(Rect(padding, padding, bM.cols, bM.rows)));
【讨论】:
这确实是个错误。我误解了 Rect 构造函数的定义。谢谢!以上是关于C++ opencv copyTo() 函数的执行中断的主要内容,如果未能解决你的问题,请参考以下文章
opencv4opencv教程 C++ 4Mat对象(深拷贝:clone()copyTo(),create()创建图片,zeros()eye()初始化空白图像,Scalar()创建向量)