【Unity】OpenCV Plus Unity 霍夫圆检测实例代码-槽车(记录)

人工智能53

如下:

using UnityEngine;
using UnityEngine.UI;
using OpenCvSharp;

public class Circle_Text : MonoBehaviour
{

    //このScriptはMainCameraにアタッチしてください
    public RenderTexture renderTexture;             //mainCameraにつけるRendertexture(アタッチしてね)
    Texture2D kakunin, dstTexture;
    Camera mainCamera;
    Mat mats;

    Vector3 Circle;

    void Start()
    {
        //mainCamera = GetComponent<camera>();
        //kakunin = CreateTexture2D(renderTexture);
        //Tex2D_to_Mat_show(kakunin);
    }
    private void Update()
    {
        mainCamera = GetComponent<camera>();
        kakunin = CreateTexture2D(renderTexture);
        mats = Tex2D_to_Mat(kakunin);
        HoughCircles(mats);
    }

    /// &#x3053;&#x3053;&#x3067;Textur2D&#x306B;&#x5909;&#x63DB;&#x3057;&#x3066;&#x3044;&#x308B;&#x3088;
    ///
    /// <param name="rt">
    /// <returns></returns>
    Texture2D CreateTexture2D(RenderTexture rt)
    {
        //Texture2D&#x3092;&#x4F5C;&#x6210;
        Texture2D texture2D = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false, false);

        //subCamera&#x306B;RenderTexture&#x3092;&#x5165;&#x308C;&#x308B;
        mainCamera.targetTexture = rt;

        //&#x624B;&#x52D5;&#x3067;&#x30AB;&#x30E1;&#x30E9;&#x3092;&#x30EC;&#x30F3;&#x30C0;&#x30EA;&#x30F3;&#x30B0;&#x3057;&#x307E;&#x3059;
        mainCamera.Render();

        RenderTexture.active = rt;
        texture2D.ReadPixels(new UnityEngine.Rect(0, 0, rt.width, rt.height), 0, 0);
        texture2D.Apply();

