2016-05-13 8 views
3

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?

Meine Quelle Bild: My source image

Darin ich die Pixelkoordinaten der Zentren der karierten Ziegel identifiziert, hier dargestellt:

Source points

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:

My result

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.

Antwort

0

Das ganze Problem war, dass ich wieder von numpy der Zeilen/Spalten-Indizierung verwechselt wurde anstelle von x/y. Jemand im #opencv-IRC-Kanal wies darauf hin. Meine Quell- und Ziel-Arrays hatten ihre Spalten haben, eingeschaltet:

source = np.array([ 
    [15, 315], 
    [18, 962], 
    [213, 526], 
    [215, 754], 
    [434, 516], 
    [433, 761], 
    [701, 225], 
    [694, 1036], 
], dtype=int) 

destination = np.array([ 
    [14, 14], 
    [14, 770], 
    [238, 238], 
    [238, 546], 
    [546, 238], 
    [546, 546], 
    [770, 14], 
    [770, 770] 
], dtype=int) 

Dann ist es wie beabsichtigt funktioniert (das hässliche Verziehen ignorieren, war dies eine vereinfachte Liste der Koordinaten den Fehler zu finden):

enter image description here

1

Wenn Sie nur 8 Punkte zum Verwerfen haben und keine echte Verzerrung in Ihrem Bild, würde ich vorschlagen, die perspektivische Transformation zu verwenden, wie beschrieben here.

Der von Ihnen angegebene Link versucht, zusätzliche Verzerrungen zu eliminieren, die zu nicht geraden Linien führen, aber alle Linien in Ihrem Bild sind gerade.

-Code würde wie folgt aussehen:

import cv2 
import numpy as np 
import matplotlib.pyplot as plt 

img = cv2.imread('image.png') 
rows,cols,ch = img.shape 

pts1 = np.float32([ 
    [315, 15], 
    [962, 18], 
    [225, 701], 
    [1036, 694], 
], dtype=int) 

pts2 = np.float32([ 
    [14, 14], 
    [770, 14], 
    [14, 770], 
    [770, 770] 
], dtype=int) 

M = cv2.getPerspectiveTransform(pts1,pts2) 

dst = cv2.warpPerspective(img,M,(784,784)) 

plt.subplot(121),plt.imshow(img),plt.title('Input') 
plt.subplot(122),plt.imshow(dst),plt.title('Output') 
plt.show() 

enter image description here

+0

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

+0

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

+0

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

Verwandte Themen