使用python在opencv中创建自己的轮廓

时间:2013-01-04 16:52:36

标签: python opencv contour

我有一组对象的边界点。

我想用opencv作为轮廓绘制它。

我不知道如何将我的点转换为轮廓表示。

通过以下调用获得的相同轮廓表示

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

有什么想法吗?

由于

4 个答案:

答案 0 :(得分:13)

通过查看轮廓的格式,我认为这样的事情就足够了:

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

这个小程序给出了一个运行的例子:

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)

答案 1 :(得分:9)

从python点列表L

创建自己的轮廓
L=[[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x5,y5],[x6,y6],[x7,y7],[x8,y8],[x9,y9],...[xn,yn]]

从L创建一个numpy数组 ctr ,重塑它并强制其类型

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

ctr 是我们的新计数器,让我们在现有的图片上绘制

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

答案 2 :(得分:1)

轮廓只是连接所有连续点的曲线,因此要创建自己的轮廓,可以按顺时针顺序 (x,y)点的np.array() >

points = np.array([[25,25], [70,10], [150,50], [250,250], [100,350]])

就是这样!


有两种方法可以根据需要在图像上绘制轮廓:

轮廓轮廓

如果只需要轮廓轮廓,请使用cv2.drawContours()

cv2.drawContours(image,[points],0,(0,0,0),2)

轮廓填充

要获得填充的轮廓,可以将cv2.fillPoly()cv2.drawContours()thickness=-1一起使用

cv2.fillPoly(image, [points], [0,0,0]) # OR
# cv2.drawContours(image,[points],0,(0,0,0),-1)

完整示例代码

import cv2
import numpy as np

# Create blank white image
image = np.ones((400,400), dtype=np.uint8) * 255

# List of (x,y) points in clockwise order
points = np.array([[25,25], [70,10], [150,50], [250,250], [100,350]])

# Draw points onto image
cv2.drawContours(image,[points],0,(0,0,0),2)

# Fill points onto image
# cv2.fillPoly(image, [points], [0,0,0])

cv2.imshow('image', image)
cv2.waitKey()

答案 3 :(得分:0)

要添加Cherif KAOUA的答案,我发现我必须转换为列表并压缩我的numpy数组。从文本文件中读取一系列点:

if(i == 1 || i % 3 == 0){
    // condition is met
}