如何使用OpenCV和Socket進(jìn)行視頻聊天?
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)

在本文中,我們要構(gòu)建的是視頻聊天,但話音通道使用的OpenCV和Python中的Socket。流程:
創(chuàng)建用于一對一通信的 TCP 套接字。
從相機(jī)中獲取實(shí)時流。
對雙工通道使用多線程。
OpenCV是使用Python進(jìn)行圖像和視頻處理的庫,它做任何與圖像和視頻相關(guān)的事情:裁剪、編輯、創(chuàng)建圖像和制作視頻。Socket是一種低級網(wǎng)絡(luò)接口,用于連接網(wǎng)絡(luò)上的兩個節(jié)點(diǎn)以進(jìn)行通信,線程是用于在python中創(chuàng)建多線程程序的庫。
首先,我們將使用以下代碼使用Socket庫創(chuàng)建TCP Socket:
將協(xié)議設(shè)置為 TCP,將地址族設(shè)置為 IPv4 地址族。
# tcp and ipv4 address familytcp = socket.SOCK_STREAMafm = socket.AF_INET
使用 TCP 和 AFM 變量創(chuàng)建Socket。
# creating socketsa = socket.socket(afm,tcp)sb = socket.socket(afm,tcp)
sa和sb是創(chuàng)建用于在兩個節(jié)點(diǎn)之間進(jìn)行通信的Socket。我們也可以使用單個Socket來實(shí)現(xiàn)相同的目的。
綁定IP地址和端口號。
sa.bind((usera_ip,usera_port))開始監(jiān)聽Socket。
sa.listen()開始接受來自節(jié)點(diǎn)的連接。
session, addr = sa.accept()sa.accept()用于接受來自其他節(jié)點(diǎn)的連接請求。session存儲會話數(shù)據(jù)并使用它來發(fā)送和接收請求,而addr用于存儲接收節(jié)點(diǎn)的地址。
將此節(jié)點(diǎn)連接到另一個節(jié)點(diǎn)。
sb.connect((usera_ip,2001))然后,我們需要設(shè)計(jì)復(fù)雜的接收和發(fā)送來接收和發(fā)送視頻。

receive()函數(shù)包括使用以下代碼塊接收視頻幀的無限循環(huán)。
session.recv(buff_size)用于從節(jié)點(diǎn)接收字節(jié)數(shù)組,np.frombuffer()用于存儲與所述字節(jié)回numpy的arraay np.uint8數(shù)據(jù)類型的存儲的0?255然后,將范圍內(nèi)值cv2.imdecode(image_arr,cv2.IMREAD_COLOR)被用于使用cv2.IMREAD_COLOR參數(shù)將圖像解碼回彩色圖像。
如果圖像為空且數(shù)據(jù)類型為Nonetype,則程序?qū)⑼ㄟ^或使用cv2.imshow(image_name, image)連續(xù)顯示幀,并使用cv2.waitKey(10)使幀等待 10 毫秒并退出。cv2.destroyAllWindows()用于完全銷毀圖像窗口并使用os._exit(0)退出線程。
send()函數(shù)包括使用以下代碼塊發(fā)送視頻幀的無限循環(huán)。

cv2.VideoCapture(0)用于訪問攝像頭,并且可以使用作為參數(shù)傳遞的數(shù)字來更改攝像頭。capture存儲相機(jī)訪問方法,如read()來自相機(jī)的輸入或release()是相機(jī)。
capture.read()返回兩個變量,第一個作為布爾值,要么是照片,要么是真假,第二個是照片。然后,如果ret為True,則使用imencode('.jpg',photo)對圖像進(jìn)行編碼,并返回兩個變量和第二個變量作為編碼數(shù)組,并使用.tobytes轉(zhuǎn)換為字節(jié),該字節(jié)可以通過Socket發(fā)送。
sendall(byte_encoded_array)通過Socket發(fā)送所有數(shù)據(jù)并將數(shù)據(jù)發(fā)送到目標(biāo)節(jié)點(diǎn),直到所有數(shù)據(jù)成功發(fā)送到目標(biāo)節(jié)點(diǎn)。

我們需要使用thread.Thread(target=func)創(chuàng)建用于同時接收和發(fā)送視頻的線程,目標(biāo)為send()和receive()為單獨(dú)的線程提供函數(shù)。

項(xiàng)目鏈接:
https://github.com/Launchpad5682/summer_training_21/tree/main/task_3
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

