簡體   English   中英

C# OpenCV DrawChessboardCorners 的線條在保存圖像時是黑白的

[英]C# OpenCV DrawChessboardCorners' lines are black and white when saving image

FindCheckerBoard 方法將 BitmapSource 作為輸入,並使用 BitmapSourceConverter 將其轉換為 Mat。

然后它會經過 FindChessboardCorners 和 CornerSubPix 等過程。 使用從 CornerSubPix 中找到的點,我在原始 Mat 上使用了 DrawChessBoardCorners。

這是問題所在,也是我嘗試調試的問題。

  1. 當我使用 Cv2.ImShow() 查看圖像時,圖像具有用於棋盤格的彩色線條。
  2. 當我使用 Cv2.ImWrite() 將圖像保存為文件時,線條突然變成白線而不是彩色線。
  3. 我使用 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);

在此處輸入圖像描述

在此處輸入圖像描述

原來,從BitmapSource轉換的matSource是8UC4的MatType,而來自Imread()的python的Mat是8UC3。

通過將 8UC4 轉換為 8UC3,輸出圖像具有彩色線條。

 Cv2.CvtColor(matSource, matSource, ColorConversionCodes.BGRA2BGR);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM