void ComputerVisionAlgo(IntPtr greyscale) { Utils.copyToMat(greyscale, imageMat); // Inverting Image pixel values inMat = (Mat.ones(imageMat.rows(), imageMat.cols(), CvType.CV_8UC1) * 255) - imageMat; // Creating Detector (Yellow Circle) // MatOfKeyPoint keyMat = new MatOfKeyPoint(); // SimpleBlobDetector detector = SimpleBlobDetector.create(); // Creating Detector (Red Circle) MatOfKeyPoint keyMat = new MatOfKeyPoint(); SimpleBlobDetector detector = SimpleBlobDetector.create(); inMat = imageMat; detector.read(circparam_path); // Finding circles detector.detect(inMat, keyMat); if (keyMat.size().height > 0) { blob_x = keyMat.get(0, 0)[0]; blob_y = keyMat.get(0, 0)[1]; blob_r = keyMat.get(0, 0)[2]; } // Visualizing detected circles m_ImageInfo.text = string.Format("Circle Count: {0}\n Circle[0]: {1} x {2} -- {3}", keyMat.size().height, blob_x, blob_y, blob_r); Features2d.drawKeypoints(imageMat, keyMat, outMat); }
// Draw matches between two images public static Mat getMatchesImage(Mat query, Mat pattern, MatOfKeyPoint queryKp, MatOfKeyPoint trainKp, MatOfDMatch matches, int maxMatchesDrawn) { Mat outImg = new Mat(); List <DMatch> matchesList = matches.toList(); if (matchesList.Count > maxMatchesDrawn) { matchesList.RemoveRange(maxMatchesDrawn, matchesList.Count - maxMatchesDrawn); } MatOfDMatch tmpMatches = new MatOfDMatch(); tmpMatches.fromList(matchesList); Features2d.drawMatches ( query, queryKp, pattern, trainKp, tmpMatches, outImg, new Scalar(0, 200, 0, 255), Scalar.all(-1), new MatOfByte() ); return(outImg); }
void getKeyPoints(Mat matImg) { keyPix.Clear(); submats.Clear(); MatOfKeyPoint keypts = new MatOfKeyPoint(); Mat hierarchy = new Mat(); blobber.detect(matImg, keypts); // Debug.Log("key points are " + keypts.size()); Mat imgWithKeyPts = new Mat(); Features2d.drawKeypoints(matImg, keypts, imgWithKeyPts, new Scalar(255, 255, 255), 4); Texture2D matToText = new Texture2D(imgWithKeyPts.cols(), imgWithKeyPts.rows(), TextureFormat.RGBA32, false); KeyPoint[] keyPtArray = keypts.toArray(); for (int i = 0; i < keyPtArray.Length; i++) { //keyPix.Add(Camera.main.ScreenToWorldPoint(new Vector3((float)keyPtArray[i].pt.x, (float)keyPtArray[i].pt.y), Camera.MonoOrStereoscopicEye.Mono)); keyPix.Add(new Vector3((float)keyPtArray[i].pt.x, (float)keyPtArray[i].pt.y, keyPtArray[i].size)); //keyPix3.Add(Camera.main.ScreenToViewportPoint(new Vector3((int)keyPtArray[i].pt.x, (int)keyPtArray[i].pt.y, 0))); } // disposal Destroy(matToText); imgWithKeyPts.Dispose(); keypts.Dispose(); hierarchy.Dispose(); }
// Use this for initialization void Start() { Texture2D imgTexture = Resources.Load("detect_blob") as Texture2D; Mat imgMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC1); Utils.texture2DToMat(imgTexture, imgMat); Debug.Log("imgMat dst ToString " + imgMat.ToString()); Mat outImgMat = new Mat(); FeatureDetector blobDetector = FeatureDetector.create(FeatureDetector.SIMPLEBLOB); blobDetector.read(Utils.getFilePath("blobparams.yml")); MatOfKeyPoint keypoints = new MatOfKeyPoint(); blobDetector.detect(imgMat, keypoints); Features2d.drawKeypoints(imgMat, keypoints, outImgMat); Texture2D texture = new Texture2D(outImgMat.cols(), outImgMat.rows(), TextureFormat.RGBA32, false); Utils.matToTexture2D(outImgMat, texture); gameObject.GetComponent <Renderer> ().material.mainTexture = texture; }
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); adapter = new TabsAdapter(this, SupportFragmentManager); pager = FindViewById <ViewPager>(Resource.Id.viewpager); var tabs = FindViewById <TabLayout>(Resource.Id.tabs); pager.Adapter = adapter; tabs.SetupWithViewPager(pager); pager.OffscreenPageLimit = 3; pager.PageSelected += (sender, args) => { var fragment = adapter.InstantiateItem(pager, args.Position) as IFragmentVisible; fragment?.BecameVisible(); }; Toolbar.MenuItemClick += (sender, e) => { var intent = new Intent(this, typeof(AddItemActivity));; StartActivity(intent); }; SupportActionBar.SetDisplayHomeAsUpEnabled(false); SupportActionBar.SetHomeButtonEnabled(false); var src = new Mat[2]; var dst = new Mat[2]; var keyPoints1 = new MatOfKeyPoint(); var keyPoints2 = new MatOfKeyPoint(); var descripter1 = new Mat(); var descripter2 = new Mat(); var dmatch = new MatOfDMatch(); var output = new Mat(); src[0] = Imgcodecs.Imread("path/to/source/1.png"); src[1] = Imgcodecs.Imread("path/to/source/2.png"); dst[0] = new Mat(); dst[1] = new Mat(); Imgproc.CvtColor(src[0], dst[0], Imgproc.COLORBayerGR2GRAY); Imgproc.CvtColor(src[1], dst[1], Imgproc.COLORBayerGR2GRAY); var akaze = FeatureDetector.Create(FeatureDetector.Akaze); var executor = DescriptorExtractor.Create(DescriptorExtractor.Akaze); akaze.Detect(dst[0], keyPoints1); akaze.Detect(dst[1], keyPoints2); executor.Compute(dst[0], keyPoints1, descripter1); executor.Compute(dst[1], keyPoints2, descripter2); var matcher = DescriptorMatcher.Create(DescriptorMatcher.BruteforceHamming); matcher.Match(descripter1, descripter2, dmatch); Features2d.DrawMatches(src[0], keyPoints1, src[1], keyPoints2, dmatch, output); }
// Use this for initialization void Start() { Texture2D imgTexture = Resources.Load("lena") as Texture2D; Mat img1Mat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC3); Utils.texture2DToMat(imgTexture, img1Mat); Debug.Log("img1Mat dst ToString " + img1Mat.ToString()); Mat img2Mat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC3); Utils.texture2DToMat(imgTexture, img2Mat); Debug.Log("img2Mat dst ToString " + img2Mat.ToString()); float angle = UnityEngine.Random.Range(0, 360), scale = 1.0f; Point center = new Point(img2Mat.cols() * 0.5f, img2Mat.rows() * 0.5f); Mat affine_matrix = Imgproc.getRotationMatrix2D(center, angle, scale); Imgproc.warpAffine(img1Mat, img2Mat, affine_matrix, img2Mat.size()); FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB); MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); Mat descriptors1 = new Mat(); detector.detect(img1Mat, keypoints1); extractor.compute(img1Mat, keypoints1, descriptors1); MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); Mat descriptors2 = new Mat(); detector.detect(img2Mat, keypoints2); extractor.compute(img2Mat, keypoints2, descriptors2); DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); MatOfDMatch matches = new MatOfDMatch(); matcher.match(descriptors1, descriptors2, matches); Mat resultImg = new Mat(); Features2d.drawMatches(img1Mat, keypoints1, img2Mat, keypoints2, matches, resultImg); Texture2D texture = new Texture2D(resultImg.cols(), resultImg.rows(), TextureFormat.RGBA32, false); Utils.matToTexture2D(resultImg, texture); gameObject.GetComponent <Renderer> ().material.mainTexture = texture; }
// Update is called once per frame void Update() { if (webCamTextureToMatHelper.IsPlaying() && webCamTextureToMatHelper.DidUpdateThisFrame()) { Mat rgbaMat = webCamTextureToMatHelper.GetMat(); Imgproc.cvtColor(rgbaMat, rgbMat, Imgproc.COLOR_RGBA2RGB); detector.detect(rgbaMat, keypoints); // Debug.Log ("keypoints.ToString() " + keypoints.ToString()); Features2d.drawKeypoints(rgbMat, keypoints, rgbaMat, Scalar.all(-1), Features2d.NOT_DRAW_SINGLE_POINTS); Imgproc.rectangle(rgbaMat, patternRect.tl(), patternRect.br(), new Scalar(255, 0, 0, 255), 5); Utils.matToTexture2D(rgbaMat, texture, webCamTextureToMatHelper.GetBufferColors()); } }
// Detects Corners with Detector Framework and Draws Keypoints to outMat void CornerDetection() { // Creating Detector int octaves = 6; float corner_thresh = 0.015f; float dog_thresh = 0.015f; int max_detections = 5; HarrisLaplaceFeatureDetector detector = HarrisLaplaceFeatureDetector.create( octaves, corner_thresh, dog_thresh, max_detections); // Finding corners // imageMat = cached_initMat; Core.flip(cached_initMat, imageMat, 0); keyMat = new MatOfKeyPoint(); detector.detect(imageMat, keyMat); // Draw corners Features2d.drawKeypoints(imageMat, keyMat, outMat); }
// Detects Blobs with Detector Framework and stores Top-down view into cached_homoMat void BlobDetection() { SimpleBlobDetector detector = SimpleBlobDetector.create(); Core.flip(cached_initMat, imageMat, 0); keyMat = new MatOfKeyPoint(); detector.detect(imageMat, keyMat); Features2d.drawKeypoints(imageMat, keyMat, outMat); if (keyMat.rows() < 7) { return; } for (int i = 0; i < 7; i++) { srcPointArray[i] = new Point(keyMat.get(i, 0)[0], keyMat.get(i, 0)[1]); } SortBox(); }
private void Run() { //if true, The error log of the Native side OpenCV will be displayed on the Unity Editor Console. Utils.setDebugMode(true); Texture2D imgTexture = Resources.Load("detect_blob") as Texture2D; Mat imgMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC1); Utils.texture2DToMat(imgTexture, imgMat); Debug.Log("imgMat.ToString() " + imgMat.ToString()); Mat outImgMat = new Mat(); SimpleBlobDetector blobDetector = SimpleBlobDetector.create(); Debug.Log("blobDetector.getDefaultName() " + blobDetector.getDefaultName()); blobDetector.read(blobparams_yml_filepath); MatOfKeyPoint keypoints = new MatOfKeyPoint(); blobDetector.detect(imgMat, keypoints); Features2d.drawKeypoints(imgMat, keypoints, outImgMat); Texture2D texture = new Texture2D(outImgMat.cols(), outImgMat.rows(), TextureFormat.RGBA32, false); Utils.matToTexture2D(outImgMat, texture); gameObject.GetComponent <Renderer>().material.mainTexture = texture; Utils.setDebugMode(false); }
void ComputerVisionAlgo(IntPtr greyscale) { Utils.copyToMat(greyscale, imageMat); // Creating Detector (Red Circle) MatOfKeyPoint keyMat = new MatOfKeyPoint(); HarrisLaplaceFeatureDetector detector = HarrisLaplaceFeatureDetector.create(6, 0.015f, 0.015f, 5); // Finding circles Debug.Log(keyMat.size()); detector.detect(imageMat, keyMat); if (keyMat.size().height > 0) { double blob_x = keyMat.get(0, 0)[0]; double blob_y = keyMat.get(0, 0)[1]; double blob_r = keyMat.get(0, 0)[2]; } // Visualizing detected circles // m_ImageInfo.text = string.Format("Circle Count: {0}\n Circle[0]: {1} x {2} -- {3}", // keyMat.size().height, blob_x, blob_y, blob_r); Features2d.drawKeypoints(imageMat, keyMat, outMat); }
private void TryProcessImage(int index) { if (UseWebCam == false) { CurrentTexture = Sources[index]; } else { CurrentTexture = webCamTexture; } using (Mat imgMat = new Mat(CurrentTexture.height, CurrentTexture.width, CvType.CV_8UC1)) using (FeatureDetector blobDetector = FeatureDetector.create(FeatureDetector.SIMPLEBLOB)) using (Mat outImgMat = new Mat()) using (MatOfKeyPoint keypoints = new MatOfKeyPoint()) { if (CurrentTexture is Texture2D) { Utils.texture2DToMat(CurrentTexture as Texture2D, imgMat); } else if (CurrentTexture is WebCamTexture) { Utils.webCamTextureToMat(CurrentTexture as WebCamTexture, imgMat); } else { Utils.textureToMat(CurrentTexture, imgMat); } Debug.Log("imgMat dst ToString " + imgMat.ToString()); Imgproc.threshold(imgMat, imgMat, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); Imgproc.erode(imgMat, imgMat, erodeMat, new Point(1, 1), 5); blobDetector.read(Utils.getFilePath("blobparams.yml")); blobDetector.detect(imgMat, keypoints); Features2d.drawKeypoints(imgMat, keypoints, outImgMat); KeyPoint[] points = keypoints.toArray(); ProcessKeyPoints(points, outImgMat); Mat finalMat = outImgMat; if (texture != null && (texture.width != finalMat.cols() || texture.height != finalMat.rows())) { DestroyImmediate(texture); texture = null; } if (texture == null) { texture = new Texture2D(finalMat.cols(), finalMat.rows(), TextureFormat.RGBA32, false); } Utils.matToTexture2D(finalMat, texture); gameObject.GetComponent <Renderer>().material.mainTexture = texture; } }
public bool descriptorsORB_Old(Mat RGB, Mat cameraFeed, string targetName)//找出特徵的顏色方法三(可運行但效率不佳放棄) { if (RGB == null) { Debug.Log("RGB Mat is Null"); return(false); } //將傳入的RGB存入Src Mat SrcMat = new Mat(); RGB.copyTo(SrcMat); //比對樣本 Texture2D imgTexture = Resources.Load(targetName) as Texture2D; // Texture2D imgTexture2 = Resources.Load("lenaK") as Texture2D; //Texture2D轉Mat Mat img1Mat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC3); Utils.texture2DToMat(imgTexture, img1Mat); //創建 ORB的特徵點裝置 FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB); //產生存放特徵點Mat MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); Mat descriptors1 = new Mat(); MatOfKeyPoint keypointsSrc = new MatOfKeyPoint(); Mat descriptorsSrc = new Mat(); //找特徵點圖1 detector.detect(img1Mat, keypoints1); extractor.compute(img1Mat, keypoints1, descriptors1); //找特徵點圖Src detector.detect(SrcMat, keypointsSrc); extractor.compute(SrcMat, keypointsSrc, descriptorsSrc); DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); MatOfDMatch matches = new MatOfDMatch(); matcher.match(descriptors1, descriptorsSrc, matches); DMatch[] arrayDmatch = matches.toArray(); for (int i = arrayDmatch.Length - 1; i >= 0; i--) { // Debug.Log("match " + i + ": " + arrayDmatch[i].distance); } //做篩選 double max_dist = 0; double min_dist = 100; //-- Quick calculation of max and min distances between keypoints double dist = new double(); for (int i = 0; i < matches.rows(); i++) { dist = arrayDmatch[i].distance; if (dist < min_dist) { min_dist = dist; } if (dist > max_dist) { max_dist = dist; } } Debug.Log("Max dist :" + max_dist); Debug.Log("Min dist :" + min_dist); //只畫好的點 List <DMatch> matchesGoodList = new List <DMatch>(); for (int i = 0; i < matches.rows(); i++) { //if (arrayDmatch[i].distance < RateDist.value * min_dist) //{ // //Debug.Log("match " + i + ": " + arrayDmatch[i].distance); // matchesGoodList.Add(arrayDmatch[i]); //} } MatOfDMatch matchesGood = new MatOfDMatch(); matchesGood.fromList(matchesGoodList); //Draw Keypoints Features2d.drawKeypoints(SrcMat, keypointsSrc, SrcMat); //做輸出的轉換予宣告 Mat resultImg = new Mat(); // Features2d.drawMatches(img1Mat, keypoints1, SrcMat, keypointsSrc, matchesGood, resultImg); List <Point> P1 = new List <Point>(); // List<Point> P2 = new List<Point>(); List <Point> pSrc = new List <Point>(); Debug.Log("MatchCount" + matchesGoodList.Count); for (int i = 0; i < matchesGoodList.Count; i++) { P1.Add(new Point(keypoints1.toArray()[matchesGoodList[i].queryIdx].pt.x, keypoints1.toArray()[matchesGoodList[i].queryIdx].pt.y)); pSrc.Add(new Point(keypointsSrc.toArray()[matchesGoodList[i].trainIdx].pt.x, keypointsSrc.toArray()[matchesGoodList[i].trainIdx].pt.y)); //Debug.Log("ID = " + matchesGoodList[i].queryIdx ); //Debug.Log("x,y =" + (int)keypoints1.toArray()[matchesGoodList[i].queryIdx].pt.x + "," + (int)keypoints1.toArray()[matchesGoodList[i].queryIdx].pt.y); //Debug.Log("x,y =" + (int)keypoints2.toArray()[matchesGoodList[i].trainIdx].pt.x + "," + (int)keypoints2.toArray()[matchesGoodList[i].trainIdx].pt.y); } MatOfPoint2f p2fTarget = new MatOfPoint2f(P1.ToArray()); MatOfPoint2f p2fSrc = new MatOfPoint2f(pSrc.ToArray()); Mat matrixH = Calib3d.findHomography(p2fTarget, p2fSrc, Calib3d.RANSAC, 3); List <Point> srcPointCorners = new List <Point>(); srcPointCorners.Add(new Point(0, 0)); srcPointCorners.Add(new Point(img1Mat.width(), 0)); srcPointCorners.Add(new Point(img1Mat.width(), img1Mat.height())); srcPointCorners.Add(new Point(0, img1Mat.height())); Mat originalRect = Converters.vector_Point2f_to_Mat(srcPointCorners); List <Point> srcPointCornersEnd = new List <Point>(); srcPointCornersEnd.Add(new Point(0, img1Mat.height())); srcPointCornersEnd.Add(new Point(0, 0)); srcPointCornersEnd.Add(new Point(img1Mat.width(), 0)); srcPointCornersEnd.Add(new Point(img1Mat.width(), img1Mat.height())); Mat changeRect = Converters.vector_Point2f_to_Mat(srcPointCornersEnd); Core.perspectiveTransform(originalRect, changeRect, matrixH); List <Point> srcPointCornersSave = new List <Point>(); Converters.Mat_to_vector_Point(changeRect, srcPointCornersSave); if ((srcPointCornersSave[2].x - srcPointCornersSave[0].x) < 5 || (srcPointCornersSave[2].y - srcPointCornersSave[0].y) < 5) { Debug.Log("Match Out Put image is to small"); SrcMat.copyTo(cameraFeed); SrcMat.release(); Imgproc.putText(cameraFeed, "X-S", new Point(10, 50), 0, 1, new Scalar(255, 255, 255), 2); return(false); } // Features2d.drawMatches(img1Mat, keypoints1, SrcMat, keypointsSrc, matchesGood, resultImg); Imgproc.line(SrcMat, srcPointCornersSave[0], srcPointCornersSave[1], new Scalar(255, 0, 0), 3); Imgproc.line(SrcMat, srcPointCornersSave[1], srcPointCornersSave[2], new Scalar(255, 0, 0), 3); Imgproc.line(SrcMat, srcPointCornersSave[2], srcPointCornersSave[3], new Scalar(255, 0, 0), 3); Imgproc.line(SrcMat, srcPointCornersSave[3], srcPointCornersSave[0], new Scalar(255, 0, 0), 3); SrcMat.copyTo(cameraFeed); keypoints1.release(); img1Mat.release(); SrcMat.release(); return(true); }
//============================================================ //=================以下為沒有再使用的函式===================== //============================================================ //找出特徵的顏色方法三(ORB特徵點比對) public bool descriptorsORB(Mat RGB, Mat cameraFeed, string targetName) { if (RGB == null) { Debug.Log("RGB Mat is Null"); return(false); } //將傳入的RGB存入Src Mat SrcMat = new Mat(); RGB.copyTo(SrcMat); //比對樣本載入 Texture2D imgTexture = Resources.Load(targetName) as Texture2D; //Texture2D轉Mat Mat targetMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC3); Utils.texture2DToMat(imgTexture, targetMat); //創建 ORB的特徵點裝置 FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB); //產生存放特徵點Mat MatOfKeyPoint keypointsTarget = new MatOfKeyPoint(); Mat descriptorsTarget = new Mat(); MatOfKeyPoint keypointsSrc = new MatOfKeyPoint(); Mat descriptorsSrc = new Mat(); //找特徵點圖Target detector.detect(targetMat, keypointsTarget); extractor.compute(targetMat, keypointsTarget, descriptorsTarget); //找特徵點圖Src detector.detect(SrcMat, keypointsSrc); extractor.compute(SrcMat, keypointsSrc, descriptorsSrc); //創建特徵點比對物件 DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); MatOfDMatch matches = new MatOfDMatch(); //丟入兩影像的特徵點 matcher.match(descriptorsTarget, descriptorsSrc, matches); DMatch[] arrayDmatch = matches.toArray(); //做篩選 double max_dist = 0; double min_dist = 100; //-- Quick calculation of max and min distances between keypoints double dist = new double(); for (int i = 0; i < matches.rows(); i++) { dist = arrayDmatch[i].distance; if (dist < min_dist) { min_dist = dist; } if (dist > max_dist) { max_dist = dist; } } Debug.Log("Max dist :" + max_dist); Debug.Log("Min dist :" + min_dist); List <DMatch> matchesGoodList = new List <DMatch>(); MatOfDMatch matchesGood = new MatOfDMatch(); matchesGood.fromList(matchesGoodList); //Draw Keypoints Features2d.drawKeypoints(SrcMat, keypointsSrc, SrcMat); List <Point> pTarget = new List <Point>(); List <Point> pSrc = new List <Point>(); Debug.Log("MatchCount" + matchesGoodList.Count); for (int i = 0; i < matchesGoodList.Count; i++) { pTarget.Add(new Point(keypointsTarget.toArray()[matchesGoodList[i].queryIdx].pt.x, keypointsTarget.toArray()[matchesGoodList[i].queryIdx].pt.y)); pSrc.Add(new Point(keypointsSrc.toArray()[matchesGoodList[i].trainIdx].pt.x, keypointsSrc.toArray()[matchesGoodList[i].trainIdx].pt.y)); } MatOfPoint2f p2fTarget = new MatOfPoint2f(pTarget.ToArray()); MatOfPoint2f p2fSrc = new MatOfPoint2f(pSrc.ToArray()); Mat matrixH = Calib3d.findHomography(p2fTarget, p2fSrc, Calib3d.RANSAC, 3); List <Point> srcPointCorners = new List <Point>(); srcPointCorners.Add(new Point(0, 0)); srcPointCorners.Add(new Point(targetMat.width(), 0)); srcPointCorners.Add(new Point(targetMat.width(), targetMat.height())); srcPointCorners.Add(new Point(0, targetMat.height())); Mat originalRect = Converters.vector_Point2f_to_Mat(srcPointCorners); List <Point> srcPointCornersEnd = new List <Point>(); srcPointCornersEnd.Add(new Point(0, targetMat.height())); srcPointCornersEnd.Add(new Point(0, 0)); srcPointCornersEnd.Add(new Point(targetMat.width(), 0)); srcPointCornersEnd.Add(new Point(targetMat.width(), targetMat.height())); Mat changeRect = Converters.vector_Point2f_to_Mat(srcPointCornersEnd); Core.perspectiveTransform(originalRect, changeRect, matrixH); List <Point> srcPointCornersSave = new List <Point>(); Converters.Mat_to_vector_Point(changeRect, srcPointCornersSave); if ((srcPointCornersSave[2].x - srcPointCornersSave[0].x) < 5 || (srcPointCornersSave[2].y - srcPointCornersSave[0].y) < 5) { Debug.Log("Match Out Put image is to small"); SrcMat.copyTo(cameraFeed); SrcMat.release(); Imgproc.putText(cameraFeed, targetName, srcPointCornersSave[0], 0, 1, new Scalar(255, 255, 255), 2); return(false); } //畫出框框 Imgproc.line(SrcMat, srcPointCornersSave[0], srcPointCornersSave[1], new Scalar(255, 0, 0), 3); Imgproc.line(SrcMat, srcPointCornersSave[1], srcPointCornersSave[2], new Scalar(255, 0, 0), 3); Imgproc.line(SrcMat, srcPointCornersSave[2], srcPointCornersSave[3], new Scalar(255, 0, 0), 3); Imgproc.line(SrcMat, srcPointCornersSave[3], srcPointCornersSave[0], new Scalar(255, 0, 0), 3); //畫中心 Point middlePoint = new Point((srcPointCornersSave[0].x + srcPointCornersSave[2].x) / 2, (srcPointCornersSave[0].y + srcPointCornersSave[2].y) / 2); Imgproc.line(SrcMat, middlePoint, middlePoint, new Scalar(0, 0, 255), 10); SrcMat.copyTo(cameraFeed); keypointsTarget.release(); targetMat.release(); SrcMat.release(); return(true); }
public void processFrame() { if (inversion) { //flip Core.bitwise_not(toneMat, toneMat); } if (resize) { Imgproc.resize(toneMat, toneMat, new Size((int)Math.Round(resizeRatio * toneMat.width()), (int)Math.Round(resizeRatio * toneMat.height()))); } // if (toneThreshold) { Imgproc.threshold(toneMat, toneMat, thresholdValue, 255, Imgproc.THRESH_BINARY); } if (blobs) { blobDetector.detect(toneMat, keypoints); Features2d.drawKeypoints(toneMat, keypoints, toneMat); } if (blur) { Imgproc.blur(toneMat, toneMat, new Size(blurSize, blurSize)); } if (centerPoint) { moments.Add(Imgproc.moments(toneMat, true)); WeightedCentroid.Add(new Point((int)Math.Round(moments[0].m10 / moments[0].m00), (int)Math.Round(moments[0].m01 / moments[0].m00))); Debug.Log("center: " + WeightedCentroid[0].x + ", " + WeightedCentroid[0].y); } if (edge) { Imgproc.Canny(toneMat, toneMat, thresholdValue * 0.5, thresholdValue); //Imgproc.findContours (toneMat, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE ); // // foreach(MatOfPoint i in contours){ // Debug.Log ("contour " + i + ": " + i.ToString()); // } //Debug.Log ("contours count: " + contours.Count); moments.Add(Imgproc.moments(toneMat, true)); if (WeightedCentroid.Count == 0) { moments.Add(Imgproc.moments(toneMat, true)); WeightedCentroid.Add(new Point(0, 0)); } WeightedCentroid.Add(new Point((int)Math.Round(moments[1].m10 / moments[1].m00), (int)Math.Round(moments[1].m01 / moments[1].m00))); if (thresholdValue >= thresholdValueCap && edgeCenterPoint == true) { Imgproc.ellipse(toneMat, WeightedCentroid [1], new Size(20, 20), 1, 0.1, 360, new Scalar(180), 10); Imgproc.putText(toneMat, " Edge center point", WeightedCentroid [1], 0, 1.5, new Scalar(180), 5); } } //draw center if (centerPoint) { Imgproc.ellipse(toneMat, WeightedCentroid [0], new Size(20, 20), 1, 0.1, 360, new Scalar(180), 10); Imgproc.putText(toneMat, " Tone center point", WeightedCentroid [0], 0, 1.5, new Scalar(180), 5); } if (resize) { Imgproc.resize(toneMat, toneMat, new Size((int)Math.Round((1 / resizeRatio) * toneMat.width()), (int)Math.Round((1 / resizeRatio) * toneMat.height()))); } //assign to display if (showProcessing) { rgbaMat = toneMat; } else { rgbaMat = cloneMat; } WeightedCentroid.Clear(); moments.Clear(); contours.Clear(); framesDropCount = 0; }
private void Update() { inputMat = webCamTextureToMatHelper.GetMat(); MatOfKeyPoint camKeyPoints = new MatOfKeyPoint(); Mat camDescriptors = new Mat(); Imgproc.cvtColor(inputMat, grayMat, Imgproc.COLOR_BGR2GRAY); detector.detect(grayMat, camKeyPoints); extractor.compute(grayMat, camKeyPoints, camDescriptors); if (camKeyPoints.toList().Count < 1) { return; } List <MatOfDMatch> matches = new List <MatOfDMatch>(); matcher.knnMatch(makerDescriptors, camDescriptors, matches, 2); //-- Filter matches using the Lowe's ratio test float ratioThresh = 0.75f; List <DMatch> listOfGoodMatches = new List <DMatch>(); for (int i = 0; i < matches.Count; i++) { if (matches[i].rows() > 1) { DMatch[] dMatches = matches[i].toArray(); if (dMatches[0].distance < ratioThresh * dMatches[1].distance) { listOfGoodMatches.Add(dMatches[0]); } } } MatOfDMatch goodMatches = new MatOfDMatch(); goodMatches.fromList(listOfGoodMatches); //-- Draw matches Mat resultImg = new Mat(); Features2d.drawMatches(makerMat, makerKeyPoints, grayMat, camKeyPoints, goodMatches, resultImg); //listOfGoodMatches = goodMatches.toList(); ////-- Localize the object //List<Point> obj = new List<Point>(); //List<Point> scene = new List<Point>(); //List<KeyPoint> listOfKeypointsObject = makerKeyPoints.toList(); //List<KeyPoint> listOfKeypointsScene = camKeyPoints.toList(); //for (int i = 0; i < listOfGoodMatches.Count(); i++) //{ // //-- Get the keypoints from the good matches // obj.Add(listOfKeypointsObject[listOfGoodMatches[i].queryIdx].pt); // scene.Add(listOfKeypointsScene[listOfGoodMatches[i].trainIdx].pt); //} //MatOfPoint2f objMat = new MatOfPoint2f(); //MatOfPoint2f sceneMat = new MatOfPoint2f(); //objMat.fromList(obj); //sceneMat.fromList(scene); //double ransacReprojThreshold = 3.0; //Mat H = Calib3d.findHomography(objMat, sceneMat, Calib3d.RANSAC, ransacReprojThreshold); ////-- Get the corners from the image_1 ( the object to be "detected" ) //Mat objCorners = new Mat(4, 1, CvType.CV_32FC2); //Mat sceneCorners = new Mat(); //float[] objCornersData = new float[(int)(objCorners.total() * objCorners.channels())]; //objCorners.get(0, 0, objCornersData); //objCornersData[0] = 0; //objCornersData[1] = 0; //objCornersData[2] = makerMat.cols(); //objCornersData[3] = 0; //objCornersData[4] = makerMat.cols(); //objCornersData[5] = makerMat.rows(); //objCornersData[6] = 0; //objCornersData[7] = makerMat.rows(); //objCorners.put(0, 0, objCornersData); //Core.perspectiveTransform(objCorners, sceneCorners, H); //byte[] sceneCornersData = new byte[(int)(sceneCorners.total() * sceneCorners.channels())]; //sceneCorners.get(0, 0, sceneCornersData); ////-- Draw lines between the corners (the mapped object in the scene - image_2 ) //Imgproc.line(resultImg, new Point(sceneCornersData[0] + makerMat.cols(), sceneCornersData[1]), // new Point(sceneCornersData[2] + makerMat.cols(), sceneCornersData[3]), new Scalar(0, 255, 0), 4); //Imgproc.line(resultImg, new Point(sceneCornersData[2] + makerMat.cols(), sceneCornersData[3]), // new Point(sceneCornersData[4] + makerMat.cols(), sceneCornersData[5]), new Scalar(0, 255, 0), 4); //Imgproc.line(resultImg, new Point(sceneCornersData[4] + makerMat.cols(), sceneCornersData[5]), // new Point(sceneCornersData[6] + makerMat.cols(), sceneCornersData[7]), new Scalar(0, 255, 0), 4); //Imgproc.line(resultImg, new Point(sceneCornersData[6] + makerMat.cols(), sceneCornersData[7]), // new Point(sceneCornersData[0] + makerMat.cols(), sceneCornersData[1]), new Scalar(0, 255, 0), 4); if (!first) { texture = new Texture2D(resultImg.cols(), resultImg.rows(), TextureFormat.RGBA32, false); dstQuad.GetComponent <Renderer>().material.mainTexture = texture; first = true; } Utils.matToTexture2D(resultImg, texture); }
void Orb() { p1Mat = Imgcodecs.imread(Application.dataPath + "/Textures/1.jpg", 1); p2Mat = Imgcodecs.imread(Application.dataPath + "/Textures/3.jpg", 1); Imgproc.cvtColor(p1Mat, p1Mat, Imgproc.COLOR_BGR2RGB); Imgproc.cvtColor(p2Mat, p2Mat, Imgproc.COLOR_BGR2RGB); Imgproc.resize(p2Mat, p2Mat, new Size(p1Mat.width(), p1Mat.height())); Debug.Log(p2Mat); /* * //仿射变换(矩阵旋转) * float angle = UnityEngine.Random.Range(0, 360), scale = 1.0f; * Point center = new Point(img2Mat.cols() * 0.5f, img2Mat.rows() * 0.5f); * * Mat affine_matrix = Imgproc.getRotationMatrix2D(center, angle, scale); * Imgproc.warpAffine(img1Mat, img2Mat, affine_matrix, img2Mat.size()); * * Texture2D texture = new Texture2D(img2Mat.cols(), img2Mat.rows()); * Utils.matToTexture2D(img2Mat, texture); * outputRawImage.texture = texture; */ ORB detector = ORB.create(); ORB extractor = ORB.create(); //提取图一特征点 MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); Mat descriptors1 = new Mat(); detector.detect(p1Mat, keypoints1); extractor.compute(p1Mat, keypoints1, descriptors1); //提取图二特征点 MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); Mat descriptors2 = new Mat(); detector.detect(p2Mat, keypoints2); extractor.compute(p2Mat, keypoints2, descriptors2); //第一次匹配结果(密密麻麻) DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); MatOfDMatch matches = new MatOfDMatch(); matcher.match(descriptors1, descriptors2, matches); //筛选(非官方) //计算向量距离的最大值/最小值 double max_dist = 0; double min_dist = 15; //通过距离控制需要的特征。 //(设到10,最终只有2个耳朵匹配。。。) //(设到15,尾巴也开始匹配。。。。。。) //新建两个容器存放筛选样本 List <DMatch> matchesArray = matches.toList(); //用Unity版API多转一步 //Debug.Log(matchesArray.Count); //500 List <DMatch> goodmatchesArray = new List <DMatch>(); //Debug.Log(img1Mat.rows()); //512 for (int i = 0; i < matchesArray.Count; i++) { Debug.Log("[" + i + "]" + matchesArray[i].distance); if (matchesArray[i].distance > max_dist) { //max_dist = matchesArray[i].distance; } if (matchesArray[i].distance < min_dist) { min_dist = matchesArray[i].distance; } } //Debug.Log("The max distance is: " + max_dist); Debug.Log("The min distance is: " + min_dist); for (int i = 0; i < matchesArray.Count; i++) { if (matchesArray[i].distance < 2 * min_dist) // { goodmatchesArray.Add(matchesArray[i]); } } MatOfDMatch newMatches = new MatOfDMatch(); newMatches.fromList(goodmatchesArray); Debug.Log(newMatches.toList().Count); //第二次筛选后符合的 //绘制第二次筛选结果 dstMat = new Mat(); Features2d.drawMatches(p1Mat, keypoints1, p2Mat, keypoints2, newMatches, dstMat); Texture2D t2d = new Texture2D(dstMat.width(), dstMat.height()); Utils.matToTexture2D(dstMat, t2d); Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero); m_dstImage.sprite = sp; m_dstImage.preserveAspect = true; }