Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 5 Incorporer dans les applications réseau

Conseils pour les débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes Conseils pour les débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 2 Traiter plusieurs fichiers Astuces 3 pour que les débutants en Python utilisent des exemples d'images Scikit pour eux-mêmes Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 4 Utilisez l'interface graphique Ensuite, l'exemple de Scikit-image est légèrement modifié et le contenu pour les débutants en Python est ajouté pour jouer avec. Je vais l'écrire.

Cette fois, j'utiliserai la bibliothèque réseau pratique de Python. Python a suffisamment de bibliothèques pour écrire [Serveur HTTP](Serveur HTTP de base - Serveur HTTP avec des fonctions de base) et [Client POP](poplib - Client de protocole POP3) avec uniquement les bibliothèques standard. Il a la particularité de pouvoir être utilisé en commun avec Windows, Linux et Mac. Vous pouvez écrire des programmes réseau sans avoir à vous soucier des problèmes de processeur ou de code de caractères.

Article de blog Transférer des images de caméra Web à l'aide d'un socket python

Possède un script côté serveur et un script côté client. L'image de la caméra est acquise côté serveur et l'image est reçue et affichée depuis le serveur côté client.

Bibliothèque standard Python SocketServer - framework pour la construction d'un serveur réseau Une caméra réseau ne peut être réalisée qu'avec les fonctions d'OpenCV et d'OpenCV (celle importée par import cv2).

Il est réalisé sans aucun problème de dépendance du système d'exploitation et de problème de CPU endian.

Cette fois, considérons le traitement de l'image et la distribution de l'image sur le serveur Web de cet exemple Web.

Traitons l'image avant d'encoder l'image acquise par OpenCV côté serveur.

