nếu hình vuông đã kết nối khu vực trong hình ảnh, làm thế nào tôi có thể phát hiện chúng.Phát hiện hình vuông nâng cao (có vùng được kết nối)
Tôi đã thử nghiệm phương pháp nêu tại OpenCV C++/Obj-C: Advanced square detection
Nó không làm việc tốt.
Bất kỳ ý tưởng hay nào?
import cv2
import numpy as np
def angle_cos(p0, p1, p2):
d1, d2 = (p0-p1).astype('float'), (p2-p1).astype('float')
return abs(np.dot(d1, d2)/np.sqrt(np.dot(d1, d1)*np.dot(d2, d2)))
def find_squares(img):
squares = []
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow("gray", gray)
gaussian = cv2.GaussianBlur(gray, (5, 5), 0)
temp,bin = cv2.threshold(gaussian, 80, 255, cv2.THRESH_BINARY)
# cv2.imshow("bin", bin)
contours, hierarchy = cv2.findContours(bin, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(gray, contours, -1, (0, 255, 0), 3)
#cv2.imshow('contours', gray)
for cnt in contours:
cnt_len = cv2.arcLength(cnt, True)
cnt = cv2.approxPolyDP(cnt, 0.02*cnt_len, True)
if len(cnt) == 4 and cv2.contourArea(cnt) > 1000 and cv2.isContourConvex(cnt):
cnt = cnt.reshape(-1, 2)
max_cos = np.max([angle_cos(cnt[i], cnt[(i+1) % 4], cnt[(i+2) % 4]) for i in xrange(4)])
if max_cos < 0.1:
squares.append(cnt)
return squares
if __name__ == '__main__':
img = cv2.imread('123.bmp')
#cv2.imshow("origin", img)
squares = find_squares(img)
print "Find %d squres" % len(squares)
cv2.drawContours(img, squares, -1, (0, 255, 0), 3)
cv2.imshow('squares', img)
cv2.waitKey()
tôi sử dụng một số phương pháp trong ví dụ opencv, nhưng kết quả là không tốt.
+1 - Làm tốt lắm. –
yep, đúng, cách tiếp cận thực sự tốt đẹp, +1. Rất khó để đưa các chỉ mục hình ảnh vào đúng định dạng, tôi đã sử dụng phương pháp giải nén zip giống như bạn thấy ở đây, nhưng gần đây tôi nhận ra rằng nó có thể chậm hơn rất nhiều so với chuyển đổi và sao chép (nên tốc độ là quan trọng ..) Không may, sao chép dường như được yêu cầu để tránh một ngoại lệ opencv (ít nhất là đối với tôi) .. – fraxel
Sự khác biệt là các công việc được mặc định theo mặc định với các coords '(y, x)', và OpenCV mong đợi '(x, y)'. @fraxel Tôi không đo lường hiệu suất, nhưng có khả năng mã được cập nhật tốt hơn ở điểm cụ thể đó. – mmgp