OpenCV复制到图像边界处剪切的ROI的规范方式

OpenCV canonical way to copy into a ROI clipped at the image borders

本文关键字:ROI 方式 复制 图像 边界 OpenCV      更新时间:2023-10-16

如果使用类似的东西

sourceMat.copyTo(destinationMat(roiRect));

roiRect具有sourceMat的大小的情况下,如果roiRect部分位于destinationMat的边界之外,则失败。

在OpenCV的无数方法中,有没有一种简单的方法可以将该副本剪辑到有效的目标区域,而无需计算源矩阵和目标矩阵的剪辑ROI?

您可以使用warpAffine并将变换矩阵设置为正确的平移。如果希望目标矩形具有不同的大小,则可以将缩放添加到变换中。

我用这个来制作二维翻译矩阵:

inline cv::Mat TranslationMat2d(const float dx, const float dy) {
    cv::Mat result = cv::Mat::eye(cv::Size(3, 3), CV_32FC1);
    result.at<float>(2, 0) = dx;
    result.at<float>(2, 1) = dy;
    return result;
}

然后使用warpAffine,类似于:

warpAffine(srcImage, dstImage, translationMat, imgSize, INTER_LINEAR, BORDER_CONSTANT, backgroundColor);