[Normalized Cut] (http://scikit-image.org/docs/dev/auto_examples/segmentation/plot_ncut.html#example-segmentation-plot-ncut-py) Normalized Cut Changeons l'image d'entrée avec l'exemple de.

L'image avec la coupe normalisée perd les caractéristiques détaillées de l'image d'origine, donc Sera-ce une caméra réseau avec une certaine considération pour la confidentialité?

Ici, la partie suivante est extraite en fonction de l'exemple de coupe normalisée de scicit-image.

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

Article de blog Transférer des images de caméra Web à l'aide du socket python Dans le script serveur dans import cv2.cv as cv
J'utilise, mais ici pour utiliser le format de données numpy import cv2 En conséquence, nous utiliserons l'interface cv2 comme suit.


cap = cv2.VideoCapture(cameraid)
ret, frame = cap.read()
jpegstring = cv2.imencode('.jpeg', frame)[1].tostring()

Comme vous pouvez le voir, Python dispose d'une riche bibliothèque réseau, il est donc très facile d'incorporer les résultats et d'incorporer le traitement d'image et la reconnaissance d'image à l'aide de scicit-image et d'OpenCV. Il peut être facilement exécuté sur des programmes écrits sur Windows ou sur Linux ARM. C'est également un avantage de ne pas avoir à vous soucier de la différence même si les processeurs ont des endians différents.

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

Le script ci-dessus Transfère les images de la caméra Web à l'aide du socket python Il s'agit d'une légère modification par rapport à. client.py est presque le même. L'un des attraits de Python est qu'il facilite ce type de coopération.


** Ajouté: serveur de traitement d'image **

J'ai créé un exemple de traitement de l'image uniquement sur le serveur. Dans cet exemple, envoyez l'image prise par le client Ceci est un exemple de renvoi de l'image traitée par le serveur au client.

Lors de l'envoi de données binaires, il est difficile de déterminer la fin des données binaires, donc lorsque la chaîne de caractères "DONE" a été envoyée et qu'elle a été envoyée, les données binaires avaient déjà atteint la fin. Référence: 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 = ''

** Remarque: lors de l'écriture en Boost et C ++ **

Si je devais écrire un programme réseau en C ++ maintenant, j'utiliserais Boost. [ip::tcp::socket] (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/ip__tcp/socket.html) boostjp: site d'informations japonais Boost Article Qiita Note pour l'ouverture de Raw Socket dans Boost.Asio

** Bibliothèque de sockets C dérivée d'Unix à l'ancienne: ** C'est une bibliothèque de l'époque qui a ouvert le réseau TCP / IP, et je ne pense pas qu'elle devrait être utilisée pour recommencer à écrire. Depuis la création du réseau, l'unicode est apparu et le multithreading standardisé est apparu. Les bibliothèques standard Unix / Liunx ne peuvent pas abandonner leurs fonctions en raison de l'importance de la rétrocompatibilité.

** Bibliothèque de sockets spécifique à Windows: ** C'est assez différent de la bibliothèque de sockets Unix, et le portage des fonctions qui y sont écrites ne semble pas facile à porter sous Linux.

** Remarque: importance de l'utilisation de la communication par socket **

Si vous utilisez la communication socket entre plusieurs processus, Programmes implémentés en C ++ <-> Programmes implémentés en Python La fonction entière peut être réalisée par la méthode. Ensuite, liez le programme Python à C ++. Vous pouvez concaténer des fonctions sans avoir besoin de lier des programmes C ++ à partir de Python afin qu'ils puissent être utilisés. os.system (cmd) os - Diverses interfaces du système d'exploitation subprocess.Popen () sous-processus - Gestion des sous-processus

Lors de l'utilisation, démarrer et terminer le processus à chaque fois est une procédure très coûteuse, mais si vous laissez le processus en cours d'exécution et que vous le réalisez à l'aide de la communication par socket, la surcharge sera Il n'y en a pas.

** Remarque: serveur Web utilisant Python **

CherryPy est un exemple de serveur Web utilisant Python. Dans "Practical Computer Vision", un exemple de serveur Web pour la recherche d'images à l'aide de CherryPy est écrit.

** Remarque: dans le cas de C ++ **

Dans le cas de C / C ++, il est très difficile d'avoir les compétences pour écrire des programmes liés à OpenCV et l'apprentissage automatique, tout en ayant les compétences pour écrire des programmes socket pour les programmes serveur et les programmes clients en même temps. Le fait que le programme socket sous Windows et le socket sous Linux soient différents par défaut rend également cela difficile.

Astuce 6 Améliorer le code Python

Recommended Posts

Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 5 Incorporer dans les applications réseau
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 4 Utiliser l'interface graphique
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 3 Écrire dans un fichier
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image par eux-mêmes
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 9 Utilisation à partir du langage C
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 6 Améliorer le code Python
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 2 Traiter plusieurs fichiers
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 7 Comment créer un module
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 8 Mesure du temps de traitement et profileur
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
[Pour les débutants] Comment utiliser la commande say avec python!
Web scraping pour les débutants en Python (1)
Web scraping pour les débutants en Python (4) -1
[Python] Organisation de l'utilisation des instructions
Comment utiliser "deque" pour les données Python
Mémo n ° 4 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Le moyen le plus rapide pour les débutants de maîtriser Python
Python pour les super débutants Super débutants Python # Facile à éliminer
Comment utiliser Template Engine pour Network Engineer
Mémo n ° 3 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Mémo n ° 1 que les débutants Python lisent "Explication détaillée de la grammaire Python"
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ① ~
Comment utiliser les outils d'analyse de données pour les débutants
Essayez de calculer RPN avec Python (pour les débutants)
Mémo n ° 2 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Mémo n ° 7 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Introduction à la programmation (Python) TA Tendency pour les débutants
Mémo n ° 6 pour les débutants Python à lire "Explication détaillée de la grammaire Python"
Comment rendre le Python des débutants plus rapide [numpy]
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ② ~
Mémo n ° 5 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Web scraping pour les débutants en Python (1) Version améliorée
Comment convertir le type Python # pour les super débutants de Python: str
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Python # Comment vérifier le type et le type pour les super débutants
Scraping Web pour débutants avec Python (4) --2 Scraping sur Cloud Shell
Manuel python pour les débutants
OpenCV pour les débutants en Python
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
[Pour les débutants] Comment utiliser l'instruction for sous Linux (variables, etc.)
Méthode d'apprentissage TensorFlow pour les professionnels des arts libéraux et les débutants en Python
Conseils pour coder courts et faciles à lire en Python
Comment utiliser l'apprentissage automatique pour le travail? 03_Procédure de codage Python
Utilisez mitmproxy pour forcer l'API de votre application dans un environnement de développement
Comment convertir le type Python # pour les super débutants de Python: int, float
[Pour les débutants] Script dans 10 lignes (4. Connexion de python à sqlite3)
Je ne savais pas comment utiliser l'instruction [python] for
[Python] Introduction à la création de graphiques à l'aide de données de virus corona [Pour les débutants]
Utilisez un langage de script pour une vie C ++ confortable-OpenCV-Port Python vers C ++ -