天天看點

如何使用OpenCV和Socket進行視訊聊天?

如何使用OpenCV和Socket進行視訊聊天?
如何使用OpenCV和Socket進行視訊聊天?

一、簡介

在本文中,我們要建構的是視訊聊天,但話音通道使用的OpenCV和Python中的Socket。流程:

  • 建立用于一對一通信的 TCP 套接字。
  • 從相機中擷取實時流。
  • 對雙工通道使用多線程。

OpenCV是使用Python進行圖像和視訊處理的庫,它做任何與圖像和視訊相關的事情:裁剪、編輯、建立圖像和制作視訊。Socket是一種低級網絡接口,用于連接配接網絡上的兩個節點以進行通信,線程是用于在python中建立多線程程式的庫。

二、步驟

首先,我們将使用以下代碼使用Socket庫建立TCP Socket:

  • 将協定設定為 TCP,将位址族設定為 IPv4 位址族。
# tcp and ipv4 address family
tcp = socket.SOCK_STREAM
afm = socket.AF_INET      
  • 使用 TCP 和 AFM 變量建立Socket。
# creating socket
sa = socket.socket(afm,tcp)
sb = socket.socket(afm,tcp)      

sa和sb是建立用于在兩個節點之間進行通信的Socket。我們也可以使用單個Socket來實作相同的目的。

  • 綁定IP位址和端口号。
sa.bind((usera_ip,usera_port))      
  • 開始監聽Socket。
sa.listen()      
  • 開始接受來自節點的連接配接。
session, addr = sa.accept()      

sa.accept()用于接受來自其他節點的連接配接請求。session存儲會話資料并使用它來發送和接收請求,而addr用于存儲接收節點的位址。

  • 将此節點連接配接到另一個節點。
sb.connect((usera_ip,2001))      

然後,我們需要設計複雜的接收和發送來接收和發送視訊。

如何使用OpenCV和Socket進行視訊聊天?

receive()函數包括使用以下代碼塊接收視訊幀的無限循環。

session.recv(buff_size)用于從節點接收位元組數組,np.frombuffer()用于存儲與所述位元組回numpy的arraay np.uint8資料類型的存儲的0〜255然後,将範圍内值cv2.imdecode(image_arr,cv2.IMREAD_COLOR)被用于使用cv2.IMREAD_COLOR參數将圖像解碼回彩色圖像。

如果圖像為空且資料類型為Nonetype,則程式将通過或使用cv2.imshow(image_name, image)連續顯示幀,并使用cv2.waitKey(10)使幀等待 10 毫秒并退出。cv2.destroyAllWindows()用于完全銷毀圖像視窗并使用os._exit(0)退出線程。

send()函數包括使用以下代碼塊發送視訊幀的無限循環。

如何使用OpenCV和Socket進行視訊聊天?

cv2.VideoCapture(0)用于通路攝像頭,并且可以使用作為參數傳遞的數字來更改攝像頭。capture存儲相機通路方法,如read()來自相機的輸入或release()是相機。

capture.read()傳回兩個變量,第一個作為布爾值,要麼是照片,要麼是真假,第二個是照片。然後,如果ret為True,則使用imencode('.jpg',photo)對圖像進行編碼,并傳回兩個變量和第二個變量作為編碼數組,并使用.tobytes轉換為位元組,該位元組可以通過Socket發送。

sendall(byte_encoded_array)通過Socket發送所有資料并将資料發送到目标節點,直到所有資料成功發送到目标節點。

如何使用OpenCV和Socket進行視訊聊天?

我們需要使用thread.Thread(target=func)建立用于同時接收和發送視訊的線程,目标為send()和receive()為單獨的線程提供函數。

如何使用OpenCV和Socket進行視訊聊天?

項目連結:

​​​https://github.com/Launchpad5682/summer_training_21/tree/main/task_3​​