2017-01-10 8 views
0

円形の形状を検出するコードがありますが、どのように動作するのか理解できません。このコードからOpenCV - 円形の形状を検出する

  1. がどのように私は円の半径と中心点を見つけることができますか?
  2. サークルを検出するための `cv2.approxPolyDP 'の動作は何ですか?今

X

contours.sort(key = lambda x:cv2.boundingRect(x)[0]) 

for contour in contours: 
     approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True), True) 
     if len(approx) > 8: 
      # Find the bounding rect of contour. 
      contour_bounding_rect = cv2.boundingRect(contour) 
      mid_point = contour_bounding_rect[0] + contour_bounding_rect[2]/2, contour_bounding_rect[1] + contour_bounding_rect[3]/2 
      print mid_point[1]/single_element_height, ", ", 

答えて

1

両方のための

参照ドキュメントだから私はあなたの最初の質問への答えを考え出した:は、画像中の円の中心と半径を決定します。

最初に、画像に存在するすべての輪郭を探しています。その後、for loopを使用して、の中心の半径が画像のすべての輪郭にcv2.minEnclosingCircleを使用しています。私はそれらをコンソール画面に表示した。

contours,hierarchy = cv2.findContours(thresh,2,1) 
print len(contours) 
cnt = contours 

for i in range (len(cnt)): 
    (x,y),radius = cv2.minEnclosingCircle(cnt[i]) 
    center = (int(x),int(y)) 
    radius = int(radius) 
    cv2.circle(img,center,radius,(0,255,0),2) 
    print 'Circle' + str(i) + ': Center =' + str(center) + 'Radius =' + str(radius) 

cv2.approxPolyDP()の2番目の質問に答えるには、この関数は、「ε」というパラメータに基づいて、画像内のオブジェクトの周りにおおよその輪郭を描画します。 'イプシロン'の値が高いほど、輪郭はおおよそ近似します。 epsilonの低い値の場合、輪郭は画像内のオブジェクトのほぼすべての端をグレーズします。より良い理解のためにTHIS PAGEを訪問してください。

これが助けになりました! :)

3

輪郭WRT輪郭RECTをソートセグメント化されたマスクの輪郭

contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

がapproxPolyDPが行くための正しい方法だとは思わない見つけますここに。

あなたが唯一の円を持っているイメージを持っていて、中心と半径を見つけたい場合は、minEnclosingCircleを試してみてください()

あなたは様々な形状があり、円を見つけたいイメージを持っている場合は、してみてくださいハフ変換(長い時間がかかります)またはfitEllipse()は、返す境界ボックスが正方形かどうかを確認します。これらの機能

関連する問題