2017-11-13 24 views
0

提供されている画像内の形を認識する方法を学習しています。私は、幾何学的物体に存在する辺の数によって形状を認識することができます。しかし、今私は画像内の正方形と長方形を区別する方法があるのだろうか? ここに私のコードです。現在、幾何学図形に輪郭を描いています。opencv2 pythonを使用した画像の長方形と正方形の区別

import cv2 

raw_image = cv2.imread('test1.png') 
cv2.imshow('Original Image', raw_image) 
cv2.waitKey(0) 

bilateral_filtered_image = cv2.bilateralFilter(raw_image, 5, 175, 175) 
cv2.imshow('Bilateral', bilateral_filtered_image) 
cv2.waitKey(0) 

edge_detected_image = cv2.Canny(bilateral_filtered_image, 75, 200) 
cv2.imshow('Edge', edge_detected_image) 
cv2.waitKey(0) 

_, contours, hierarchy = cv2.findContours(edge_detected_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

contour_list = [] 
for contour in contours: 
    approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True) 
    area = cv2.contourArea(contour) 
    if ((len(approx) >= 3)): 
     contour_list.append(contour) 

cv2.drawContours(raw_image, contour_list, -1, (0,0,0), 2) 
cv2.imshow('Objects Detected',raw_image) 
cv2.waitKey(0) 

This is sample image

+1

いくつかのサンプル入力画像、好ましくはバイナリ画像をアップロードできる方が良いでしょう。また、あなたの図は回転していますか? – ZdaR

+0

はいシェイプはお互いに回転することができ、同じイメージ内に複数のシェイプがある可能性があります – HrishikeshKulkarni

+0

裾、多分両側の等価性をチェックしてください。これは、四角形と四角形を区別するものです。 –

答えて

2

幅と高さが同じ場合は正方形です。そうでなければその長方形。

for contour in contours: 
    approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True) 
    area = cv2.contourArea(contour) 
    if ((len(approx) == 4)): 
     (x, y, w, h) = cv2.boundingRect(approx) 
     if ((float(w)/h)==1): 
      cv2.putText(raw_image, "square", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, 0, 2) 
     else: 
      cv2.putText(raw_image, "rectangle", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, 0, 2) 

     contour_list.append(contour) 

この変更では、正方形と長方形のみが検出されます。円を検出するためにforループに必要な変更を加えます。あなたはその区別をするためにlen(approx)で作業することができます。

enter image description here

+0

まさに私がしたいこと。私は関数cv2.boundingRect(approx)を探していました。私はopencvのドキュメントでそれを創設しました。 BTWは迅速な対応に感謝します。 – HrishikeshKulkarni

1

私は別の方法があります:

  1. が接続されているすべてのコンポーネントを検索します。

  2. この場合、複雑なオブジェクトではない単純な幾何学的ボディがあるため、ハリスコーナーアルゴリズムを使用してコーナーポイントを特徴点として使用することができます。

  3. これらの特徴点を同じ接続コンポーネントにグループ化します。

  4. 接続されているすべてのコンポーネントのフィーチャーポイント間の関係(距離/角度)を使用すると、これらの幾何学的形状を分類できます。

1

長方形と正方形との間の差は、正方形が特別な矩形作る4つの等しい辺を有することです。私は幼稚園でこれを学んだ。

正方形を識別する方法は数多くあります。

その周囲は常にSQRT(面積)に等しい、したがって、その円形度が常に0.0625

すべての角の間の距離がAまたは *のSQRT(2)

のいずれかである重心/同一の距離aを有しています2〜4面すべて

...

名前を付けます。

+0

はい、あなたが言いましたテクニックの1つを使用しています...ありがとう – HrishikeshKulkarni

関連する問題