Tôi gặp sự cố khi phát hiện khu vực vòng tròn. Tôi đã thử nó với hàm HoughCircles từ opencv. Tuy nhiên, mặc dù các hình ảnh khá giống với các tham số cho chức năng phải khác nhau để phát hiện các cirles.python opencv - phát hiện đốm hoặc phát hiện vòng tròn
Một cách tiếp cận khác mà tôi đã thử là lặp qua mọi pixel và kiểm tra xem pixel hiện tại có màu trắng hay không. Nếu đây là trường hợp sau đó kiểm tra xem có một đối tượng blob trong khu vực (khoảng cách đến trung tâm blob nhỏ hơn một ngưỡng). Nếu có, hãy thêm điểm ảnh vào đốm màu, nếu không thì hãy tạo một đốm màu mới. Điều này cũng không hoạt động đúng cách.
Có ai biết cách tôi có thể thực hiện công việc này (phát hiện 90%) không? Tôi đã đính kèm một hình ảnh mẫu và một hình ảnh khác nơi tôi đã đánh dấu các hình tròn. Cảm ơn!
UPDATE: Cảm ơn bạn đã giúp đỡ cho đến nay! Đây là mã mà tôi có được các đường bao và lọc chúng theo khu vực:
im = cv2.imread('extract_blue.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gauss = cv2.GaussianBlur(imgray, (5, 5), 0)
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0)
# get contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_area = []
# calculate area and filter into new array
for con in contours:
area = cv2.contourArea(con)
if 1000 < area < 10000:
contours_area.append(con)
Công trình này khá gọn gàng. Tôi đã thu hút họ vào hình ảnh:
Đây là phần mà tôi lọc bởi tuần hoàn, nó đi thẳng bên dưới mã nơi tôi lọc theo khu vực:
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/perimeter*perimeter)
print circularity
if 0.8 < circularity < 1.2:
contours_cirles.append(con)
Tuy nhiên, danh sách mới 'contours_cirles' trống. Tôi in 'giấy cáo bạch' trong vòng lặp và các giá trị đều từ 10 đến 000 và 100 000.
CẬP NHẬT # 2: Sau khi sửa ngoặc thiếu nó đang làm việc bây giờ!
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/(perimeter*perimeter))
print circularity
if 0.7 < circularity < 1.2:
contours_cirles.append(con)
Cảm ơn rất nhiều bạn! :)
Mã rất cũ. Nhưng bạn có thể kiểm tra điều này. https://github.com/bipul21/Colored-Ball-Tracking –
'(diện tích/chu vi * chu vi)' điều này có vẻ lạ với tôi. Bạn có chắc chắn, bạn đã không quên bất kỳ dấu ngoặc? – Moritz
vâng, bạn nói đúng. circularity = 4 * math.pi * (diện tích/(chu vi * chu vi)) – cmplx96