オブジェクトの境界点のセットがあります。
opencvを輪郭として描きたいです。
ポイントを輪郭表現に変換する方法がわかりません。
次の呼び出しによって得られる同じ輪郭表現に
contours,_ = cv2.findContours(image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
何か案は?
ありがとう
オブジェクトの境界点のセットがあります。
opencvを輪郭として描きたいです。
ポイントを輪郭表現に変換する方法がわかりません。
次の呼び出しによって得られる同じ輪郭表現に
contours,_ = cv2.findContours(image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
何か案は?
ありがとう
等高線の形式を見ると、次のようなもので十分だと思います。
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)
ポイントの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)
輪郭は、すべての連続する点を結ぶ曲線であるため、独自の輪郭を作成するには、時計回りの順序で点を使用しnp.array()
てを作成できます。(x,y)
points = np.array([[25,25], [70,10], [150,50], [250,250], [100,350]])
それでおしまい!
必要なものに応じて、画像に輪郭を描画する方法は2つあります。
輪郭の概要
輪郭の輪郭のみが必要な場合は、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()
Cherif KAOUAの答えに追加するには、リストに変換してnumpy配列を圧縮する必要があることがわかりました。テキストファイルからポイントの配列を読み取る:
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))