在OpenCv Mat中箝位值的最有效方法

Most efficient way to clamp values in an OpenCv Mat

本文关键字:有效 方法 OpenCv Mat      更新时间:2023-10-16

我有一个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来避免分裂。我不确定阈值代码是否支持COI。

您可能想要分析两个版本并比较它们的性能。我有一种感觉,它会做同样的事情。