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

Canny边缘检测后设置BGR(255,0,0)轮廓仍显白色的问题排查

问题分析与解决

核心问题

你用CvInvoke.Canny得到的cannyImage是单通道灰度图像(8位单通道,8UC1),而你传入的MCvScalar(255,0,0)是BGR三通道颜色值。在单通道图像上绘制时,OpenCV只会取颜色的第一个通道值(也就是255),所以轮廓会显示为白色(灰度图中255对应白色)。

解决步骤

要显示蓝色轮廓,需要先把单通道的Canny结果转换成三通道彩色图像,再在彩色图上绘制轮廓:

  1. 将单通道的cannyImage转换为三通道的BGR图像
  2. 在三通道图像上调用DrawContours,此时BGR颜色值才会生效

修改后的代码

private void Capture_ImageGrabbed1(object sender, EventArgs e)
{
    try
    {
        Mat m = new Mat();
        capture.Retrieve(m);
        pic1.Image = m.ToImage<Bgr, byte>().Bitmap;

        if(mode == 1)
        {
            var image = m.ToImage<Bgr, byte>();
            var grayScaleImage = image.Convert<Gray, byte>();
            var blurredImage = grayScaleImage.SmoothGaussian(5, 5, 0, 0);
            var cannyImage = new UMat();
            CvInvoke.Canny(blurredImage, cannyImage, 10, 50);

            // 新增:将单通道Canny图转为三通道彩色图
            var cannyColor = new UMat();
            CvInvoke.CvtColor(cannyImage, cannyColor, Emgu.CV.CvEnum.ColorConversion.Gray2Bgr);

            VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
            CvInvoke.FindContours(cannyImage, contours, null, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
            // 在三通道图上绘制轮廓,此时BGR颜色生效
            CvInvoke.DrawContours(cannyColor, contours, -1, new MCvScalar(255, 0, 0), 2);

            pic2.Image = cannyColor.Bitmap;
        }
    }
    catch (Exception)
    {
        throw;
    }
}

补充说明

  • 单通道图像只有亮度信息,没有色彩通道,所以无法显示彩色内容
  • CvtColor(cannyImage, cannyColor, Gray2Bgr)会把单通道灰度图复制到三通道的每个通道,得到一个灰度色调的彩色图,此时再绘制BGR颜色的轮廓就能正确显示蓝色

内容的提问来源于stack exchange,提问作者user20256782

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:35:18