        ////&#x5143;&#x306B;&#x623B;&#x3059;&#x5225;&#x306E;&#x30AB;&#x30E1;&#x30E9;&#x3092;&#x7528;&#x610F;&#x3057;&#x3066;&#x305D;&#x308C;&#x3092;RenderTexter&#x7528;&#x306B;&#x3059;&#x308C;&#x3070;&#x4E0B;&#x306E;&#x30B3;&#x30FC;&#x30C9;&#x306F;&#x3044;&#x3089;&#x306A;&#x3044;&#x3067;&#x3059;&#x3002;
        //mainCamera.targetTexture = null;
        //RenderTexture.active = null;
        return texture2D;
    }

    Mat Tex2D_to_Mat(Texture2D tex)
    {
        //Texture2D -> Mat
        Mat srcMat = OpenCvSharp.Unity.TextureToMat(tex);

        //Mat grayMat = new Mat();
        //Cv2.CvtColor(srcMat, grayMat, ColorConversionCodes.RGBA2GRAY);

        // Mat &#x2192; Texture2D
        //if (this.dstTexture == null)
        //{
        //    this.dstTexture = new Texture2D(grayMat.Width, grayMat.Height, TextureFormat.RGBA32, false);
        //}

        //OpenCvSharp.Unity.MatToTexture(grayMat, this.dstTexture);

        //// &#x8868;&#x793A;
        //GameObject.FindObjectOfType<rawimage>().texture = this.dstTexture;

        return srcMat;
    }
    void HoughCircles(Mat Mat)
    {
        Mat dst = new Mat();
        //1:&#x56E0;&#x4E3A;&#x970D;&#x592B;&#x5706;&#x68C0;&#x6D4B;&#x5BF9;&#x566A;&#x58F0;&#x6BD4;&#x8F83;&#x654F;&#x611F;&#xFF0C;&#x6240;&#x4EE5;&#x9996;&#x5148;&#x5BF9;&#x56FE;&#x50CF;&#x505A;&#x4E00;&#x4E2A;&#x4E2D;&#x503C;&#x6EE4;&#x6CE2;&#x6216;&#x9AD8;&#x65AF;&#x6EE4;&#x6CE2;(&#x566A;&#x58F0;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x53EF;&#x4EE5;&#x4E0D;&#x505A;)
        Mat m1 = new Mat();
        Cv2.MedianBlur(Mat, m1, 3); //  ksize&#x5FC5;&#x987B;&#x5927;&#x4E8E;1&#x4E14;&#x662F;&#x5947;&#x6570;

        //2&#xFF1A;&#x8F6C;&#x4E3A;&#x7070;&#x5EA6;&#x56FE;&#x50CF;
        Mat m2 = new Mat();
        Cv2.CvtColor(m1, m2, ColorConversionCodes.BGR2GRAY);

        //3&#xFF1A;&#x970D;&#x592B;&#x5706;&#x68C0;&#x6D4B;&#xFF1A;&#x4F7F;&#x7528;&#x970D;&#x592B;&#x53D8;&#x6362;&#x67E5;&#x627E;&#x7070;&#x5EA6;&#x56FE;&#x50CF;&#x4E2D;&#x7684;&#x5706;&#x3002;
        /*
         * &#x53C2;&#x6570;&#xFF1A;
         *      1&#xFF1A;&#x8F93;&#x5165;&#x53C2;&#x6570;&#xFF1A; 8&#x4F4D;&#x3001;&#x5355;&#x901A;&#x9053;&#x3001;&#x7070;&#x5EA6;&#x8F93;&#x5165;&#x56FE;&#x50CF;
         *      2&#xFF1A;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;&#xFF1A;&#x76EE;&#x524D;&#xFF0C;&#x552F;&#x4E00;&#x7684;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;&#x662F;HoughCirclesMethod.Gradient
         *      3: dp      :&#x7D2F;&#x52A0;&#x5668;&#x5206;&#x8FA8;&#x7387;&#x4E0E;&#x56FE;&#x50CF;&#x5206;&#x8FA8;&#x7387;&#x7684;&#x53CD;&#x6BD4;&#x3002;&#x9ED8;&#x8BA4;=1
         *      4&#xFF1A;minDist: &#x68C0;&#x6D4B;&#x5230;&#x7684;&#x5706;&#x7684;&#x4E2D;&#x5FC3;&#x4E4B;&#x95F4;&#x7684;&#x6700;&#x5C0F;&#x8DDD;&#x79BB;&#x3002;(&#x6700;&#x77ED;&#x8DDD;&#x79BB;-&#x53EF;&#x4EE5;&#x5206;&#x8FA8;&#x662F;&#x4E24;&#x4E2A;&#x5706;&#x7684;&#xFF0C;&#x5426;&#x5219;&#x8BA4;&#x4E3A;&#x662F;&#x540C;&#x5FC3;&#x5706;-                            src_gray.rows/8)
         *      5:param1:   &#x7B2C;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x7279;&#x5B9A;&#x7684;&#x53C2;&#x6570;&#x3002;[&#x9ED8;&#x8BA4;&#x503C;&#x662F;100] canny&#x8FB9;&#x7F18;&#x68C0;&#x6D4B;&#x9608;&#x503C;&#x4F4E;
         *      6:param2:   &#x7B2C;&#x4E8C;&#x4E2A;&#x65B9;&#x6CD5;&#x7279;&#x5B9A;&#x4E8E;&#x53C2;&#x6570;&#x3002;[&#x9ED8;&#x8BA4;&#x503C;&#x662F;100] &#x4E2D;&#x5FC3;&#x70B9;&#x7D2F;&#x52A0;&#x5668;&#x9608;&#x503C; &#x2013; &#x5019;&#x9009;&#x5706;&#x5FC3;
         *      7:minRadius: &#x6700;&#x5C0F;&#x534A;&#x5F84;
         *      8:maxRadius: &#x6700;&#x5927;&#x534A;&#x5F84;
         *
         */
        CircleSegment[] cs = Cv2.HoughCircles(m2, HoughMethods.Gradient, 1, 80, 70, 30, 50, 100);
        Mat.CopyTo(dst);
        // Vec3d vec = new Vec3d();
        for (int i = 0; i < cs.Length; i++)
        {
            //&#x753B;&#x5706;
            Cv2.Circle(dst, (int)cs[i].Center.X, (int)cs[i].Center.Y, (int)cs[i].Radius, new Scalar(0, 0, 255), 2, LineTypes.AntiAlias);
            //&#x52A0;&#x5F3A;&#x5706;&#x5FC3;&#x663E;&#x793A;
            Cv2.Circle(dst, (int)cs[i].Center.X, (int)cs[i].Center.Y, 3, new Scalar(0, 0, 255), 2, LineTypes.AntiAlias);
        }
        // Mat &#x2192; Texture2D
        if (this.dstTexture == null)
        {
            this.dstTexture = new Texture2D(dst.Width, dst.Height, TextureFormat.RGBA32, false);
        }

        OpenCvSharp.Unity.MatToTexture(dst, this.dstTexture);

        // &#x8868;&#x793A;
        GameObject.FindObjectOfType<rawimage>().texture = this.dstTexture;
        Cv2.WaitKey(1);

        //using (new Window("InputImage", WindowMode.AutoSize, dst))
        //{
        //    Cv2.WaitKey(1);
        //}

    }

}</rawimage></rawimage></camera></camera>

Love for Ever Day

Original: https://www.cnblogs.com/HanaKoo/p/16206780.html
Author: HanaKoo
Title: 【Unity】OpenCV Plus Unity 霍夫圆检测实例代码-槽车(记录)