Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 5 In Netzwerk-Apps integrieren

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) Normalized Cut 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.


** Hinzugefügt: Bildverarbeitungsserver **

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 = ''

** Hinweis: Beim Schreiben in Boost und C ++ **

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.

** Hinweis: Bedeutung der Verwendung der Socket-Kommunikation **

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.

** Hinweis: Webserver mit Python **

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.

** Hinweis: Im Fall von C ++ **

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.

Tipp 6 Python-Code verbessern

Recommended Posts

Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 5 In Netzwerk-Apps integrieren
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 4 Verwenden Sie die GUI
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 3 Schreiben Sie in eine Datei
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 9 Verwendung aus der C-Sprache
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 6 Verbessern Sie den Python-Code
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 2 Verarbeiten Sie mehrere Dateien
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 7 Erstellen eines Moduls
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 8 Verarbeitungszeitmessung und Profiler
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
Web Scraping für Anfänger in Python (1)
Web Scraping für Anfänger in Python (4) -1
[Python] Organisieren der Verwendung für Anweisungen
Verwendung von "deque" für Python-Daten
Memo Nr. 4, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Der schnellste Weg für Anfänger, um Python zu beherrschen
Python für Super-Anfänger Super-Anfänger Python # Einfach loszuwerden
Verwendung von Template Engine für Network Engineer
Memo Nr. 3, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Memo Nr. 1, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
~ Tipps für Python-Anfänger mit Liebe von Pythonista ① ~
Verwendung von Datenanalysetools für Anfänger
Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)
Memo Nr. 2, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Memo Nr. 7, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Einführung in die Programmierung (Python) TA Tendenz für Anfänger
Memo Nr. 6 für Python-Anfänger zum Lesen von "Detaillierte Erklärung der Python-Grammatik"
Wie man Python für Anfänger schneller macht [numpy]
~ Tipps für Python-Anfänger mit Liebe von Pythonista ② ~
Memo Nr. 5, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
Web Scraping für Anfänger in Python (1) Verbesserte Version
So konvertieren Sie den Python # -Typ für Super-Anfänger von Python: str
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
Web-Scraping für Anfänger mit Python (4) --2 Scraping auf Cloud Shell
Python Lehrbuch für Anfänger
OpenCV für Python-Anfänger
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
[Für Anfänger] Verwendung der for-Anweisung unter Linux (Variablen usw.)
TensorFlow-Lernmethode für Profis der freien Künste und Python-Anfänger
Tipps zum Codieren kurz und einfach in Python zu lesen
Wie nutzt man maschinelles Lernen für die Arbeit? 03_Python-Codierungsverfahren
Verwenden Sie Mitmproxy, um die API Ihrer App in eine Entwicklungsumgebung zu zwingen
So konvertieren Sie den Python # -Typ für Python-Superanfänger: int, float
[Für Anfänger] Skript innerhalb von 10 Zeilen (4. Verbindung von Python zu sqlite3)
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
[Python] Einführung in die Diagrammerstellung mit Corona-Virendaten [Für Anfänger]
Verwenden Sie eine Skriptsprache für ein komfortables C ++ - Leben - OpenCV-Port Python zu C ++ -