【问题标题】:Matcher Assertions failed error opencv Android匹配器断言失败错误opencv Android
【发布时间】:2013-03-17 00:48:20
【问题描述】:

我正在编写代码以从相机预览中的可绘制对象中找到类似的对象。我正在使用最新的 Opencv 2.4.4。

以下是我的函数和 logcat 的输出。我做错了什么,我得到这样的输出?

 public void detect_image (Mat mRgba) {

    object_desc = new Mat();
    scene_desc = new Mat();

    object_keys = new MatOfKeyPoint();
    scene_keys = new MatOfKeyPoint();

    matches = new MatOfDMatch();
    good_matches = new MatOfDMatch();

    Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.sto);
    Utils.bitmapToMat(image,object);   

    surf = FeatureDetector.create(FeatureDetector.FAST);
    surf.detect( object, object_keys );   
    surf.detect( mRgba, scene_keys);
    surfEX = DescriptorExtractor.create(DescriptorExtractor.BRIEF);
    surfEX.compute(object, object_keys, object_desc);       
    surfEX.compute(mRgba, scene_keys, scene_desc);
    dm = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);    
    dm.match(object_desc, scene_desc, matches);

    double max_dist = 0;
    double min_dist = 100;

    for( int i = 0; i < object_desc.rows(); i++ )
      { double dist = matches.toArray()[i].distance;
        if( dist < min_dist ) min_dist = dist;
        if( dist > max_dist ) max_dist = dist;
      }

     for( int i = 0; i < object_desc.rows(); i++ )
      {  MatOfDMatch temp = new MatOfDMatch();
         if( matches.toArray()[i].distance < 3*min_dist )
         {   temp.fromArray(matches.toArray()[i]);
             good_matches.push_back(temp); 
             }        
      }

}



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

Logcat:

03-27 01:55:31.258: E/cv::error()(564): OpenCV Error: Assertion failed 
(type == src2.type() && src1.cols == src2.cols && 
(type == CV_32F || type == CV_8U)) in void cv::batchDistance(cv::InputArray,
cv::InputArray, cv::OutputArray, int, cv::OutputArray, int, int, cv::InputArray,
int,  bool), file /home/reports/ci/slave/50-SDK/opencv/modules/core/src/stat.cpp,
line 1803

【问题讨论】:

  • 哪一行在这个断言上失败了?您确定surf.detect() 可以接受位图作为输入吗?不应该是垫子吗?
  • surf.detect() 采用 Mats 和 object,mRgba 是 Mats。下面的行导致了问题:dm.match(object_desc, scene_desc,matches);
  • 我的错,我没有看到Utils.bitmapToMat()。您是否手动验证了object_desc.type == scene_desc.typeobject_desc.cols == object_scene.cols?您的object_descscene_desc 之间显然存在某种不兼容...
  • 非常感谢第一帧object_desc.cols() == scene_desc.cols() 是假的,然后是真的。简单的“如果”解决了问题:)

标签: android opencv image-processing


【解决方案1】:

(Open Cv Mat没有类型方法)试试这个方法..

public  void match(Mat object_desc, Mat scene_desc, MatOfDMatch matches)
{
    if(object_desc.type() == scene_desc.type() &&
            object_desc.cols() == scene_desc.cols()) {            
        match_1(nativeObj, object_desc.nativeObj, scene_desc.nativeObj, matches.nativeObj);
    }

}

【讨论】:

    【解决方案2】:

    只是为了结束这个问题:

    根据您的评论,以下行导致了问题:

    dm.match(object_desc, scene_desc, matches);
    

    我建议您手动验证:

    (object_desc.type == scene_desc.type &&
     object_desc.cols == object_scene.cols)
    

    问题最终出在第一帧object_desc.cols() != scene_desc.cols()。一个简单的if 就足以解决问题。

    【讨论】:

    • 您先生,是我的英雄。花了两天时间解决这个问题! +1
    • Open Cv Mat 现在没有类型方法,请您更新这个答案
    • 嘿@LiamGeorgeBetsworth....你能告诉我你是怎么解决这个问题的,因为我正在使用以下方法,如果 (thisHisto.type() == toCompareHisto.type () && thisHisto.cols() == toCompareHisto.cols()) { matcher.match(thisHisto, toCompareHisto, 匹配); }
    • @LiamGeorgeBetsworth 先生,我真的很感激......我已经坚持了很长时间
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2012-06-21
    • 2017-10-26
    • 2016-11-27
    相关资源
    最近更新 更多