c++ - C++ opencv copyTo() 函数的执行中断

标签 c++ opencv image-processing

我的目标是在我需要关闭图像时沿边界用零填充我的分割图像(用于填充前景中的小孔)。这里tmp是 CV_8UC3 分割图像 Mat从我的图像中获得frame ,其中我所有的背景像素都被涂黑了。我已经从 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 构造函数可以按照我传递偏移量的方式给予偏移量 paddingpadding , 这些偏移量取自图像的左上角。 copyTo函数可以这么用吗?还是我的错误在别处?

最佳答案

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)));

您创建一个 cv::Rect,宽度为 bM.rows,高度为 bM.cols。这是你需要的相反。 将其更改为:

bM.copyTo(padded(Rect(padding, padding, bM.cols, bM.rows)));

关于c++ - C++ opencv copyTo() 函数的执行中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24839165/

相关文章:

c++ - 通过定制的 printf 函数跨平台打印 64 位整数

c++ - OpenCV imwrite 不工作

python - 通过使用并发 future 的多处理来运行多个视频

c# - 质量和压缩与 system.drawing.imaging 之间的区别?

android - 如何检测最大矩形轮廓内的标记黑色区域?

c++ - CMake error no CMAKE_C_COMPILER can be found using Xcode and GLFW

c++ - 指向节点的指针不更新节点属性

java - 数组类型相同,链表类型不同

objective-c - 图像特定区域的平滑

algorithm - 从给定的图像中获取 sub-cv::Mat 使得