我的目标是在我需要关闭它时填充我的分割图像沿着边框用零填充(用于填充前景中的小孔)。此处tmp
是从我的图片Mat
获取的CV_8UC3分段图片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构造函数可以通过我已经通过偏移padding
和padding
的方式进行偏移,这些偏移量取自图像的左上角。 copyTo函数可以这样使用吗?或者我的错误在其他地方?
答案 0 :(得分: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)));