52

画像内の単純な幾何学的形状を検出するために(iOSで)必要なこのプロジェクトがあります。

ここに画像の説明を入力

インターネットを検索した結果、これに最適なツールは OpenCV であると結論付けました。問題は、2 時間前まで、OpenCV が何であるかを知らず、画像処理に関連することをリモートで行ったことさえなかったということです。私の主な経験は、JS/HTML、C#、SQL、Objective-C です...

どこから始めればよいですか?

私は消化できたこの答えを見つけました.すでに他のものを読んで、OpenCVはポイント/コーナーを含む形状の配列を返す必要があることを理解しています.これは本当ですか? また、円または半円はどのように表されますか? また、形状の向きはどうですか?

同様の機能を実証できるデモ iOS プロジェクトをご存知ですか?

4

3 に答える 3

90

これらの規則的な形状しかない場合は、次のような簡単な手順があります。

  1. 画像内の輪郭を見つけます(画像は質問で指定されているようにバイナリである必要があります)
  2. 関数を使用して各輪郭を近似しapproxPolyDPます。
  3. まず、すべての形状の近似輪郭の要素数を確認します。形を認識することです。たとえば、正方形には 4、五角形には 5 があります。(円は16点、半円は9点です。)
  4. 次に、色を割り当て、テスト画像のコードを実行し、その番号を確認して、対応する色で塗りつぶします。

以下はPythonでの私の例です:

import numpy as np
import cv2

img = cv2.imread('shapes.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(gray,127,255,1)

contours,h = cv2.findContours(thresh,1,2)

for cnt in contours:
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
    print len(approx)
    if len(approx)==5:
        print "pentagon"
        cv2.drawContours(img,[cnt],0,255,-1)
    elif len(approx)==3:
        print "triangle"
        cv2.drawContours(img,[cnt],0,(0,255,0),-1)
    elif len(approx)==4:
        print "square"
        cv2.drawContours(img,[cnt],0,(0,0,255),-1)
    elif len(approx) == 9:
        print "half-circle"
        cv2.drawContours(img,[cnt],0,(255,255,0),-1)
    elif len(approx) > 15:
        print "circle"
        cv2.drawContours(img,[cnt],0,(0,255,255),-1)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下は出力です。

ここに画像の説明を入力

通常の形状でのみ機能することを忘れないでください。

円を見つける代わりに、 を使用できますhoughcirclesここでチュートリアルを見つけることができます。

iOS に関しては、OpenCV 開発者がこの夏にいくつかの iOS サンプルを開発しています。そのため、彼らのサイト (www.code.opencv.org) にアクセスして連絡してください。

ここで彼らのチュートリアルのスライドを見つけることができます: http://code.opencv.org/svn/gsoc2012/ios/trunk/doc/CVPR2012_OpenCV4IOS_Tutorial.pdf

于 2012-07-11T07:17:41.953 に答える
1

テンプレート マッチングを使用して、画像内の形状を検出することもできます。

于 2013-04-17T17:32:27.417 に答える