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 &lt;0 &lt;= roi.x &amp;&amp; 0 &lt;= roi.width &amp;&amp; roi.x + roi.width &lt;= m.cols &amp;&amp; 0&lt;=roi.height &amp;&amp; roi.y+roi.height &lt;=m.rows&gt; 虽然我理解这意味着什么,但我无法弄清楚为什么它会抛出这个错误,因为我的源图像在我的目标图像的范围内。我已经逐步完成了我的代码,并且确信它会在该特定行中断。

根据我的阅读,可以给 cv::Rect 构造函数提供偏移量,就像我通过偏移量paddingpadding 一样,这些偏移量取自图像的左上角。可以这样使用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() 函数的执行中断的主要内容,如果未能解决你的问题,请参考以下文章

函数返回中的 OpenCV Mat 并使用 copyTo

opencv4opencv教程 C++ 4Mat对象(深拷贝:clone()copyTo(),create()创建图片,zeros()eye()初始化空白图像,Scalar()创建向量)

使用openCV copyTo函数时用255初始化矩阵?

R6010 OpenCV copyTo函数使用时所遇到错误

R6010 OpenCV copyTo函数使用时所遇到错误

copyTo和clone的区别