2016-11-27 7 views
-3

Ich habe ein Bild wie diese sampleOpenCV - Howto Kontur (Pfeil) Ausrichtung

mit Bündel von Pfeilen. Ich möchte herausfinden, welche Ausrichtung die Mehrheit der Pfeile auf dem Bild hat.

habe ich einige der Lektüre von opencv und kommen mit dem folowing Code

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() 

Mit meinem Skript schaffe ich etwas genaue Ergebnisse zu erzielen. Das Problem ist, dass ich dieselben Ergebnisse bekomme, wenn die Pfeile nach oben oder unten, nach links oder nach rechts ausgerichtet sind. Woher weiß man, ob der Pfeil nach links oder rechts zeigt? In beiden Fällen der Bilder unten bekomme ich das gleiche Ergebnis um 90 Grad. enter image description here enter image description here

+0

Dies ist offensichtlich ein computergeneriertes Bild. Sie wären viel weiter voraus, wenn Sie mehr Informationen aus dem Code erhalten, der das Bild generiert hat. Vielleicht könnte es zusätzliche Metadaten an die Datei anhängen. Aber ja, OpenCV hat eine Menge Bildverarbeitung, es ist ein sehr guter Startpunkt, wenn die Verarbeitung der Bilder Ihre einzige Option ist. –

Antwort

1

Das Gonna ist eine schwierige Aufgabe sein, ohne Kenntnis einiger Computer-Vision-Grundlagen. Der Weg, den ich gehen würde, ist, das Bild mit opencv zu lesen, das Sie mit einem numby Array verlässt. Laden Sie es als Graustufenbild und verwenden Sie eine Maske wie den Sobel-Filter, um Kanten zu erkennen. Noch besser, der schlaue Betreiber. Am besten ist es, wenn Sie diese zuerst betrachten und wie sie funktionieren. Mit diesen können Sie Kanten in Bildern und deren Richtungen erkennen. Du könntest damit arbeiten. Eine weitere erweiterte (wahrscheinlich bessere) Option ist die Verwendung einer Hough-Transformation, die Linien (oder beliebige andere geometrische Objekte) in Bildern erkennen kann. Diese sind alle in opencv gepackt, aber Sie werden wahrscheinlich ein gewisses Verständnis davon benötigen, wie sie funktionieren. Hoffe das hilft.