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