using UnityEngine; using UnityEngine.SceneManagement; using System.Collections.Generic; using OpenCVForUnity.CoreModule; using OpenCVForUnity.ImgprocModule; using OpenCVForUnity.UnityUtils; namespace OpenCVForUnityExample { /// /// ConnectedComponents Example /// An example of Connected-component labeling using the Imgproc.connectedComponentsWithStats function. /// Referring to http://qiita.com/wakaba130/items/9d921b8b3eb812e4f197. /// public class ConnectedComponentsExample : MonoBehaviour { // Use this for initialization void Start() { Texture2D imgTexture = Resources.Load("matchshapes") as Texture2D; Mat srcMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC1); Utils.texture2DToMat(imgTexture, srcMat); Debug.Log("srcMat.ToString() " + srcMat.ToString()); Mat dstMat = new Mat(srcMat.size(), CvType.CV_8UC3); // labeling Mat labels = new Mat(); Mat stats = new Mat(); Mat centroids = new Mat(); int total = Imgproc.connectedComponentsWithStats(srcMat, labels, stats, centroids); Debug.Log("labels.ToString() " + labels.ToString()); Debug.Log("stats.ToString() " + stats.ToString()); Debug.Log("centroids.ToString() " + centroids.ToString()); Debug.Log("total " + total); // determine drawing color List colors = new List(total); colors.Add(new Scalar(0, 0, 0)); for (int i = 1; i < total; ++i) { colors.Add(new Scalar(Random.Range(0, 255), Random.Range(0, 255), Random.Range(0, 255))); } // draw labels for (int i = 0; i < dstMat.rows(); ++i) { for (int j = 0; j < dstMat.cols(); ++j) { Scalar color = colors[(int)labels.get(i, j)[0]]; dstMat.put(i, j, color.val[0], color.val[1], color.val[2]); } } // draw rectangle for (int i = 1; i < total; ++i) { int x = (int)stats.get(i, Imgproc.CC_STAT_LEFT)[0]; int y = (int)stats.get(i, Imgproc.CC_STAT_TOP)[0]; int height = (int)stats.get(i, Imgproc.CC_STAT_HEIGHT)[0]; int width = (int)stats.get(i, Imgproc.CC_STAT_WIDTH)[0]; OpenCVForUnity.CoreModule.Rect rect = new OpenCVForUnity.CoreModule.Rect(x, y, width, height); Imgproc.rectangle(dstMat, rect.tl(), rect.br(), new Scalar(0, 255, 0), 2); } // draw centroids for (int i = 1; i < total; ++i) { int x = (int)centroids.get(i, 0)[0]; int y = (int)centroids.get(i, 1)[0]; Imgproc.circle(dstMat, new Point(x, y), 3, new Scalar(255, 0, 0), -1); } // draw index of label for (int i = 1; i < total; ++i) { int x = (int)stats.get(i, Imgproc.CC_STAT_LEFT)[0]; int y = (int)stats.get(i, Imgproc.CC_STAT_TOP)[0]; Imgproc.putText(dstMat, "" + i, new Point(x + 5, y + 15), Imgproc.FONT_HERSHEY_COMPLEX, 0.5, new Scalar(255, 255, 0), 2); } Texture2D texture = new Texture2D(dstMat.cols(), dstMat.rows(), TextureFormat.RGBA32, false); Utils.matToTexture2D(dstMat, texture); gameObject.GetComponent().material.mainTexture = texture; } // Update is called once per frame void Update() { } /// /// Raises the back button click event. /// public void OnBackButtonClick() { SceneManager.LoadScene("OpenCVForUnityExample"); } } }