OpenCV圈检测C#实现

时间:2015-07-09 14:32:11

标签: c# opencv unity3d hough-transform

我需要任何C#和OpenCV专家的帮助,以使我的圈子检测脚本更准确。

在OpenCV中,圆圈检测是通过称为HoughCircles算法或框架的方式完成的 http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

我正在使用OpenCV的C#包装器(用于Unity)
OpenCVforUnity HughCircles
而这又直接基于OpenCV的官方java包装器。

我的圈子检测代码如下(当然没有OpenCv依赖性) 我还附上了2张图片,以便您查看结果。 需要做哪些改进才能改善结果?我还包括原始的2张图片供参考。

using UnityEngine;
using System.Collections;
using System;
using OpenCVForUnity;


public class HoughCircleSample : MonoBehaviour{
    Point pt;
    // Use this for initialization
    void Start ()
            {
                        Texture2D imgTexture = Resources.Load ("balls2_bw") as Texture2D;

                        Mat imgMat = new Mat (imgTexture.height, imgTexture.width, CvType.CV_8UC3);

                        Utils.texture2DToMat (imgTexture, imgMat);
                        //Debug.Log ("imgMat dst ToString " + imgMat.ToString ());

                        Mat grayMat = new Mat ();
                        Imgproc.cvtColor (imgMat, grayMat, Imgproc.COLOR_RGB2GRAY);

                        Imgproc.Canny (grayMat, grayMat, 50, 200);

                         Mat circles = new Mat();    
     int minRadius = 0;
       int maxRadius = 0;

        // Apply the Hough Transform to find the circles

        Imgproc.HoughCircles(grayMat, circles, Imgproc.CV_HOUGH_GRADIENT, 3, grayMat.rows() / 8, 200, 100, minRadius, maxRadius);

       Debug.Log ("circles toString " + circles.ToString ());
        Debug.Log ("circles dump" + circles.dump ());

        if (circles.cols() > 0)
        for (int x = 0; x < Math.Min(circles.cols(), 10); x++)

        {
                double[] vCircle = circles.get(0, x);

                if (vCircle == null)
                    break;

                pt = new Point(Math.Round(vCircle[0]), Math.Round(vCircle[1]));
                int radius = (int)Math.Round(vCircle[2]);
                // draw the found circle  
                Core.circle(imgMat, pt, radius, new Scalar(255, 0, 0), 1);

            }


 Texture2D texture = new Texture2D (imgMat.cols (), imgMat.rows (), TextureFormat.RGBA32, false);
                        Utils.matToTexture2D (imgMat, texture);

                        gameObject.GetComponent<Renderer> ().material.mainTexture = texture;

                }

        }

circle detection sample 1

circle detection sample 2

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:2)

此代码使用C ++编写,但您可以轻松转换为C#。

我需要将param2的{​​{1}}更改为200,结果是:

HoughCircle

  

圆的累加器阈值在检测阶段居中。它越小,可以检测到更多的假圆圈。将首先返回与较大累加器值对应的圆圈。

您也不应该使用&#34; Canny-ed&#34;提供HoughCircles(grayMat, circles, CV_HOUGH_GRADIENT, 3, grayMat.rows / 8, 200, 200, 0, 0); 。图像,因为已经处理好了。使用HoughCircles而不应用Canny边缘检测步骤。

结果如下所示。由于光线条件的原因,第二个更棘手。

enter image description here

enter image description here

这是整个代码。同样,它是C ++,但可能有用作参考。

grayMat

答案 1 :(得分:1)

在第四个参数中,您设置了3,但是大多数图像的比率接近1,这可能是一个可能的改进,您还必须在参数6和7中尝试另一组值,因为这值取决于canny edge detector提取的轮廓,我希望这可以帮助你。

答案 2 :(得分:1)

我现在越来越近,每个球对象有2个重叠的圆圈。如果我能纠正这个问题,它基本上就解决了。

Imgproc.Canny (grayMat, grayMat, 500, 200);

Mat circles = new Mat();
int minRadius =50;
int maxRadius = 200;

Imgproc.HoughCircles(grayMat, circles, Imgproc.CV_HOUGH_GRADIENT, 1, grayMat.rows() / 4, 1000, 1, minRadius, maxRadius);![solution3][1]