C++ 在OpenCv Mat中钳制值的最有效方法

C++ 在OpenCv Mat中钳制值的最有效方法,c++,opencv,image-processing,clamp,C++,Opencv,Image Processing,Clamp,我有一个OpenCvMat,我将使用它进行每像素重映射,称为remap,它有CV\u 32FC2元素 其中一些元素可能超出了重新映射允许的范围。所以我需要将它们夹在点2f(0,0)和点2f(w,h)之间。使用OpenCv 2.x实现这一点的最短或最有效的方法是什么 这里有一个解决方案: void clamp(Mat& mat, Point2f lowerBound, Point2f upperBound) { vector<Mat> matc; split(m

我有一个OpenCv
Mat
,我将使用它进行每像素重映射,称为
remap
,它有
CV\u 32FC2
元素

其中一些元素可能超出了重新映射允许的范围。所以我需要将它们夹在
点2f(0,0)
点2f(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);   
}
void-clamp(垫和垫,点2F下界,点2F上界){
向量matc;
分裂(mat、matc);
最小值(最大值(matc[0],下限.x),上限.x,matc[0]);
最小值(最大值(matc[1],下限y),上限y,matc[1]);
合并(matc、mat);
}

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

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


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

谢谢你的评论,但我不确定如何使用
阈值
比我上面用
最小值
/
最大值
更有效地进行夹紧。再看一点,代码< C++ >代码> >代码> >代码>合并> <代码>是C++代码的等价物。拆分与设置COI不同——前者实际上将数据从源移动到目标,而后者只修改图像对象标题。合并也一样。寻找避免拆分/合并的方法可能是提高性能的最佳选择。我不能保证它会更高效(你是说高效,不是有效,对吗?)——你最好的选择可能是比较不同的实现,并用更快的实现运行。是的,肯定是指“高效”而不是“有效”。感谢您澄清cvSplit/cvMerge,我一定理解了2.3 refman。我猜没有2。x的方法来做COI了吗?在手册的C++部分中似乎没有很多对COI的引用。无论是C++ COI方式都是很神秘的,或者它不存在。你仍然可以用C++代码使用旧的C接口(这有点丑,但它会起作用)。
struct IplImage
cv::Mat
的底层存储是相同的,因此您可以以相对较小的开销在两者之间进行转换。这会让你的代码更难看,但是如果使用COI而不是拆分完成了任务,那么这可能是值得的。