2011-10-16 42 views
5

Sau khi chụp ảnh bằng điện thoại Android, tôi muốn xác định đối tượng trong ảnh bằng cách nhấp vào ví dụ đó. đối tượng càng tốt trong hầu hết các trường hợp:
1. Thước
2. Người
3. Pencil
Tôi đang sử dụng android dựng sẵn-opencv phiên bản 2.3.1 và tôi đã cố gắng để nhấp vào đối tượng người cai trị và floodfill nó để đánh dấu nó, nhưng nếu các đường nét không bị đóng, toàn bộ hình ảnh sẽ được lấp đầy.
a) Tôi cũng cố gắng bấm vào đối tượng thước kẻ và đi về phía nam, bắc, đông, tây để tìm các cạnh và thu thập tọa độ này, nhưng tôi gặp phải vấn đề nặng nề (đừng hỏi).phát hiện đối tượng android opencv

Câu hỏi:
1. Có thể đóng các đường nét bằng cách nào đó để chỉ điền vào đối tượng mong muốn không?
2. Những gì tôi thực sự muốn tìm là các tọa độ của đáy và chiều cao của (ví dụ) người cai trị.
BẤT K other giải pháp nào khác được đánh giá cao. Làm thế nào bạn sẽ nhận ra nó?

Cập nhật: Tôi đã khắc phục vấn đề với a) và sử dụng phương pháp này vào lúc này (không hài lòng về nó). Tôi cũng đã thử phương pháp tiếp cận của Entreco, nhưng dường như không đưa ra giải pháp mong muốn.

Trả lời

6

Tôi không biết nếu bạn đã thử điều này, nhưng thông thường, bạn có thể đạt được kết quả tốt hơn bằng cách xử lý hình ảnh trước tiên.

1) Áp dụng GuassianBlur để loại bỏ tiếng ồn

2) Áp dụng AdaptiveThreshold -> để chuyển đổi hình ảnh để hoạt động đen và trắng

3) Áp dụng Dilate, để lấp đầy vết nứt

Bằng cách sử dụng các cài đặt khác nhau cho AdaptiveThreshold và hoạt động Dilate, bạn có thể có các đường bao khép kín ...

Ví dụ tôi đã sử dụng như sau:

// 1) Apply gaussian blur to remove noise 
Imgproc.GaussianBlur(mGraySubmat, mIntermediateMat, new Size(11,11), 0); 

// 2) AdaptiveThreshold -> classify as either black or white 
Imgproc.adaptiveThreshold(mIntermediateMat, mIntermediateMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 2); 

// 3) Invert the image -> so most of the image is black 
Core.bitwise_not(mIntermediateMat, mIntermediateMat); 

// 4) Dilate -> fill the image using the MORPH_DILATE 
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size(3,3), new Point(1,1)); 
Imgproc.dilate(mIntermediateMat, mIntermediateMat, kernel); 
+0

Cảm ơn bạn rất nhiều vì câu trả lời @Entreco. Tôi sẽ thử điều này và báo cáo. – gartenabfall

+0

@Entreco chúng ta có thể vẽ một hình chữ nhật arround các đường nét khép kín –

+0

nó không phải là phát hiện cạnh nếu đối tượng hình chữ nhật màu đen. –

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