Ich schreibe ein computer vision library von Grund auf in Python mit einer rpi
Kamera zu arbeiten. Im Moment habe ich die Konvertierung in greyscale
und einige andere grundlegende img
Operationen, die beide relativ schnell laufen auf meiner model B
rpi3
implementiert.So verbessern Sie die Effizienz eines Sobel Kantendetektors
Allerdings ist meine Kantendetektion mit dem Operator sobel
(wikipedia description) viel langsamer als die anderen Funktionen, obwohl es funktioniert. Hier ist sie:
def sobel(img):
xKernel = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
yKernel = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
sobelled = np.zeros((img.shape[0]-2, img.shape[1]-2, 3), dtype="uint8")
for y in range(1, img.shape[0]-1):
for x in range(1, img.shape[1]-1):
gx = np.sum(np.multiply(img[y-1:y+2, x-1:x+2], xKernel))
gy = np.sum(np.multiply(img[y-1:y+2, x-1:x+2], yKernel))
g = abs(gx) + abs(gy) #math.sqrt(gx ** 2 + gy ** 2) (Slower)
g = g if g > 0 and g < 255 else (0 if g < 0 else 255)
sobelled[y-1][x-2] = g
return sobelled
und es mit diesem greyscale
Bild einer Katze läuft:
ich diese Antwort erhalten, die richtig scheint:
Die Anwendung der Bibliothek, und diese Funktion ist insbesondere auf einem Schachspielroboter, in dem die Kante erkennt Ion wird helfen, den Ort der Stücke zu erkennen. Das Problem ist, dass es >15
Sekunden dauert, um zu laufen, was ein signifikantes Problem ist, da es zu der Zeit hinzufügen wird, die der Roboter braucht, um sich viel zu bewegen.
Meine Frage ist: Wie kann ich es beschleunigen?
Bisher habe ich ein paar Dinge ausprobiert:
Statt
squaring
dannadding
, dannsquare rooting
diegx
undgy
Werte die Gesamt Steigung zu bekommen, ich habe geradesum
dieabsolute
Werte. Dies verbesserte die Geschwindigkeit um einen ordentlichen Betrag.Mit einem niedrigeren
resolution
Bild von derrpi
Kamera. Dies ist natürlich ein einfacher Weg, um diese Operationen schneller zu machen, aber es ist nicht wirklich so brauchbar, da es immer noch ziemlich langsam bei der minimal nutzbaren Auflösung von480x360
ist, die massiv von der Kamera max3280x2464
reduziert ist.Schreiben verschachtelte for-Schleifen, um die anstelle der
np.sum(np.multiply(...))
zu tun. Dies endete leicht langsamer, die ich als vonnp.multiply
überrascht, da ein neues Array zurückgibt, dachte ich, dass es schneller sein sollte, es mitloops
zu tun. Ich denke jedoch, dass dies aufgrund der Tatsache sein kann, dassnumpy
meist inC
geschrieben wird oder dass das neue Array nicht wirklich gespeichert wird, so dauert es nicht lange, aber ich bin mir nicht sicher.
Jede Hilfe wäre sehr geschätzt - ich glaube, die Hauptsache für Verbesserung Punkt ist 3
, das heißt die matrix
Multiplikation und Summierung.
Haben Sie versucht, OpenCV Sobel? Haben Sie auch 2D Faltung ausprobiert? – Divakar
@Divakar Ja, ich habe die ganze Erkennung von Schachfiguren, die mit 'OpenCV' arbeiten, aber ich versuche es von Grund auf in Python zu schreiben. 2D Faltung ist ziemlich breit, ich dachte, ich hätte es bereits implementiert ... –
Ich bin nicht klar - Sie sagen, Sie können nicht [2D Convolution von Scipy] (https://docs.scipy.org/doc/scipy -0.16.0/Referenz/generiert/scipy.signal.convolve2d.html)? Oder dass du es ausprobiert hast und sich als langsamer herausstellte? – Divakar