簡體   English   中英

圖像通過TCP發送

[英]Image send via TCP

我正在嘗試使用python(raspberry PI)通過TCP Socket發送捕獲圖像的數據。 TCP服務器(QT)在其他計算機上運行並嘗試讀取圖像並在QLabel中顯示。

我從未在python中編程,完全不明白我做錯了什么。 我花了很多時間(天)來彌補正在進行的錯誤,最終達到了我可以實際運行它的程度。 但我收到的數據就是垃圾。

下面的程序在樹莓PI上的sep窗口中顯示視頻,並應通過套接字發送單個捕獲的圖像。

import cv2.cv as cv
import cv2
import time
from socket import socket
import sys
import numpy

cv.NamedWindow("camera",cv.CV_WINDOW_AUTOSIZE)

capture = cv.CaptureFromCAM(0)

sock = socket()
sock.connect(('192.168.0.2', 5001))
sock.send('Pi - Hallo')

while True:
    frame = cv.QueryFrame(capture)
    cv.ShowImage("camera", frame)

    mat = cv.GetMat(frame)
    buf = [1,90]

    image = cv.CreateImage (cv.GetSize (frame), 8, 3)
    nuImage = numpy.asarray(frame[:,:])
    imgencode = cv2.imencode('.png', nuImage, buf)
    data = numpy.array(imgencode)
    stringData = data.tostring()
    sock.send('Pi - Sending image data');
    sock.send( stringData );

    if cv.WaitKey(10) == 27:
        break

sock.send('Pi - closing connection')
sock.close()

您收到的數據不是垃圾。 這是發送數據。 但它是以字節發送的。 因此,在接收端,您需要在處理數據之前將字節轉換為字符串。 閱讀本文以更好地理解在套接字編程中發送和接收數據,並閱讀本文中使用的當前版本的opencv中的方法。

此外,你不需要使用CV來完成這項任務。 當前版本的opencv提供了通過import cv2來實現的方法。

以下是工作代碼,雖然簡化了通信。

client.py

#!/usr/bin/python
import socket
import cv2
import numpy

TCP_IP = 'localhost'
TCP_PORT = 5001

sock = socket.socket()
sock.connect((TCP_IP, TCP_PORT))

capture = cv2.VideoCapture(0)
ret, frame = capture.read()

encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
result, imgencode = cv2.imencode('.jpg', frame, encode_param)
data = numpy.array(imgencode)
stringData = data.tostring()

sock.send( str(len(stringData)).ljust(16));
sock.send( stringData );
sock.close()

decimg=cv2.imdecode(data,1)
cv2.imshow('CLIENT',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows() 

server.py

#!/usr/bin/python
import socket
import cv2
import numpy

def recvall(sock, count):
    buf = b''
    while count:
        newbuf = sock.recv(count)
        if not newbuf: return None
        buf += newbuf
        count -= len(newbuf)
    return buf

TCP_IP = 'localhost'
TCP_PORT = 5001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(True)
conn, addr = s.accept()

length = recvall(conn,16)
stringData = recvall(conn, int(length))
data = numpy.fromstring(stringData, dtype='uint8')
s.close()

decimg=cv2.imdecode(data,1)
cv2.imshow('SERVER',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM