2015-07-02 81 views
0

我使用的OpenCV Java库和我做一些图像匹配和对象检测通过计算单应性矩阵和perspecive转化。 在运行时我的系统崩溃和我rceive的贴在下面的错误信息,我不知道这是什么意思,以及如何因为当你在下面看到它,它说Assertion failed (count >= 4) in cvFindHomography解决它,它是不明确cvFindHomography引发错误

请看看下面的代码,显示如何计算单应矩阵

代码

MatOfPoint2f objPointMat = new MatOfPoint2f(); 
       MatOfPoint2f scenePointMat = new MatOfPoint2f(); 

       objPointMat.fromList(objPoint); 
       scenePointMat.fromList(scenePoint); 

       H = Calib3d.findHomography(objPointMat, scenePointMat, Calib3d.RANSAC, 3); 

       if (H != null) { 
        if (!H.empty()) { 
         double det = Core.determinant(H); 

         if (det > 0.09) { 
          this.validHMatrix = true; 
          Log.D(TAG, "descriptorMatcher", this.token+"_valid HMatrix, det(H): "+det); 
         } else { 
          this.validHMatrix = false; 
          Log.D(TAG, "descriptorMatcher", this.token+"_invalid HMatrix, det(H): "+det); 
         } 

         Mat objCorners = new Mat(4, 1, CvType.CV_32FC2); 
         Mat sceneCorners = new Mat(4, 1, CvType.CV_32FC2); 

         objCorners.put(0, 0, new double[] {0, 0});//top left 
         objCorners.put(1, 0, new double[] {this.obj.cols(), 0});//top right 
         objCorners.put(2, 0, new double[] {this.obj.cols(), this.obj.rows()});//bottom right 
         objCorners.put(3, 0, new double[] {0, this.obj.rows()});//bottom left. 

         Core.perspectiveTransform(objCorners, sceneCorners, H);// the values inside sceneCorners matrix changes after this line as it is what this function returns. 

         if (!sceneCorners.empty()) { 
          double p10 = sceneCorners.get(0, 0)[0] + this.obj.cols(); 
          double p11 = sceneCorners.get(0, 0)[1];// + matFactory.getMatAt(0).cols(); 

          double p20 = sceneCorners.get(1, 0)[0] + this.obj.cols(); 
          double p21 = sceneCorners.get(1, 0)[1];// + matFactory.getMatAt(0).cols() ; 

          double p30 = sceneCorners.get(2, 0)[0] + this.obj.cols(); 
          double p31 = sceneCorners.get(2, 0)[1];// + matFactory.getMatAt(0).rows(); 

          double p40 = sceneCorners.get(3, 0)[0] + this.obj.cols(); 
          double p41 = sceneCorners.get(3, 0)[1];// + matFactory.getMatAt(0).rows(); 

          Point p1 = new Point(p10, p11); 
          Point p2 = new Point(p20, p21); 
          Point p3 = new Point(p30, p31); 
          Point p4 = new Point(p40, p41); 

          Core.line(goodMatchesImage, p1, p2, new Scalar(0, 0, 255), 4); 
          Core.line(goodMatchesImage, p2, p3, new Scalar(0, 255, 0), 4); 
          Core.line(goodMatchesImage, p3, p4, new Scalar(255, 0, 0), 4); 
          Core.line(goodMatchesImage, p4, p1, new Scalar(255, 255, 255), 4); 

控制台错误

OpenCV Error: Assertion failed (count >= 4) in cvFindHomography, file ..\..\..\..\opencv\modules\calib3d\src\fundam.cpp, line 235 
    java.util.concurrent.ExecutionException: CvException [org.opencv.core.CvException: cv::Exception: ..\..\..\..\opencv\modules\calib3d\src\fundam.cpp:235: error: (-215) count >= 4 in function cvFindHomography 
    ] 
     at java.util.concurrent.CompletableFuture.reportGet(Unknown Source) 
     at java.util.concurrent.CompletableFuture.get(Unknown Source) 
     at com.example.foa17_nolog.Performance.compSIFT(Performance.java:116) 
     at com.example.foa17_nolog.Performance.compRep(Performance.java:86) 
     at com.example.foa17_nolog.Performance.<init>(Performance.java:60) 
     at com.example.foa17_nolog.MainClass$PerfMeasure.get(MainClass.java:216) 
     at com.example.foa17_nolog.MainClass$PerfMeasure.get(MainClass.java:1) 
     at java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
     at java.lang.Thread.run(Unknown Source) 

回答

3

要检测单应性,您需要给函数至少4个“好”的点。正在发生的事情是,你给函数的图像没有至少4个好点来计算单应性,这就是为什么你得到错误。因此,要解决这个错误,您必须找到一种方法来获取更多优点或编写一个if语句,当图像有4个优点时才调用findHomography。

+0

你是说我要检查“objPointMat”的大小吗?如果它比1X4大,那么它应该没问题? – user2121

+1

如果'objPoint'是Point2f或某种列表的向量,您可以检查该列表或向量的大小,如果大于等于4,则应该没问题。 – ksivakumar

+0

我还有一个问题,请问对象的大小和场景的大小有什么关系吗?因为我是一个300x300的扫描仪,我裁剪它从50x50区域,当我做了匹配,我发现“objPoinList.size和scenPointList.size <4”... – user2121