You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:47:28