0

Я использую opencv java library, и я делаю некоторое сопоставление изображений и обнаружение объектов, вычисляя матрицу гомографии и персистентную трансформацию. во время выполнения я крах системы и я 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, который вызывает только findHomography, когда изображение имеет 4 хорошие точки.

+0

Вы имеете в виду, что я хочу проверить размер «objPointMat»? и если он больше, чем 1X4, тогда это должно быть хорошо? – user2121

+1

Если «objPoint» - это вектор Point2f или какой-то список, вы можете просто проверить размер этого списка или вектора, а если он равен или больше 4, это должно быть хорошо. – ksivakumar

+0

У меня есть еще один вопрос, пожалуйста, есть ли какое-либо отношение между размером объекта и размером сцены? потому что у меня есть scne 300x300, и я обрезал из него область 50x50, и когда я сделал сопоставление, я обнаружил, что «objPoinList.size и scenPointList.size <4» ... – user2121