【问题标题】:Using OpenCV to get skeleton of an image使用 OpenCV 获取图像的骨架
【发布时间】:2018-08-19 10:28:09
【问题描述】:

我读了一篇文章,讨论如何在 C++ 中使用 OpenCV 对图像进行骨架化。 http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/

看起来不错。但我正在尝试在 Unity 中使用名为 OpenCV for Unity 的资产(OpenCV Java 3.1.0 的克隆)。
所以我尝试将代码从 C++ 移植到 C#,但失败了。
我尝试通过写出图像进行调试。原来图像是全黑的。

顺便说一句,我的用例是白色背景,我认为代码适用于黑色背景,但我用黑色背景白色形状对其进行了测试,仍然没有运气。

FML,这是我在循环中添加 imwrite 行后看到的

Mat GetSkel (Texture2D srcTexture) 
{
    Mat img = new Mat (srcTexture.height, srcTexture.width, CvType.CV_8UC1);
    Utils.texture2DToMat (srcTexture, img);
    Debug.Log ("img.ToString() " + img.ToString ());

    Imgproc.threshold (img, img, 127, 255, Imgproc.THRESH_BINARY);
    Mat skel = new Mat (srcTexture.height, srcTexture.width, CvType.CV_8UC1, new Scalar (0));
    Mat temp = new Mat();
    Mat eroded = new Mat();

    Mat element = Imgproc.getStructuringElement (Imgproc.MORPH_CROSS, new Size(3,3));

    bool done;
    do 
    {
        Imgproc.erode(img, eroded, element);
        Imgproc.dilate(eroded, temp, element);
        Core.subtract(img, temp, temp);
        Core.bitwise_or(skel, temp, skel);
        eroded.copyTo(img);

        done = (Core.countNonZero(img) == 0);
    } while (!done);

    Imgcodecs.imwrite ("/Users/fung/Documents/FYP/Future/Assets/Future -fung/img.jpg", img);

    return img;

}

【问题讨论】:

  • 请清楚地告诉我们您的问题到底是什么。见how-to-ask
  • @zwcloud 细化/骨架化算法是用 C++ 实现的(链接在顶部)。我试图将它逐行转换为 C#。但结果与那个网站完全不同。

标签: java c# c++ opencv unity3d


【解决方案1】:
private void skeleton(Mat _img)
   {
       boolean done = false;
       Mat img = _img.clone();
       CvUtilsFX.showImage(img, "tresh_1");

       Mat imgGray = new Mat();
       Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);

       Mat tresh = new Mat();
       double thresh = Imgproc.threshold(imgGray, tresh, 100, 255, Imgproc.THRESH_BINARY_INV | Imgproc.THRESH_OTSU); 
       CvUtilsFX.showImage(tresh, "tresh_1");

       Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3,3));
       Mat eroded = new Mat();
       Mat temp = new Mat();
       Mat skel = new Mat (tresh.rows(), tresh.cols(), CvType.CV_8UC1, new Scalar (0));

       int size = _img.cols() * _img.rows();
       int zeros = 0;

       while(!done)
       {
           Imgproc.erode(tresh, eroded, element);
           Imgproc.dilate(eroded, temp, element);
           Core.subtract(tresh, temp, temp);
           Core.bitwise_or(skel, temp, skel);
           eroded.copyTo(tresh);

           zeros = size - Core.countNonZero(tresh);
           if(zeros == size)
               done = true;
       }
       CvUtilsFX.showImage(skel, "Skeleton");
   }

Image

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2011-06-11
    • 2021-11-20
    • 2019-01-02
    相关资源
    最近更新 更多