2012-10-30 35 views
5

Tôi có hình ảnh sau đây rectangle pattern boardphát hiện hình chữ nhật mờ trên grayscaleimage đa phương

Tôi đang cố gắng để tìm tọa độ pixel của hình chữ nhật chính (những giữa các dòng trắng). Tôi đã thử vài thứ nhưng tôi không thể có được giải pháp đủ tốt. Các giải pháp không phải là hoàn hảo và nó ok nếu không phải tất cả các hình chữ nhật được phát hiện (đặc biệt là những người thực sự nhỏ). Mặc dù vị trí góc sẽ phải càng chính xác càng tốt, đặc biệt là với những mờ lớn hơn (Tôi đang cố gắng để viết một số động cơ AR đơn giản).

Tôi có thể làm rõ chỉ có 4 cấp độ của màu xám: 0, 110, 180 và 255 (khi in, không có màn hình nó sẽ thay đổi vì sét và bóng tối)

Cho đến nay tôi đã cố gắng vài điều:

  1. thủ ngưỡng đa cấp (vì bóng tối và sét khác nhau nó đã không làm việc)
  2. adaptive ngưỡng: 2 vấn đề:
    • nó kết hợp 180 và 255 màu sắc trong sang màu trắng, và 0, 110 thành đen
    • cạnh/góc vị trí của mờ hình chữ nhật (lớn hơn) không phải là chính xác (nó cho biết thêm mờ để hình chữ nhật diện tích)
  3. phát hiện cạnh Sobel (góc của hình chữ nhật mờ sắc nét hơn , nhưng nó cũng phát hiện các cạnh bên trong hình chữ nhật, các đường viền cạnh đó không phải lúc nào cũng đóng

Có vẻ như kết hợp hai suy nghĩ này sẽ mang lại kết quả tốt hơn. Hoặc có lẽ ai đó có ý tưởng khác?

Tôi cũng đang nghĩ đến việc thực hiện lũ lụt, nhưng thật khó để tìm điểm và ngưỡng hạt giống chắc chắn tự động (có thể có một số đối tượng màu trắng khác trong nền). Bên cạnh đó tôi sẽ muốn tối ưu hóa sau này cho GPU và thuật toán lũ lụt là không phù hợp cho việc này.

Dưới đây là một số mẫu mã tôi đã cố gắng cho đến nay:

image = cv2.imread('data/image.jpg'); 
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 
cv2.imshow('image', gray) 


adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 601, 0) 
cv2.imshow('adaptive', adaptive) 


gradx = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=3) 
grady = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=3) 
abs_gradx = cv2.convertScaleAbs(grady) 
abs_grady = cv2.convertScaleAbs(grady) 
grad = cv2.addWeighted(abs_gradx, 0.5, abs_grady, 0.5, 0) 

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) 
grad = cv2.morphologyEx(grad, cv2.MORPH_OPEN, kernel) 
grad = cv2.morphologyEx(grad, cv2.MORPH_CLOSE, kernel) 
cv2.imshow('sobel',grad) 


#kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(7,7)) 
#grad = cv2.morphologyEx(grad, cv2.MORPH_OPEN, kernel) 
retval, grad = cv2.threshold(grad, 10, 255, cv2.THRESH_BINARY) 
cv2.imshow('sobel+morph+thrs',grad) 

cv2.waitKey() 
+1

Bạn đã từng xem xét phát hiện góc? – Junuxx

+0

vâng tôi đã thử goodFeaturesToTrack và ở đó có nhiều tài sản giả mạo – pzo

+1

Chỉ cần làm rõ mục tiêu. Bạn có dải trắng lớn phác thảo hình vuông, có đầy đủ các hình chữ nhật (một số trong đó là hình vuông là tốt). Bạn có muốn các góc của hình vuông lớn, các góc của hình chữ nhật nhỏ làm đầy các hình vuông hoặc cả hai? – Hammer

Trả lời

3

Tôi tin câu trả lời của bạn nằm trong việc sử dụng biến đổi Hough để phát hiện đường kẻ, mở rộng các đường này để mở rộng khoảng cách giữa các hình vuông tối hơn và sau đó tìm các giao lộ đánh dấu các góc. Tôi đã có một vở kịch nhanh chóng trong Matlab và đã đưa ra những điều sau đây, nó không hoàn hảo nhưng sẽ hiển thị tiềm năng:

% Open image 
i = imread('http://i.stack.imgur.com/kwcXm.jpg'); 

% Use a sharpening filter to enhance some of the edges 
H = fspecial('unsharp'); 
i = imfilter(i, H, 'replicate'); 
% Detect edge segments using canny 
BW = edge(i, 'canny'); 

% Apply hough transform to edges 
[H, T, R] = hough(BW, 'RhoResolution', 0.5, 'Theta', -90:0.5:89.5); 
% Find peaks in hough transform 
P = houghpeaks(H, 5, 'threshold', ceil(0.1*max(H(:)))); 
% Extract lines from peaks, extending partial lines 
lines = houghlines(BW, T, R, P, 'FillGap', 100, 'MinLength', 5); 

% Plot detected lines on image 
imshow(i); hold on; 
for k = 1:length(lines) 
    xy = [lines(k).point1; lines(k).point2]; 
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); 
end 

Với kết quả cuối cùng:

Final Result

Rõ ràng có chỗ để cải thiện, với một số dòng vẫn còn để phát hiện, nhưng nếu tinh chỉnh các thông số khác nhau không hoạt động, bạn có thể lấy kết quả ban đầu và tìm kiếm nhiều dòng hơn với các góc tương tự để có được bộ hoàn chỉnh hơn. Các góc sau đó có thể được tìm thấy từ các giao lộ đủ đơn giản để trích xuất.

0

tôi sẽ thử như sau:

  • Hough transform để phát hiện tất cả các đường thẳng
  • Hãy tìm bộ đường thẳng song song có :
    • Khoảng cách đủ xa
    • S eparated bởi màu sắc nhẹ

Có một vài điều mà làm cho vấn đề của bạn phức tạp hơn so với nó cần phải được:

  • méo Perspective
  • Những thay đổi về ánh sáng, bóng nhỏ

Nếu bạn có thể giảm thiểu ở trên, nó có thể giúp giải quyết vấn đề.

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