我的代码工作良好,但是当它提取关键点时,它匹配的两个图像差.
在这里你可以找到我的代码,但是我不知道如何在JAVA Android中绘制出很好的匹配
在这里你可以找到我的代码,但是我不知道如何在JAVA Android中绘制出很好的匹配
descriptors = new Mat(); keypoints = new MatOfKeyPoint(); detector = FeatureDetector.create(FeatureDetector.ORB); detector.detect(img1,keypoints); descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB); descriptor.compute(img1,keypoints,descriptors); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); ColorDetection.cvt_YUVtoRGBtoHSV(mYuv,mGraySubmat); MatOfKeyPoint mKeyPoints = new MatOfKeyPoint(); MatOfDMatch matches = new MatOfDMatch(); detector.detect(mGraySubmat,mKeyPoints); descriptor.compute(mGraySubmat,mKeyPoints,mIntermediateMat); matcher.match(mIntermediateMat,descriptors,matches); mIntermediateMat2.create(resultSize,CvType.CV_8UC1); Features2d.drawMatches(img1,mGraySubmat,matches,mIntermediateMat2,GREEN,RED,MATCH_MASK,Features2d.NOT_DRAW_SINGLE_POINTS); Imgproc.resize(mIntermediateMat2,mRgba.size()); Imgproc.cvtColor(mIntermediateMat2,mRgba,Imgproc.COLOR_RGBA2BGRA,4); Utils.matToBitmap(mRgba,bmp); DMatch dm[] = matches.toArray(); List<Point> lp1 = new ArrayList<Point>(dm.length); List<Point> lp2 = new ArrayList<Point>(dm.length); KeyPoint tkp[] = keypoints.toArray(); KeyPoint qkp[] = mKeyPoints.toArray(); for (int i = 0; i < dm.length; i++) { DMatch dma = dm[i]; lp1.add(tkp[dma.trainIdx].pt); lp2.add(qkp[dma.queryIdx].pt); } MatOfPoint2f pointsPrev = new MatOfPoint2f(lp1.toArray(new Point[0])); MatOfPoint2f pointsAct = new MatOfPoint2f(lp2.toArray(new Point[0])); Log.i("pointsPrev",pointsPrev.size().toString()); Log.i("pointsAct",pointsAct.size().toString()); fundamental_matrix.create(resultSize,CvType.CV_8UC1); fundamental_matrix = Calib3d.findFundamentalMat( pointsAct,pointsPrev,Calib3d.FM_RANSAC,3,0.99);
任何建议?
编辑:
我无法将比赛转换成列表!因为Feature2d.drawMatches()
需要一个MatOfDmatch而不是List< Dmatch>
MatOfDMatch matches,matches12,matches21; matcher.match( descriptors1,descriptors2,matches12 ); matcher.match( descriptors2,descriptors1,matches21 ); iterate matches12 DMatch forward = matches12[i]; DMatch backward = matches21[forward.trainIdx]; if( backward.trainIdx == forward.queryIdx ) //add forward to matches Features2d.drawMatches(img1,mIntermediateMat2);
解决方法
你的代码应该是这样的:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);; DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); //first image Mat img1 = Highgui.imread("<image1 path>"); Mat descriptors1 = new Mat(); MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); detector.detect(img1,keypoints1); descriptor.compute(img1,keypoints1,descriptors1); //second image Mat img2 = Highgui.imread("<image2 path>"); Mat descriptors2 = new Mat(); MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); detector.detect(img2,keypoints2); descriptor.compute(img2,keypoints2,descriptors2); //matcher should include 2 different image's descriptors MatOfDMatch matches = new MatOfDMatch(); matcher.match(descriptors1,matches); //feature and connection colors Scalar RED = new Scalar(255,0); Scalar GREEN = new Scalar(0,255,0); //output image Mat outputImg = new Mat(); MatOfByte drawnMatches = new MatOfByte(); //this will draw all matches,works fine Features2d.drawMatches(img1,img2,outputImg,drawnMatches,Features2d.NOT_DRAW_SINGLE_POINTS);
Mat featuredImg = new Mat(); Scalar kpColor = new Scalar(255,159,10);//this will be color of keypoints //featuredImg will be the output of first image Features2d.drawKeypoints(img1,featuredImg,kpColor,0); //featuredImg will be the output of first image Features2d.drawKeypoints(img1,0);
那么你可以显示这样的匹配点:
Bitmap imageMatched = Bitmap.createBitmap(outputImg.cols(),outputImg.rows(),Bitmap.Config.RGB_565);//need to save bitmap Utils.matToBitmap(outputImg,imageMatched); ImageView.setImageBitmap(imageMatched);
最终你可以实现好的比赛.我希望this thread将会有所帮助.