2013-04-25 28 views
5

Tôi không thể làm cho chức năng này hoạt động. Về cơ bản tôi đang làm tính năng phát hiện và kết hợp với một hình ảnh tham khảo. Tôi muốn phủ các đối tượng địa lý phù hợp trên đầu hình ảnh đầu vào của mình. Đây là mã của tôi:Android OpenCV: vẽ các trận đấu với feature2d

public Mat startProcessing(Mat inputImage) { 

    Imgproc.cvtColor(inputImage, rgb, Imgproc.COLOR_GRAY2RGB); 
    myFeatures.detect(rgb, keypoints); 
    descriptorExtractor.compute(inputImage, keypoints, imageDescriptors); 
    descriptorMatcher.match(templateDescriptors, imageDescriptors, matches); 

    Features2d.drawMatches(rgb, keypoints, templateImage, templateKeypoints, matches, rgb); 

    Imgproc.cvtColor(rgb, outputImage, Imgproc.COLOR_RGB2RGBA); 
    return outputImage; 
} 

Đó là tính năng2d.drawMatch đặc biệt là vấn đề. Theo lỗi Android tôi đã nhận được, một số thứ nguyên không xếp hàng. Sự thật được nói, tôi thậm chí không chắc chắn làm thế nào drawMatches là vụ phải làm việc trên Android vì không có tài liệu ở bất cứ đâu.

Điều tôi muốn có thể làm là vẽ các kết quả phù hợp ở đầu inputImage. Tôi đã nhận được Feature2d.drawKeypoints để hoạt động, nhưng tôi không chắc chắn cách tôi sẽ chuyển đổi MatOfDMatch matches thành đối tượng MatOfKeypoint. Ngoài ra tôi thậm chí không chắc chắn nếu đó là cách MatOfDMatch hoạt động - nó không có một số kết hợp bên trong của nó tương ứng với các descriptors?

Xin lỗi vì đã ở khắp nơi, tôi đang gặp khó khăn khi sử dụng OpenCV với Android. Các tài liệu C++ ra có là tốt, nhưng có rất ít trong cách của các tài liệu Android. Cảm ơn vì bất kì sự giúp đỡ!

Trả lời

6

Điều đầu tiên tôi nhận thấy là bạn đang chuyển đổi hình ảnh từ không gian màu này sang không gian màu khác. Nó khó hiểu một chút. Nếu bạn muốn vẽ các kết quả phù hợp trên hình ảnh thang độ xám, không cần thực hiện chuyển đổi hình ảnh này. Điều khác, bạn đang phát hiện các điểm trên hình ảnh RGB và sau đó trích xuất các mô tả từ hình ảnh gốc (như tôi có thể thấy nó là màu xám)

Ngoài ra tôi đề nghị bạn kiểm tra bên trong chức năng của bạn nếu hình ảnh cùng loại. Chỉ cần in đối tượng nhật ký inputImage và xem cả hai có thuộc loại CV_8UC3 hoặc tương đương hay không. Về cơ bản mã của bạn nên là như thế này:

Mat imageOut = inputImage.clone(); 
Features2d.drawMatches(inputImage, keypoints, templateImage, templateKeypoints, matches, imageOut); 
Highgui.imwrite("result_match.jpeg", imageOut); 

trả lời khác câu hỏi của bạn:

Q: Tôi không chắc chắn làm thế nào tôi sẽ đi về chuyển đổi MatOfDMatch trận đấu đến một đối tượng MatOfKeypoint. A: Bạn không cần phải làm điều đó, bởi vì drawMatches chức năng nhận được MatOfKeypoint của hình ảnh đầu vào và cũng của hình ảnh mẫu. Sau đó, khi bạn đi qua MatOfDMatch, nó sẽ rút ra các kết quả phù hợp giữa các điểm nhận được phù hợp.

Hỏi: Ngoài ra tôi thậm chí không chắc chắn đó là cách hoạt động của MatOfDMatch - không phải nó có một số kết hợp bên trong của nó tương ứng với các bộ mô tả? A: Vâng, có. Nếu bạn sẽ thực hiện matches.toList(0).queryIdxmatches.toList(0).trainIdx, bạn sẽ nhận được chỉ mục của điểm khóa inputImage, phù hợp với điểm quan trọng của trận đấu đầu tiên của templateImage.

+0

Cảm ơn bạn cho đến nay. Tôi bắt đầu sử dụng imageOut = inputImage.clone() và điều này cho phép drawMatches làm việc. Tuy nhiên tôi muốn trả lại hình ảnh nàyNhư những gì người dùng nhìn thấy trên máy ảnh nhưng kích thước hơi khác - 704 * 480 thay vì độ phân giải máy ảnh của tôi là 640 * 480. Cho rằng hình ảnh mẫu của tôi có chiều rộng 64 có vẻ như drawMatches đang đặt chúng cạnh nhau. Tôi có thể chỉ hiển thị một hình chữ nhật hoặc một cái gì đó trên khu vực phù hợp trên hình ảnh đầu vào? – JDS

+2

Có, tôi nghĩ vậy. Chuyển các đối sánh và các điểm chính thành danh sách 'List matches_list = matches.toList(); Danh sách kp_list = keypoints.toList();' và sau đó lặp qua danh sách 'kp_list.get (matches_list.get (i) .queryIdx)' và tìm X và Y tối thiểu và tối đa của các điểm chính phù hợp để gặp hai điểm sẽ xác định hình chữ nhật của bạn.Sau đó xác định một hình chữ nhật 'Rect roi = new Rect (điểm mới (minX, minY), điểm mới (maxX, maxY))' và sau đó chỉ cần làm 'Mat imageFinal = new Mat (inputImage, roi);' và nó sẽ cắt vùng khớp – andriy

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