2017-12-03 1 views
0

Ich versuche, die Pixelwerte der Ecken dieser Dreiecke zu finden. Ich kann Harris-Ecken verwenden und ein numpy Array aller x, y für die Ecken erhalten. Ich möchte diese Eckwerte in einer 2D-Liste namens Ecken wie [[x1,y1], [x2,y2], [x3,y3]] gespeichert werden.Python offen cv Ecken

Auch, wenn ich Harris Ecken auf einem schwarzen Dreieck (Code unten veröffentlicht), weißen Hintergrund verwenden, sind die Ergebnisse als solche (array([121, 121, 122, 122, 123, 123, 124, 124, 359, 359, 359, 359, 359, 359, 360, 360, 360, 360], dtype=int64), array([240, 241, 240, 241, 240, 241, 240, 241, 121, 122, 123, 358, 359,360, 121, 122, 359, 360], dtype=int64)). Ich muss die 2D-Liste von 3 Ecken aus dieser Liste erstellen.

img = cv2.imread(filePath) 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
gray = numpy.float32(gray) 
dst = cv2.cornerHarris(gray,2,3,0.04) 
x,y = numpy.nonzero(dst > 0.01 * dst.max()) 
+0

Also, was passiert ist, erhalten Sie mehrere Punkte, die in der Nähe sind, und Sie müssen diese zu einem einzigen Punkt zusammenführen. Es gibt zwei grundlegende Möglichkeiten, dies zu tun. Entweder führen Sie [* k * -means] (https://docs.opencv.org/3.0-beta/modules/core/doc/clustering.html#kmeans) auf den Punkten mit * k = 3 * aus, um sie zusammen zu gruppieren und Holen Sie sich die Zentren, oder finden Sie einfach die Schwerpunkte jedes Pixelblocks, so wie sie sich auf der Maske befinden, mit ['connectedComponentsWithStats()'] (https://docs.opencv.org/3.0-beta/modules/imgproc/doc/structural_analysis_and_shape_descriptors .html # verbundene Komponenten). –

Antwort

0

Mit den aktuellen Werten, die Ihnen die einfachste Sache zu tun haben, ist k -Mittel gelten, die die Daten in k Gruppen Cluster und Ihnen die Zentren dieser Gruppen. Sie können das OpenCV k -Mittel Python Tutorial here und auch die cv2.kmeans() docs überprüfen. Wir schaffen eine numpy Array die Punkte zusammenhalten als 32-Bit schwimmt für den Eingang cv2.kmeans()

>>> X = np.array([121, 121, 122, 122, 123, 123, 124, 124, 359, 359, 359, 359, 359, 359, 360, 360, 360, 360], dtype=np.int64) 
>>> Y = np.array([240, 241, 240, 241, 240, 241, 240, 241, 121, 122, 123, 358, 359, 360, 121, 122, 359, 360], dtype=np.int64) 

:

>>> points = np.array([[x, y] for x, y in zip(X,Y)], dtype=np.float32) 

Die endgültige

So mit Punkten in Form Start Sache ist cv2.kmeans() und ergreifen Sie die Zentren laufen:

>>> criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) 
>>> centers = cv2.kmeans(points, 3, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)[2] 
>>> centers 
array([[ 122.5  , 240.5  ], 
     [ 359.3999939 , 359.20001221], 
     [ 359.3999939 , 121.80000305]], dtype=float32) 

Of Natürlich können Sie auf die nächste ganze Zahl runden, wenn Sie danach brauchen.