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 đỡ!
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
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