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

C# OpenCvSharp DrawChessboardCorners保存图像线条黑白异常

OpenCvSharp绘制棋盘格角点保存后颜色异常问题

FindCheckerBoard方法接收BitmapSource类型作为输入,通过BitmapSourceConverter将其转换为Mat格式,后续依次执行FindChessboardCorners、CornerSubPix处理流程,基于CornerSubPix输出的检测角点,在原始Mat对象上调用DrawChessBoardCorners方法绘制棋盘格标记。

调试过程中发现如下异常现象:

  • 调用Cv2.ImShow()预览图像时,棋盘格绘制线条为正常彩色
  • 调用Cv2.ImWrite()将图像保存为本地文件时,绘制线条变为白色,无彩色效果
  • 使用ImageViewer调试传入ImShow()、ImWrite()的Mat变量时,绘制线条显示为黑色

补充说明:在opencv-python中实现几乎完全一致的逻辑时,保存的图像线条为正常彩色,因此推测问题与OpenCvSharp库本身或BitmapSource输入转换环节有关。

复现代码

public int FindCheckerBoard(JObject param, BitmapSource imageSource, out BitmapSource imageResult)
{
    JObject _param = param;
    Mat matSource = OpenCvSharp.WpfExtensions.BitmapSourceConverter.ToMat(imageSource);
    Mat matResult = matSource.Clone();

    Size patternSize = new Size(4, 6);
    Size imageSize = new Size(0, 0);
    List<Mat> objectPoints = new List<Mat>();
    var objectPointsArray = Create3DChessboardCorners(patternSize, 0.02f).ToArray();
    var objectPointsMat = Mat<Point3f>.FromArray(objectPointsArray);

    imageSize.Width = matSource.Width;
    imageSize.Height = matSource.Height;
    Mat<Point2f> corner = new Mat<Point2f>();
    var ret = Cv2.FindChessboardCorners(matSource, patternSize, corner);
    if (ret)
    {
        Mat gray = new Mat();
        Point2f[] corner2 = null;
        if (matSource.Channels() >= 3)
        {
            Cv2.CvtColor(matSource, gray, ColorConversionCodes.BGR2GRAY);
            corner2 = Cv2.CornerSubPix(gray, corner.ToArray(), new OpenCvSharp.Size(11, 11), new OpenCvSharp.Size(-1, -1), TermCriteria.Both(30, 0.001));
        }
        else
        {
            corner2 = Cv2.CornerSubPix(matSource, corner.ToArray(), new OpenCvSharp.Size(11, 11), new OpenCvSharp.Size(-1, -1), TermCriteria.Both(30, 0.001));
        }

        var showPicture = _param[SHOW_PICTURE].ToObject<bool>();
        Cv2.DrawChessboardCorners(matResult, patternSize, corner2, ret);
        if (showPicture == true)
        {
            Cv2.ImShow("FindCheckerBoard", matResult);
            Cv2.ImWrite(@"C:\1.png", matResult);
            Cv2.WaitKey(0);
        }
    }
    imageResult = OpenCvSharp.WpfExtensions.BitmapSourceConverter.ToBitmapSource(matResult);
}

效果参考

ImShow预览正常彩色效果
本地保存后线条为白色效果

咨询如何配置才能保存带有彩色绘制线条的输出图像。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:45:58