2016-11-27 14 views
-3

Iは、矢印の束と、この sampleOpenCVの - ハウツー検索輪郭(矢印)配向

ようなイメージを持っています。私は、画像上の大部分の矢印の向きが何であるかを知りたいと思います。

私はOpenCVのいくつかの読み取りを行なったし、私はやや正確な結果を得るために管理私のスクリプトではfolowingコード

import numpy as np 
import cv2 
import math 

img = cv2.imread('sample7.png') 
height, width, channels = img.shape 
img = cv2.resize(img, (width*8, height*8))      
img = cv2.medianBlur(img,5) 
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 


ret,th1 = cv2.threshold(imgray,100,255,cv2.THRESH_BINARY) 
edged=cv2.Canny(th1,127,200) 


im2,contours,h = cv2.findContours(edged.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
(img2,cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
screenCnt=None 
flag_t=False 
flag_s=False 

kot=[] 

for c in cnts: 
    approx = cv2.approxPolyDP(c, 0.01*cv2.arcLength(c,True), True) 

    area = cv2.contourArea(c) 
    #print area 
    if int(len(approx)) > 8 and area > 600 and area < 1100: 
     anglelist=[] 
     cv2.drawContours(img, [approx], -1, (0, 255, 255), 1) 
     (x,y),(MA,ma),angle = cv2.fitEllipse(c) 
     print round(angle,-1) 
     kot.append(round(angle,-1)) 


d = {} 
for elm in kot: 
    d[elm] = d.get(elm, 0) + 1 
counts = [(j,i) for i,j in d.items()] 
count, max_elm = max(counts) 


print 'most common:' 
print max_elm 
cv2.imshow('img',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

を思い付きます。問題は、矢印が上下または左右に向いている場合、Imが同じ結果を得ていることです。矢印が左か右を指しているかどうかを知るには?下の写真の両方のケースでは、私は同じ結果を90度前後で得る。つもりである enter image description here enter image description here

+0

これは明らかにコンピュータで生成されたイメージです。画像を生成したコードからより多くの情報を得ることができれば、はるか先に進むでしょう。おそらく、追加のメタデータをファイルに添付する可能性があります。しかし、はい、OpenCVには多くの画像処理があります。画像を処理することがあなたの唯一の選択肢であれば、これは非常に良い場所です。 –

答えて

1

は、いくつかのコンピュータビジョンの基本の知識がなくてもタフな作業になります。私が行く方法はopencvで画像を読むことです。opencvは数が少ない配列を残します。グレースケール画像としてロードし、ソーベルフィルタのようなマスクを使用してエッジを検出します。さらに良いことに、キャニーオペレーター。あなたが最初にこれらを見て、彼らがどのように働くのがベストですか?これらを使用すると、画像とその方向のエッジを検出することができます。あなたはそれで作業することができます。もう一つのより高度な(おそらく良い)オプションは、画像内の線(または他の幾何学的なオブジェクト)を検出することができるハフ変換を使用することです。これらはすべてopencvに入っていますが、おそらく動作の仕方を理解する必要があります。お役に立てれば。