【发布时间】: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函数吗?还是我的错误在别处?
【问题讨论】:
标签: c++ opencv image-processing