【问题标题】:Android OpenCV - Object trackingAndroid OpenCV - 对象跟踪
【发布时间】:2014-01-09 08:34:56
【问题描述】:

我正在使用 features detect 实现对象跟踪,但出现以下错误:

12-19 20:59:16.943: E/cv::error()(31858): OpenCV 错误: 断言失败 (src.dims == 2 && info.height == (uint32_t)src.rows && info .width == (uint32_t)src.cols) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong​​, jobject, jboolean),文件/home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/src /cpp/utils.cpp,第 97 行 12-19 20:59:16.943: E/org.opencv.android.Utils(31858): nMatToBitmap 捕获 cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/ src/cpp/utils.cpp:97: 错误: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2 (JNIEnv*, jclass, jlong​​, jobject, jboolean) 12-19 20:59:16.943:E/CameraBridge(31858):垫子类型:垫子 [820*2672*CV_8UC3,isCont=true,isSubmat=false,nativeObj=0x55650380,dataAddr=0x5ec20010] 12-19 20:59:16.943:E/CameraBridge(31858):位图类型:960*720 12-19 20:59:16.943:E/CameraBridge(31858):Utils.matToBitmap() 抛出异常:/home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/src/cpp/ utils.cpp:97: 错误: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong​​, jobject, jboolean)

这是代码:

    public void onCameraViewStarted(int width, int height) {
    mRgba = new Mat();
    mGray = new Mat();
    mView = new Mat();
    mObject = new Mat();
}

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {    
    mRgba = inputFrame.rgba();

    switch (viewMode) {
    case VIEW_MODE_RGBA:

        return mRgba;

    case VIEW_MODE_FeatureDetect:
        try {
        mGray = inputFrame.gray();
        mObject = new Mat();
        mObject = Highgui.imread(Environment.getExternalStorageDirectory()+ "/Android/data/" + getApplicationContext().getPackageName() + "/Files/Object.jpg", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
        mView = mGray.clone();          

        FeatureDetector myFeatureDetector = FeatureDetector.create(FeatureDetector.ORB);

        MatOfKeyPoint keypoints = new MatOfKeyPoint();
        myFeatureDetector.detect(mGray, keypoints);

        MatOfKeyPoint objectkeypoints = new MatOfKeyPoint();
        myFeatureDetector.detect(mObject, objectkeypoints);

        DescriptorExtractor Extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
        Mat sourceDescriptors = new Mat();
        Mat objectDescriptors = new Mat();
        Extractor.compute(mGray, keypoints, sourceDescriptors);
        Extractor.compute(mGray, objectkeypoints, objectDescriptors);
        DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);

        MatOfDMatch matches = new MatOfDMatch();
        matcher.match(sourceDescriptors, objectDescriptors, matches);

        Features2d.drawMatches(mGray, keypoints, mObject, objectkeypoints, matches, mView);

        return mView;
        } catch (Exception e) {
            Log.d("Exception",e.getMessage());
        }

    }

    return mRgba;
}

它无法在屏幕上显示对象,但我需要一些可以放置矩形的信息或可以标记对象的东西我想要跟踪。 对不起我的英语,我希望你明白我在问什么,谢谢你的建议。

【问题讨论】:

  • 显然,当您将 Features2d.drawMatches 应用于实时摄像头供稿时,它在 android 中不起作用。您可以进一步绘制单应性然后找到结果。您可以在中间步骤中打印 LOG 信息,以查看您获得的匹配程度

标签: android opencv


【解决方案1】:

感谢Darshan的建议,我解决了,需要调整图片大小, 在Features2d.drawMatches(mGray, keypoints, mObject, objectkeypoints, matches, mView); 下方添加此代码,就像Imgproc.resize(mView, mView, mGray.size()); 一样,然后它就可以工作了。

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多