2013-03-27 67 views
16

我正在编写代码以在camerapreview中查找drawable中的类似对象。我正在使用最新的Opencv 2.4.4。匹配器断言失败错误opencv Android

下面是我的函数和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 
+0

哪一行正好是在此断言失败?你确定'surf.detect()'可以接受一个位图作为输入吗?它不应该是一个垫子? – JonesV 2013-03-27 06:42:31

+0

surf.detect()需要垫子和物体,而mRgba是垫子。下面的代码导致这些问题: dm.match(object_desc,scene_desc,matches); – Martus0 2013-03-27 10:40:01

+3

我的错误,我没有见过'Utils.bitmapToMat()'。你是否手动验证了'object_desc.type == scene_desc.type'和'object_desc.cols == object_scene.cols'?显然你的'object_desc'和'scene_desc'之间有某种不兼容...... – JonesV 2013-03-27 12:41:14

回答

19

就关闭这个问题的缘故:

根据您的意见,下面一行是造成问题:

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就足以解决这个问题。

+0

你先生,我的英雄。花了两天时间来解决这个问题! +1 – 2014-06-04 09:49:34

+0

Open Cv Mat doestn't有类型的方法现在请你更新这个答案 – Crawler 2016-06-08 07:28:00

+0

嗨@LiamGeorgeBetsworth ....你能告诉我你是如何解决这个问题的,因为我使用了下面的方法,错误仍然存​​在如果(thisHisto.type()== toCompareHisto.type()&& thisHisto.cols()== toCompareHisto.cols()){ matcher.match(thisHisto,toCompareHisto,matches); } – AwaisMajeed 2017-08-23 07:30:04

0

(打开了Cv垫doestn't有类型的方法)尝试此方法..

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); 
    } 

} 
相关问题