我有一个要用于每个像素重新映射的OpenCv Mat,称为remap,它具有CV_32FC2元素。

其中一些元素可能超出了重映射的允许范围。所以我需要将它们限制在Point2f(0, 0)Point2f(w, h)之间。用OpenCv 2.x实现此目的的最短或最有效的方法是什么?

这是一种解决方案:

void clamp(Mat& mat, Point2f lowerBound, Point2f upperBound) {
    vector<Mat> matc;
    split(mat, matc);
    min(max(matc[0], lowerBound.x), upperBound.x, matc[0]);
    min(max(matc[1], lowerBound.y), upperBound.y, matc[1]);
    merge(matc, mat);
}

但是我不确定它是否最短,或者拆分/合并是否有效。

最佳答案

尝试使用cvThreshold进行拆分,然后合并。您也可以使用cvSetImageCOI避免 split 。我不确定阈值代码是否支持COI。

您可能需要分析两个版本并比较它们的性能。我觉得它会做同样的事情。

09-06 20:09