c++ - OpenCV ROI 越界 : Fill with black?

标签 c++ opencv roi

我正在使用 OpenCV 从大图像中获取小的矩形 ROI,并将 ROI 保存到文件中。有时,ROI 会超出图像范围。我需要一种方法让生成的 Mat 显示大图像中边界内的部分,并为其余部分显示黑色。

为了帮助解释,假设您有一张区域 map 图像。我知道一个人在 map 上的位置,并想在 map 上截取 500x500 像素的部分,并以他们的位置为中心。但是当用户到达 map 边缘时,这个 500x500 部分的一部分将需要“离开 map ”。所以我希望它用黑色填充。

OpenCV 最好能够通过填充黑色(就像使用 warpAffine 旋转图像时那样)优雅地处理越界 ROI(例如负左上角值)但事实似乎并非如此。对于如何实现这个目标有什么建议吗?

最佳答案

所有其他答案对我来说似乎有点太复杂了。简单地:

// Create rects representing the image and the ROI
auto image_rect = cv::Rect({}, image.size());
auto roi = cv::Rect(-50, 50, 200, 100)

// Find intersection, i.e. valid crop region
auto intersection = image_rect & roi;

// Move intersection to the result coordinate space
auto inter_roi = intersection - roi.tl();

// Create black image and copy intersection
cv::Mat crop = cv::Mat::zeros(roi.size(), image.type());
image(intersection).copyTo(crop(inter_roi));

引用图片:

enter image description here

关于c++ - OpenCV ROI 越界 : Fill with black?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017427/

相关文章:

c++ - 如何将图像中选定的矩形转换为灰度?

python - 比较裁剪的图像python opencv

c++ - 为什么当返回类型为const时可以修改返回值?

c++ - 递归 divide et impera 二进制搜索中的错误

visual-studio-2010 - 使用opencv进行阈值化

opencv - 绘制梯形 ROI OpenCV C++

c++ - Opencv Mat内存管理

c++ - 将 c++11 正确添加到 Syntastic

c++ - 如何将此代码从 Dijkstra 转换为 Astar?

带有 ROI 向量的 OpenCV Stitcher