如何将OpenCV C++中Mat与阈值比较的MatExpr语句转译为EmguCV C#
OpenCV C++转EmguCV C#:阈值处理逻辑实现
先澄清原代码的真实逻辑
你之前对原代码的理解有误,OpenCV C++里Mat和整数比较的结果不是保留原像素,而是生成二值图:
- 当
threshold < 128时,所有小于阈值的像素会被设为255,大于等于阈值的设为0 - 当
threshold >= 128时,所有大于阈值的像素会被设为255,小于等于阈值的设为0
EmguCV C#的实现代码
EmguCV没有直接的Mat与整数的运算符重载,但可以用CvInvoke.Compare方法实现逐元素比较,完全复现原逻辑:
public Mat EqualizeHistogram(Mat img, int threshold) { using Mat gray = new Mat(); using Mat equalized = new Mat(); // 转灰度图 CvInvoke.CvtColor(img, gray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray); // 直方图均衡化 CvInvoke.EqualizeHist(gray, equalized); Mat result = new Mat(); if (threshold < 128) { // 实现 equalized < threshold 的逻辑 CvInvoke.Compare(equalized, new Scalar(threshold), result, Emgu.CV.CvEnum.CmpType.CvCmpLess); } else { // 实现 equalized > threshold 的逻辑 CvInvoke.Compare(equalized, new Scalar(threshold), result, Emgu.CV.CvEnum.CmpType.CvCmpGreater); } return result; }
关键说明
CvInvoke.Compare的第四个参数指定比较规则:CvCmpLess对应<,CvCmpGreater对应>- 比较后自动生成二值Mat,行为和C++里的
MatExpr完全一致 - 用
using块管理临时Mat对象,避免内存泄漏
内容的提问来源于stack exchange,提问作者uygur
相关产品推荐
相关产品推荐

