簡體   English   中英

使用Python中的套接字發送幀

[英]Sending frames using sockets in Python

我正在嘗試從客戶端獲取幀,將其發送到服務器,然后從那里將其寫入視頻。 但是我一直發送失敗,在out.write(frame) TypeError: Expected Ptr<cv::UMat> for argument '%s'錯誤的TypeError: Expected Ptr<cv::UMat> for argument '%s'

我也嘗試過使用pickle.dumps(frame) ,然后在服務器端加載它,但它一直被截斷。

服務器:

import numpy as np 
import cv2, socket

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("output.avi", fourcc, 19.0, (1366, 768))

s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host,port))
s.listen(1)
print(host)
print("Waiting for any incoming connections ... ")
conn, addr = s.accept()
print(addr, "Has connected to the server")

while True:
    frame = conn.recv(1024)
    # write frame to video writer
    out.write(frame)

    if cv2.waitKey(1) == 27:
        break

out.release()
cv2.destroyAllWindows()

客戶:

import numpy as np 
import cv2, socket
from PIL import ImageGrab

s = socket.socket()
host = input(str("Please enter the host address of the sender : "))
port = 8080
s.connect((host,port))
print("Connected ... ")


while True:
    img = ImageGrab.grab()
    img_np = np.array(img)
    frame = img_np
    s.send(frame)

顯然在服務器中,frame變為<class 'bytes'> 因此,我正在嘗試找到解決此問題的任何方法,包括以某種方式將字節轉換回ndarray,或找到任何其他解決方法。

謝謝。

讓您將問題分為兩個部分:

  1. 如何通過套接字發送數據?
    您正在使用具有1024字節緩沖區的套接字,這意味着在每次迭代中,您最多可以獲得1024字節的數據。
    在低級網絡中工作時,應該做的是在幀的末尾放置一個唯一的結束標識符令牌,並使用.recv()在服務器端進行迭代,直到到達為止。 另一種選擇是發送消息的長度並計算接收到的字節數。 這樣,當您擁有完整的幀時,就可以中斷while循環,將其轉換為numpy數組,並對其進行.write()。

  2. 如何通過網絡傳遞numpy數組?

    • 您可以對其進行腌制並將字節傳輸到io.BytesIO流中。 然后使用np.load()函數加載流。
    • 您還可以將幀像素序列化為像素類型的數組,將其從套接字讀取到io.BytesIO中,然后使用np.fromfile(...,dtype = ...)讀取到numpy中。

暫無
暫無

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

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