【问题标题】:Assertion error with Android opencv when using findHomography使用 findHomography 时 Android opencv 的断言错误
【发布时间】:2013-12-03 13:51:46
【问题描述】:

我正在使用适用于 Android 的 Opencv 开发 Android 应用程序。我正在使用 ORB 检测器和蛮力匹配器从输入帧中的图像一中查找特征。这很好(我猜)接下来我想在输入帧中找到的特征周围画一个框。但这出错了,在 findHomography 调用时出错了。但我不知道为什么,在 LogCat 中,几帧后出现以下断言错误:

12-03 15:34:42.690: E/AndroidRuntime(22063): CvException [org.opencv.core.CvException: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/calib3d/src/ fundam.cpp:235: 错误: (-215) count >= 4 in function int cvFindHomography(const CvMat*, const CvMat*, CvMat*, int, double, CvMat*)

Android opencv代码如下(用新代码编辑):

TemplateImageTemp = new Mat();
            InputImageTemp = new Mat();
            InputImage = new Mat();
            TemplateImage = new Mat();

            // input frame has RGBA format
            InputImage = inputFrame.rgba();

            File ImagePath = new File(Environment.getExternalStorageDirectory(), "lena.png");

            TemplateImage = Highgui.imread(ImagePath.getAbsolutePath()); 

            Log.i(TAG, ImagePath.getAbsolutePath());

            if(TemplateImage.empty()){
                 Log.i(TAG, "========================= Empty ========================");
            }else
            {
                 Log.i(TAG, "========================= Loaded! ========================");
            }

            Imgproc.cvtColor(InputImage, InputImageTemp, Imgproc.COLOR_RGBA2RGB);
            Imgproc.cvtColor(TemplateImage ,TemplateImageTemp , Imgproc.COLOR_RGBA2RGB);

            // ORB detector and matcher
            FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
            DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
            DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);

            MatOfKeyPoint keypoints_object = new MatOfKeyPoint();
            MatOfKeyPoint keypoints_scene  = new MatOfKeyPoint();

            detector.detect(InputImageTemp, keypoints_object);
            detector.detect(TemplateImageTemp, keypoints_scene);

            Mat descriptor_object = new Mat();
            Mat descriptor_scene = new Mat() ;

            extractor.compute(InputImageTemp, keypoints_object, descriptor_object);
            extractor.compute(TemplateImageTemp, keypoints_scene, descriptor_scene);

            MatOfDMatch matches = new MatOfDMatch();

            matcher.match(descriptor_object, descriptor_scene, matches);
            List<DMatch> matchesList = matches.toList();

            Double max_dist = 0.0;
            Double min_dist = 100.0;

            for(int i = 0; i < descriptor_object.rows(); i++){
                Double dist = (double) matchesList.get(i).distance;
                if(dist < min_dist) min_dist = dist;
                if(dist > max_dist) max_dist = dist;
            }

            System.out.println("-- Max dist : " + max_dist);
            System.out.println("-- Min dist : " + min_dist);    

            LinkedList<DMatch> good_matches = new LinkedList<DMatch>();
            MatOfDMatch gm = new MatOfDMatch();

            for(int i = 0; i < descriptor_object.rows(); i++){
                if(matchesList.get(i).distance < 3*min_dist){
                    good_matches.addLast(matchesList.get(i));
                }
            }

            gm.fromList(good_matches);


            TempImage = InputImageTemp;
            System.out.println("==== 1 ====");

            LinkedList<Point> objList = new LinkedList<Point>();
            LinkedList<Point> sceneList = new LinkedList<Point>();

            List<KeyPoint> keypoints_objectList = keypoints_object.toList();
            List<KeyPoint> keypoints_sceneList = keypoints_scene.toList();

            for(int i = 0; i<good_matches.size(); i++){
                objList.addLast(keypoints_objectList.get(good_matches.get(i).queryIdx).pt);
                sceneList.addLast(keypoints_sceneList.get(good_matches.get(i).trainIdx).pt);
            }


            MatOfPoint2f obj = new MatOfPoint2f();
            obj.fromList(objList);

            MatOfPoint2f scene = new MatOfPoint2f();
            scene.fromList(sceneList);

            Mat H = Calib3d.findHomography(obj, scene);   

            Mat obj_corners = new Mat(4,1,CvType.CV_32FC2);
            Mat scene_corners = new Mat(4,1,CvType.CV_32FC2);

            System.out.println("==== 4 ====");

            obj_corners.put(0, 0, new double[] {0,0});
            obj_corners.put(1, 0, new double[] {TemplateImage.cols(),0});
            obj_corners.put(2, 0, new double[] {TemplateImage.cols(),TemplateImage.rows()});
            obj_corners.put(3, 0, new double[] {0,TemplateImage.rows()});      

            System.out.println("==== 5 ====");

            Core.perspectiveTransform(obj_corners,scene_corners, H);         

            System.out.println("==== 6 ====");
            Core.line(TempImage, new Point(scene_corners.get(0,0)), new Point(scene_corners.get(1,0)), new Scalar(0, 255, 0),4);
            Core.line(TempImage, new Point(scene_corners.get(1,0)), new Point(scene_corners.get(2,0)), new Scalar(0, 255, 0),4);
            Core.line(TempImage, new Point(scene_corners.get(2,0)), new Point(scene_corners.get(3,0)), new Scalar(0, 255, 0),4);
            Core.line(TempImage, new Point(scene_corners.get(3,0)), new Point(scene_corners.get(0,0)), new Scalar(0, 255, 0),4);


            System.out.print("Number of good matches: ");
            System.out.println (good_matches.size());

            OutputImage = TempImage;

            System.out.println("==== 8 ====");      


            System.out.print("Cols image out: ");
            System.out.println (OutputImage.cols());
            System.out.print("Rows image out: ");
            System.out.println (OutputImage.rows());
            System.out.print("Type image out: ");
            System.out.println (OutputImage.type());

            break;

有人有什么想法或建议吗?欢迎所有反馈!

【问题讨论】:

  • 我已经添加了代码,findHomogaphy 工作了几秒钟,之后我得到一个新的错误。

标签: android opencv image-processing


【解决方案1】:

您必须检查 objscene 列表是否有 4 个或更多元素,否则 findHomography 将失败。 4 个点是估计单应性所需的最小值。

if(obj.size()>=4 && scene.size()>=4){
    Mat H = Calib3d.findHomography(obj, scene);  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2017-10-26
    • 2020-11-07
    相关资源
    最近更新 更多