2015-06-12 14 views
9

Tôi đã làm theo một ví dụ phát hiện blob (sử dụng cv2.SimpleBlobDetector) và phát hiện thành công các đốm màu trong hình ảnh nhị phân của tôi. Nhưng sau đó tôi không biết làm thế nào để trích xuất các tọa độ và diện tích của các điểm chính. Dưới đây là mã cho các phát hiện blob:OpenCV trả về tọa độ điểm chính và khu vực từ phát hiện blob, Python

# I skipped the parameter setting part. 
    blobParams = cv2.SimpleBlobDetector_Params() 
    blobVer = (cv2.__version__).split('.') 
    if int(blobVer[0]) < 3: 
     detector = cv2.SimpleBlobDetector(blobParams) 
    else: 
     detector = cv2.SimpleBlobDetector_create(blobParams) 

    # Detect Blobs 
    keypoints_black = detector.detect(255-black_blob) 
    trans_blobs = cv2.drawKeypoints(gray_video_crop, \ 
     keypoints_white, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

Vì vậy, biến keypoints_black chứa thông tin của (các) đốm màu. Khi tôi in biến nó trông giống như thế này (2 đốm màu được tìm thấy):

KeyPoint 0x10b10b870, KeyPoint 0x10b1301b0 

Vậy làm thế nào để tôi nhận được tọa độ của trung tâm của khối lượng của keypoint và khu vực của họ để tôi có thể gửi cho họ như OSC tin nhắn cho tương tác.

+0

Thử in 'dir (keypoint)' trong đó 'keypoint rõ ràng là một điểm chính :) Điều đó sẽ cung cấp cho bạn một danh sách các phương thức. Ngoài ra, bạn có thể thử 'tuple (keypoint)' để xem nó có chuyển đổi hay không. – deets

+0

Tôi đã thử tuple (keypoint) nó nó trả về giống nhau, chỉ trong tuple chứ không phải là mảng. –

+0

Và dir (keypoint) đã trả lại một Buch của phương pháp: [ '__delattr__', '__delitem__', \t \t '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', \t \t # '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', \t \t # '__ init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__ ', '__ne__', \t \t # '__ new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', \t \t # '__ setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', \t \t # 'chắp thêm', 'đếm', 'mở rộng', 'chỉ mục', 'chèn', 'pop', 'xóa', 'đảo ngược',]. Nhưng không biết những gì tiếp theo –

Trả lời

8

Các pt tài sản:

keypoints = detector.detect(frame) #list of blobs keypoints 
x = keypoints[i].pt[0] #i is the index of the blob you want to get the position 
y = keypoints[i].pt[1] 

Some documentation

+1

Brilliant. Cảm ơn!! –

+0

Cảm ơn bạn đã liên kết tới tài liệu! – johndodo

8

Nếu bạn có một danh sách các keypoint. Sau đó, bạn có thể in như được hiển thị bên dưới

for keyPoint in keyPoints: 
    x = keyPoint.pt[0] 
    y = keyPoint.pt[1] 
    s = keyPoint.size 

Chỉnh sửa: Kích thước xác định đường kính của vùng khóa có ý nghĩa. Bạn có thể sử dụng kích thước đó và tính toán khoảng diện tích của đốm màu.

+1

Thuộc tính '.size' là đường kính của đốm màu, không phải là vùng của nó. – Delgan

+0

@ Delgan Không có nơi tôi nói '.size' có nghĩa là khu vực trong câu trả lời của tôi. Vui lòng đọc nó đúng cách. –

+2

Bạn đang nói nó ngầm, như tác giả hỏi "làm thế nào để tôi có được tọa độ của trung tâm khối lượng của các điểm chính và khu vực của họ". Bất cứ ai đọc câu trả lời của bạn sẽ suy luận sai từ nó hơn '.size' trả về vùng của đốm màu. – Delgan

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