我需要任何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;
}
}
答案 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边缘检测步骤。
结果如下所示。由于光线条件的原因,第二个更棘手。
这是整个代码。同样,它是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]