4

次の画像について考えてみます。

交通の画像

これは、トラフィックのビデオ映像からのフレームです。

私がやりたいのは、対向するトラフィックだけを切り取って分析することです。特定の座標を提供することで、たとえばポリゴンを抽出できる高速で効率的な方法が必要です。

私はOpenCVとPythonに取り組んでいます。

編集:
私が見る1つのオプションは、画像をNumpy配列として扱い、forループを使用して特定の要素を抽出することですが、それは効率的ではなく、それが適切なことかどうかわかりません。

4

3 に答える 3

5

輪郭を使用して、関心のある領域(任意の形状)を抽出することをお勧めします。このドキュメントを参照してください:輪郭の描画

アプローチは次のようになります。

  1. MouseEventListenerをウィンドウにアタッチすることにより、画像自体のいずれかで座標を構成するポイントをマークします。
  2. を使用してマスク画像を作成します。(すべてゼロ)
  3. これらの座標のセットを使用して、cv2.drawContours()メソッドを使用して、マスクイメージに必要な形状を描画し、それを白色(255)で塗りつぶします。
  4. 元のグレースケール画像を使用してBitwise_And操作を実行します。

サンプルコード:

#Function
def on_mouse(event, x, y, flags,(cPts,overlayImage,resetImage)):
    if event==cv.CV_EVENT_LBUTTONUP:
        cPts[0].append([x,y])
        cv2.circle(overlayImage,(x,y),5,(255),-1)
    elif event==cv.CV_EVENT_RBUTTONUP:
        cPts[0]=[]
        print cPts
        overlayImage[:]=resetImage[:]


#Main Program
cvImage=cv2.imread(inputImageFilePath)
grayscaleImage=cv2.cvtColor(cvImage,cv.CV_BGR2GRAY)
overlayImage=np.copy(grayscaleImage)

cv2.namedWindow('preview')
cPts=[[]]
cv2.setMouseCallback('preview',on_mouse,(cPts,overlayImage,grayscaleImage))
opacity=0.4
while True:
    displayImage=cv2.addWeighted(overlayImage,opacity,grayscaleImage,1-opacity,0)
    cv2.imshow('preview',displayImage)
    keyPressed=cv2.waitKey(5)
    if keyPressed==27:
        break
    elif keyPressed==32:
        print cPts
        cv2.drawContours(overlayImage,np.array(cPts),0,255)
        maskImage=np.zeros_like(grayscaleImage)
        cv2.drawContours(maskImage,np.array(cPts),0,255,-1)
        extractedImage=np.bitwise_and(grayscaleImage,maskImage)
        cv2.imshow('extractedImage',extractedImage)
cv2.destroyAllWindows()
于 2013-03-16T15:29:23.990 に答える
1

アルゴリズムのバージョンを提案できます。

  1. まず、関心のない画像の部分を破棄します。静止カメラの場合は、この領域を手動で計算できます。それ以外の場合は、ライン検出アルゴリズムを使用してみてください
  2. 次に、cvThresholdを使用して背景を抽出します(背景抽出を使用する良い例)。
  3. 抽出後、輪郭を見つけてその形状を分析し、オブジェクト(車、人など)を区別できます。

これがお役に立てば幸いです。

于 2013-03-14T08:51:08.697 に答える
1

さて、私はあなたが次のようなことをすることを提案します:

  1. 照明を中心としたさまざまなものに応じて、画像をさまざまな領域に分割します。
  2. 次に、地域ごとに、重要な領域(トラフィック)を重要でない領域(樹木など)から分離するためのしきい値を適用します。(cv2.threshold
  3. 輪郭を使用して、車両を他のものと区別することができます。(cv2.findContoursおよびその他)

ビデオのストリームなどがある場合は、モーション検出なども使用できます。

あなたが役に立つと思うかもしれないいくつかのリンク:

于 2013-03-14T15:18:55.090 に答える