using UnityEngine; using UnityEngine.SceneManagement; using System.Collections; using OpenCVForUnity.CoreModule; using OpenCVForUnity.MlModule; using OpenCVForUnity.ImgprocModule; using OpenCVForUnity.UnityUtils; namespace OpenCVForUnityExample { /// /// SVM Example /// An example of find a separating straight line using the Support Vector Machines (SVM). /// Referring to http://docs.opencv.org/3.1.0/d1/d73/tutorial_introduction_to_svm.html#gsc.tab=0. /// public class SVMExample : MonoBehaviour { // Use this for initialization void Start () { // Data for visual representation int width = 512, height = 512; Mat image = Mat.zeros (height, width, CvType.CV_8UC4); // Set up training data int[] labels = { 1, -1, -1, -1 }; float[] trainingData = { 501, 10, 255, 10, 501, 255, 10, 501 }; Mat trainingDataMat = new Mat (4, 2, CvType.CV_32FC1); trainingDataMat.put (0, 0, trainingData); Mat labelsMat = new Mat (4, 1, CvType.CV_32SC1); labelsMat.put (0, 0, labels); // Train the SVM SVM svm = SVM.create (); svm.setType (SVM.C_SVC); svm.setKernel (SVM.LINEAR); svm.setTermCriteria (new TermCriteria (TermCriteria.MAX_ITER, 100, 1e-6)); svm.train (trainingDataMat, Ml.ROW_SAMPLE, labelsMat); // Show the decision regions given by the SVM byte[] green = { 0, 255, 0, 255 }; byte[] blue = { 0, 0, 255, 255 }; for (int i = 0; i < image.rows (); ++i) for (int j = 0; j < image.cols (); ++j) { Mat sampleMat = new Mat (1, 2, CvType.CV_32FC1); sampleMat.put (0, 0, j, i); float response = svm.predict (sampleMat); if (response == 1) image.put (i, j, green); else if (response == -1) image.put (i, j, blue); } // Show the training data int thickness = -1; int lineType = 8; Imgproc.circle (image, new Point (501, 10), 5, new Scalar (0, 0, 0, 255), thickness, lineType, 0); Imgproc.circle (image, new Point (255, 10), 5, new Scalar (255, 255, 255, 255), thickness, lineType, 0); Imgproc.circle (image, new Point (501, 255), 5, new Scalar (255, 255, 255, 255), thickness, lineType, 0); Imgproc.circle (image, new Point (10, 501), 5, new Scalar (255, 255, 255, 255), thickness, lineType, 0); // Show support vectors thickness = 2; lineType = 8; Mat sv = svm.getUncompressedSupportVectors (); // Debug.Log ("sv.ToString() " + sv.ToString ()); // Debug.Log ("sv.dump() " + sv.dump ()); for (int i = 0; i < sv.rows (); ++i) { Imgproc.circle (image, new Point ((int)sv.get (i, 0) [0], (int)sv.get (i, 1) [0]), 6, new Scalar (128, 128, 128, 255), thickness, lineType, 0); } Texture2D texture = new Texture2D (image.width (), image.height (), TextureFormat.RGBA32, false); Utils.matToTexture2D (image, 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"); } } }