2013-03-27 35 views
16

Tôi đang viết mã để tìm đối tượng tương tự từ có thể drawable trong chế độ xem lại. Tôi đang sử dụng Opencv 2.4.4 mới nhất.Lỗi xác nhận đối sánh không thành công opencv Android

Dưới đây là các chức năng của tôi và đầu ra từ logcat. Tôi đang làm gì sai khi tôi nhận được kết quả như vậy?

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

mà dòng chính xác là không về nhận định này? Bạn có chắc chắn rằng 'surf.detect()' có thể chấp nhận Bitmap làm đầu vào không? Nó không phải là một Mat? – JonesV

+0

surf.detect() nhận Mats và đối tượng và mRgba là Mats. Dòng bên dưới gây ra sự cố: dm.match (object_desc, scene_desc, kết quả phù hợp); – Martus0

+3

Sai lầm của tôi, tôi đã không nhìn thấy 'Utils.bitmapToMat()'. Bạn đã xác minh bằng tay 'object_desc.type == scene_desc.type' và' object_desc.cols == object_scene.cols' chưa? Rõ ràng là một số loại không tương thích giữa 'object_desc' và' scene_desc' của bạn ... – JonesV

Trả lời

19

Chỉ vì lợi ích đóng câu hỏi này:

Theo nhận xét của bạn, dòng sau đã gây ra vấn đề:

dm.match(object_desc, scene_desc, matches); 

tôi khuyên bạn nên xác minh theo cách thủ công rằng:

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

Vấn đề cuối cùng là đối với khung hình đầu tiên, object_desc.cols() != scene_desc.cols(). Một đơn giản if là đủ để giải quyết vấn đề.

+0

Bạn thưa bạn, là anh hùng của tôi. Mất hai ngày để làm việc này! +1 –

+0

Mở Cv Mat doestn't have type type now, bạn vui lòng cập nhật câu trả lời này – Crawler

+0

hey @LiamGeorgeBetsworth .... bạn có thể vui lòng cho tôi biết cách bạn giải quyết vấn đề này, vì tôi đang sử dụng cách tiếp cận và lỗi sau đây nếu (thisHisto.type() == toCompareHisto.type() && thisHisto.cols() == toCompareHisto.cols()) { matcher.match (thisHisto, toCompareHisto, matches); } – AwaisMajeed

0

(mở Cv Mat doestn't có loại phương pháp) Hãy thử phương pháp này ..

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

} 
Các vấn đề liên quan