Ich nahm den Code in der Antwort https://stackoverflow.com/a/10374811/4828720 von Image transformation in OpenCV und versuchte, es an ein Bild von mir anzupassen.Was ist falsch an meinem OpenCV remap() ing?
Darin ich die Pixelkoordinaten der Zentren der karierten Ziegel identifiziert, hier dargestellt:
Meine Zielauflösung ist 784. I berechnet die Zielkoordinaten der Pixel. Mein resultierender Code ist dies:
import cv2
from scipy.interpolate import griddata
import numpy as np
source = np.array([
[315, 15],
[962, 18],
[526, 213],
[754, 215],
[516, 434],
[761, 433],
[225, 701],
[1036, 694],
], dtype=int)
destination = np.array([
[14, 14],
[770, 14],
[238, 238],
[546, 238],
[238, 546],
[546, 546],
[14, 770],
[770, 770]
], dtype=int)
source_image = cv2.imread('frames.png')
grid_x, grid_y = np.mgrid[0:783:784j, 0:783:784j]
grid_z = griddata(destination, source, (grid_x, grid_y), method='cubic')
map_x = np.append([], [ar[:,1] for ar in grid_z]).reshape(784,784)
map_y = np.append([], [ar[:,0] for ar in grid_z]).reshape(784,784)
map_x_32 = map_x.astype('float32')
map_y_32 = map_y.astype('float32')
warped_image = cv2.remap(source_image, map_x_32, map_y_32, cv2.INTER_CUBIC)
cv2.imwrite("/tmp/warped2.png", warped_image)
Wenn ich dies ausführen, keine der Quellpunkte endet an ihrem Bestimmungsort, aber ich bekomme eine verzogene Chaos statt. Ich fügte hinzu, die Zielpunkte auf hier:
Wohin ich gehe nicht in Ordnung? Ich habe festgestellt, dass meine Gitter- und Kartenfelder nicht so gut verteilt sind wie im Beispiel. Habe ich zu wenige Punkte? Brauche ich sie in einem regelmäßigen Raster? Ich habe nur versucht, die vier Punkte in den äußeren Ecken auch ohne Glück zu benutzen.
Ich wollte einen Absatz einfügen, der besagt, dass Perspektivenkorrektur nicht ausreicht. Es ist fast, aber ich will mehr. Sorry und danke! Unter http://i.imgur.com/Is5rwrq.png sind einige schwarze Balken über Ihrem Ergebnis zu sehen, wie Sie sehen können, dass in einigen Teilen des Bildes eine gekrümmte Verzerrung vorliegt. Meine 8 Punkte sind eigentlich nur eine Vereinfachung, in Wirklichkeit würde ich viel mehr verwenden. Ich bin einfach verloren, warum es jetzt überhaupt nicht funktioniert. – bugmenot123
In diesem Fall würde ich vorschlagen, dass Sie jeden einzelnen Schnittpunkt von Linien erkennen. Es gibt ein brilliantes Beispiel mit Quellcode hier: http://stackoverflow.com/questions/10196198/how-to-remove-convexity-defects-in-a-sudoku-square/11366549#11366549 – tfv
Das war mein Plan aber es hat nicht aus der Box für meine Bilder gearbeitet (mein Raster ist nicht annähernd so bemerkenswert) und ich dachte, Remap wäre sowieso einen Versuch wert. – bugmenot123