2013-01-04 90 views
5

Tôi có một tập hợp các điểm ranh giới của một đối tượng.Tạo đường viền của riêng bạn trong opencv bằng cách sử dụng python

Tôi muốn vẽ nó bằng cách sử dụng opencv làm đường bao.

Tôi không biết làm thế nào để chuyển đổi điểm của tôi thành biểu diễn đường bao.

Để đại diện đường viền cùng mà là thu được bằng cách làm theo cuộc gọi

contours,_ = cv2.findContours(image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

Bất kỳ ý tưởng?

Cảm ơn

Trả lời

9

Bằng cách nhìn vào định dạng của đường nét Tôi nghĩ rằng một cái gì đó như thế này nên là đủ:

contours = [numpy.array([[1,1],[10,50],[50,50]], dtype=numpy.int32) , numpy.array([[99,99],[99,60],[60,99]], dtype=numpy.int32)] 

chương trình nhỏ này đưa ra một ví dụ chạy:

import numpy 
import cv2 

contours = [numpy.array([[1,1],[10,50],[50,50]], dtype=numpy.int32) , numpy.array([[99,99],[99,60],[60,99]], dtype=numpy.int32)] 

drawing = numpy.zeros([100, 100],numpy.uint8) 
for cnt in contours: 
    cv2.drawContours(drawing,[cnt],0,(255,255,255),2) 

cv2.imshow('output',drawing) 
cv2.waitKey(0) 
6

Để tạo đường viền của riêng bạn từ danh sách trăn của các điểm L

L=[[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x5,y5],[x6,y6],[x7,y7],[x8,y8],[x9,y9],...[xn,yn]] 

Tạo một mảng NumPy ctr từ L, định hình lại nó và buộc loại của nó

ctr = numpy.array(L).reshape((-1,1,2)).astype(numpy.int32) 

ctr là countour mới của chúng tôi, chúng ta hãy vẽ nó trên một hình ảnh hiện

cv2.drawContours(image,[ctr],0,(255,255,255),1) 
0

Để thêm vào câu trả lời của Cherif KAOUA, tôi thấy rằng tôi phải chuyển đổi thành danh sách và nén mảng ô uế của mình. Đọc trong một loạt các điểm từ một tệp văn bản:

contour = [] 
    with open(array_of_points,'r') as f: 
     next(f) // line one of my file gives the number of points 
     for l in f: 
      row = l.split() 
      numbers = [int(n) for n in row] 
      contour.append(numbers) 

    ctr = np.array(contour).reshape((-1,1,2)).astype(np.int32) 
    ctr = ctr.tolist() 
    ctr = zip(*[iter(ctr)]*len(contour)) 
Các vấn đề liên quan