私は画像処理の初心者です。さまざまなエッジの中でネストされた形状を検出したいです。プログラムから、階層関係を通じて期待される輪郭を正常に検出できましたが、形状を検出しようとすると問題が発生します。輪郭の場合近似、cv2.approxpolyDP()
インデックス番号を使用して目的の輪郭にメソッド/関数を使用していますが、毎回同じ出力「1」が生成されます。どこを間違えているのかわかりません。ご覧になり、提案してください。コードは以下に示され、検出される画像もそれらのリンクに示されています。私を助けてください...
import cv2
import numpy as np
maxx=0
original_color=cv2.imread("tri.jpg",1)
original=cv2.cvtColor(original_color,cv2.COLOR_BGR2GRAY)
#cv2.imshow("original",original)
blur=cv2.GaussianBlur(original,(5,5),0)
ret,thresh=cv2.threshold(blur,50,255,cv2.THRESH_BINARY)
edges = cv2.Canny(thresh,100,200)
image,contours,hierarchy=cv2.findContours(edges.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print len(contours)
##for c in range(0,len(hierarchy)) :
## a=zip(hierarchy[c],contours[c])
for i in range(0,len(hierarchy[0])):
if hierarchy[0][i][2]>=maxx :
if(hierarchy[0][i][3]==(hierarchy[0][i][2]-2)):
maxx=hierarchy[0][i][2]
index=i
cnt=contours[index]
for c in cnt :
peri=cv2.arcLength(c,True)
approx=cv2.approxPolyDP(c,0.04*peri,True)
print hierarchy
print maxx
print len(approx)
cv2.drawContours(original_color,contours,index,(0,255,0),3)
cv2.imshow("Show",original_color)
cv2.waitKey()
cv2.destroyAllWindows()
検出前
正常に検出されました
findContoursの結果は、ポイントのリストのリストです。これは、問題がここにあることを意味します。
cnt=contours[index]
for c in cnt :
peri=cv2.arcLength(c,True)
approx=cv2.approxPolyDP(c,0.04*peri,True)
ここでは、等高線(pointSのリスト)を選択してから、各ポイントをループし、1つのポイントのみでapproxPolyDPを実行します。あなたは輪郭にそれをするべきです。したがって、選択した輪郭に対してそれを実行したい場合は、次のことを行う必要があります。
cnt=contours[index]
peri=cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,0.04*peri,True)
輪郭ごとにそれを実行したい場合は、次のようにします(ループ内に印刷を保持し、そうでない場合は最後の1つのみを表示します)。
for c in contours:
peri=cv2.arcLength(c,True)
approx=cv2.approxPolyDP(c,0.04*peri,True)
print len(approx)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加