我有一个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);
}
但我不确定它是否是最短的,或者split/merge是否有效率。
struct IplImage
和cv::Mat
的底层存储是相同的,因此您可以在两者之间进行相对较小的开销转换。这将使您的代码更加丑陋,但如果使用COI而不是拆分可以完成工作,则可能值得这样做。 - mpenkov