在裁剪实现中有一个断言可以防止cropRect与源图像的边缘重叠。
// Asserts that cropRect fits inside the image's bounds.
cv::Mat croppedImage = image(cropRect);
我想解除这个限制,并且能够使用位于图像外部的黑色像素来实现此目的。这可能吗?
答案 0 :(得分:0)
答案是:技术上有可能,但你真的不想这样做。您的图像周围没有“黑色像素”。你的“形象”为自己分配了足够的记忆,就是这样。因此,如果您尝试访问已分配内存之外的像素,则会出现运行时错误。如果你想要一些黑色像素,你必须按照@ffriend描述的方式自己做。 image(cropRect)没有分配任何东西,它只是创建一个已经存在的内存的新指针。
如果您仍然对如何完成此作物感到好奇,OpenCV正在执行以下操作:
// check that cropRect is inside the image
if ((cropRect & Rect(0,0,image.cols,image.rows)) != cropRect)
return -1; // some kind of error notification
// use one of Mat constructors (x, y, width and height are taken from cropRect)
Mat croppedImage(Size(width,height), image.type(), image.ptr(y)+x, image.step);
你可以跳过测试并进行初始化,但正如我所说,这是一个很好的灾难配方。