Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 2 Verarbeiten Sie mehrere Dateien Tipps 3 für Python-Anfänger, um Scikit-Image-Beispiele für sich selbst zu verwenden Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 4 Verwenden Sie die GUI Im Folgenden wird das Beispiel von Scikit-image leicht geändert und der Inhalt für Python-Anfänger hinzugefügt, um damit zu spielen. Ich werde es schreiben.
Dieses Mal werde ich Pythons praktische Netzwerkbibliothek verwenden. Python verfügt über genügend Bibliotheken, um [HTTP-Server](Basis-HTTP-Server - HTTP-Server mit Grundfunktionen) und [POP-Client](poplib - POP3-Protokoll-Client) nur mit den Standardbibliotheken zu schreiben. Es hat die Funktion, dass sie gemeinsam mit Windows, Linux und Mac verwendet werden können. Sie können Netzwerkprogramme schreiben, ohne sich um CPU-Ender- oder Zeichencodeprobleme kümmern zu müssen.
Blog-Artikel Übertragen von Webkamerabildern mit Python-Socket
Hat ein serverseitiges Skript und ein clientseitiges Skript. Das Kamerabild wird auf der Serverseite erfasst und das Bild wird vom Server auf der Clientseite empfangen und angezeigt.
Python-Standardbibliothek SocketServer - Framework zum Erstellen eines Netzwerkservers Und OpenCV-Funktionen (importiert durch Import cv2) können eine Netzwerkkamera realisieren.
Es wird ohne Probleme mit der Betriebssystemabhängigkeit und dem CPU-Endian-Problem realisiert.
Lassen Sie uns dieses Mal das Bild verarbeiten und auf dem Webserver dieses Webbeispiels verteilen.
Verarbeiten wir das Image, bevor wir das von OpenCV auf der Serverseite erfasste Image codieren.
[Normalized Cut] (http://scikit-image.org/docs/dev/auto_examples/segmentation/plot_ncut.html#example-segmentation-plot-ncut-py) Lassen Sie uns das Eingabebild am Beispiel von ändern.
Das Bild mit normalisiertem Schnitt verliert also detaillierte Merkmale aus dem Originalbild Wird es eine Netzwerkkamera sein, die die Privatsphäre berücksichtigt?
Hier wird der folgende Teil als Funktion aus dem Beispiel des normalisierten Schnitts eines Scicit-Bildes extrahiert.
python
from skimage import segmentation, color
def plotNcut(img):
labels1 = segmentation.slic(img, compactness=30, n_segments=200)
out1 = color.label2rgb(labels1, img, kind='avg')
return out1
Blog-Artikel Übertragen Sie Webkamerabilder mit dem Python-Socket
Im Serverskript in
import cv2.cv as cv
Ich benutze, aber hier, um das Numpy-Datenformat zu verwenden
import cv2
Infolgedessen verwenden wir die cv2-Schnittstelle wie folgt.
cap = cv2.VideoCapture(cameraid)
ret, frame = cap.read()
jpegstring = cv2.imencode('.jpeg', frame)[1].tostring()
Wie Sie sehen können, verfügt Python über eine umfangreiche Netzwerkbibliothek, sodass es sehr einfach ist, die Ergebnisse und die Bildverarbeitung und Bilderkennung mithilfe von Scicit-Image und OpenCV einzubeziehen. Es kann problemlos mit Programmen ausgeführt werden, die unter Windows oder ARM-basiertem Linux geschrieben wurden. Es ist auch ein Vorteil, dass Sie sich nicht um den Unterschied kümmern müssen, selbst wenn die CPUs unterschiedliche Endians haben.
.py:server.py
"""
webcamera server
for opencv 2.3
"""
import SocketServer
import cv2
from skimage import segmentation, color
def plotNcut(img):
labels1 = segmentation.slic(img, compactness=30, n_segments=200)
out1 = color.label2rgb(labels1, img, kind='avg')
return out1
class TCPHandler(SocketServer.BaseRequestHandler):
capture = ''
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print "%s connected:" % self.client_address[0]
ret, frame = cap.read()
frame = plotNcut(frame)
jpegstring = cv2.imencode('.jpeg', frame)[1].tostring()
print len(jpegstring)
self.request.send(jpegstring)
if __name__ == "__main__":
HOST, PORT = '127.0.0.1', 12345
#init camera
cameraid = 0
cap = cv2.VideoCapture(cameraid)
cap.set(3, 640)
cap.set(4, 480)
if not cap:
print "Could not open camera"
exit()
server = SocketServer.TCPServer((HOST, PORT), TCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.capture = cap
server.serve_forever()
.py:client.py
'''
Image receiver
for OpenCV 2.4 python interface
'''
import socket
import numpy
import cv2
def getImageFromServer(HOST, PORT):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.send('HELLO\n')
recvlen = 100
buffer = ''
while recvlen > 0:
receivedstr = sock.recv(1024*8)
recvlen = len(receivedstr)
buffer += receivedstr
print '%d bytes received' %len(buffer)
narray = numpy.fromstring(buffer, dtype='uint8')
decimg = cv2.imdecode(narray, 1)
sock.close()
return decimg
if __name__ == "__main__":
HOST, PORT = "127.0.0.1", 12345
# Receive data from the server and shut down
while 1:
img = getImageFromServer(HOST, PORT)
cv2.imshow('Capture', img)
key = cv2.waitKey(100)
if(int(key) > 27):
break
img = ''
Das obige Skript Überträgt Webkamerabilder mithilfe des Python-Sockets Es ist eine geringfügige Änderung in Bezug auf. client.py ist fast das gleiche. Eine der Attraktionen von Python ist, dass es diese Art der Zusammenarbeit einfach macht.
Ich habe ein Beispiel erstellt, in dem nur das Bild auf dem Server verarbeitet wird. Senden Sie in diesem Beispiel das vom Client aufgenommene Bild Dies ist ein Beispiel für die Rückgabe des vom Server verarbeiteten Bildes an den Client.
Beim Senden von Binärdaten ist es schwierig, das Ende der Binärdaten zu bestimmen. Wenn also die Zeichenfolge "FERTIG" gesendet und gesendet wurde, hatten die Binärdaten bereits das Ende erreicht. Referenz: Socket Programming HOWTO
.py:server2.py
#pylint:disable=C0103
"""
image processing server
"""
import SocketServer
import cv2
import numpy as np
from skimage import segmentation, color
def Ncut(img):
"""
Normalized Cut in scikit-image
"""
labels1 = segmentation.slic(img, compactness=30, n_segments=200)
out1 = color.label2rgb(labels1, img, kind='avg')
return out1
class TCPHandler(SocketServer.BaseRequestHandler):
capture = ''
def handle(self):
"""
Image processing server
"""
# self.request is the TCP socket connected to the client
recvlen = 100
buff = ''
while recvlen > 0:
receivedstr = self.request.recv(1024*8)
if receivedstr.find("DONE") > -1:
break
recvlen = len(receivedstr)
buff += receivedstr
print '%d bytes received' % len(buff)
narray = np.fromstring(buff, dtype='uint8')
frame = cv2.imdecode(narray, 1)
print "decoded image", frame.shape
frame = Ncut(frame)
print "passed Ncut"
jpegstring = cv2.imencode('.jpeg', frame)[1].tostring()
print len(jpegstring)
self.request.send(jpegstring)
if __name__ == "__main__":
HOST, PORT = '127.0.0.1', 12345
server = SocketServer.TCPServer((HOST, PORT), TCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
.py:client2.py
#pylint:disable=C0103
'''
Image client
'''
import socket
import numpy as np
import cv2
def getProcessedImageFromServer(HOST, PORT, frame):
"""
send image and recieve proccessed image from the server
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
jpegstring = cv2.imencode('.jpeg', frame)[1].tostring()
print len(jpegstring)
sock.send(jpegstring)
sock.send("DONE\n")
recvlen = 100
buff = ''
while recvlen > 0:
receivedstr = sock.recv(1024*8)
recvlen = len(receivedstr)
buff += receivedstr
print '%d bytes received' %len(buff)
narray = np.fromstring(buff, dtype='uint8')
decimg = cv2.imdecode(narray, 1)
sock.close()
return decimg
if __name__ == "__main__":
HOST, PORT = "127.0.0.1", 12345
# Receive data from the server and shut down
cameraid = 0
cap = cv2.VideoCapture(cameraid)
cap.set(3, 320)
cap.set(4, 240)
while 1:
ret, frame = cap.read()
img = getProcessedImageFromServer(HOST, PORT, frame)
cv2.imshow('processed', img)
key = cv2.waitKey(100)
if int(key) > 27:
break
img = ''
Wenn ich jetzt ein Netzwerkprogramm in C ++ schreiben würde, würde ich Boost verwenden. [ip::tcp::socket] (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/ip__tcp/socket.html) boostjp: Boost Japanese Information Site Qiita-Artikel Hinweis zum Öffnen von Raw Socket in Boost.Asio
** Altmodische Unix-abgeleitete C-Socket-Bibliothek: ** Es ist eine Bibliothek der damaligen Zeit, die das TCP / IP-Netzwerk geöffnet hat, und ich denke nicht, dass sie verwendet werden sollte, um neu zu schreiben. Seit der Erstellung des Netzwerks ist Unicode und standardisiertes Multithreading aufgetreten. Die Standard-Unix / Liunx-Bibliotheken können ihre Funktionen aufgrund der Bedeutung der Abwärtskompatibilität nicht aufgeben.
** Windows-spezifische Socket-Bibliothek: ** Es unterscheidet sich erheblich von der Unix-Socket-Bibliothek, und die Portierung der dort geschriebenen Funktionen scheint nicht einfach auf Linux zu portieren.
Wenn Sie die Socket-Kommunikation zwischen mehreren Prozessen verwenden, In C ++ implementierte Programme <-> In Python implementierte Programme Die gesamte Funktion kann durch das Verfahren realisiert werden. Verknüpfen Sie dann das Python-Programm mit C ++. Sie können Funktionen verketten, ohne C ++ - Programme aus Python verknüpfen zu müssen, damit sie verwendet werden können. os.system (cmd) os - Verschiedene Betriebssystemschnittstellen subprocess.Popen () subprocess - Subprocess Management
Bei der Verwendung ist es sehr teuer, den Prozess jedes Mal zu starten und zu beenden. Wenn Sie den Prozess jedoch laufen lassen und ihn über die Socket-Kommunikation realisieren, ist der Overhead hoch Da ist gar nichts.
Ein Beispiel für einen Webserver, der Python verwendet, ist CherryPy. In "Practical Computer Vision" wird ein Beispiel für einen Webserver für die Bildsuche mit CherryPy geschrieben.
Im Fall von C / C ++ ist es sehr schwierig, über die Fähigkeiten zum Schreiben von Programmen im Zusammenhang mit OpenCV und maschinellem Lernen zu verfügen und gleichzeitig über die Fähigkeiten zum gleichzeitigen Schreiben von Socket-Programmen für Server- und Client-Programme zu verfügen. Die Tatsache, dass das Socket-Programm unter Windows und das Socket unter Linux standardmäßig unterschiedlich sind, macht dies ebenfalls schwierig.
Recommended Posts