使用OpenCV進(jìn)行直播(附代碼)
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
生活中我們不止一次地使用過直播,但從未想過如何通過編程實(shí)現(xiàn)。大家好,我們在這里向大家介紹如何使用OpenCV和python的套接字編程。今天,我們將借助OpenCV和socket編程創(chuàng)建一個(gè)實(shí)時(shí)流媒體應(yīng)用程序,我們將從頭開始為服務(wù)器和客戶端開發(fā)代碼。

Opencv是一個(gè)計(jì)算機(jī)視覺庫。該庫具有多種功能,因此我們可以使用網(wǎng)絡(luò)攝像頭和編程來處理圖像和視頻。
簡單地說,socket編程意味著使用TCP或UDP等互聯(lián)網(wǎng)協(xié)議在端口上的兩個(gè)或多個(gè)服務(wù)器之間進(jìn)行通信。關(guān)于socket和OpenCV的更多信息,我們將在代碼中討論。
開發(fā)一個(gè)服務(wù)器
pip install packagenameopencv-python,numpy,pickle
import cv2, socket, numpy, pickles=socket.socket(socket.AF_INET , socket.SOCK_DGRAM)ip="192.168.1.5"port=6666s.bind((ip,port))
在上面的代碼中,我們已經(jīng)為項(xiàng)目導(dǎo)入了所需的庫。"s"變量將存儲socket的地址,socket.AF_INET用于表示套接字使用ipv4。socket.sock_DGRAM表示UDP協(xié)議,代表用戶數(shù)據(jù)報(bào)協(xié)議。有時(shí)使用它是有風(fēng)險(xiǎn)的,因?yàn)榧僭O(shè)我們的數(shù)據(jù)包沒有發(fā)送給用戶,它不會告訴我們,所以我們有數(shù)據(jù)丟失的風(fēng)險(xiǎn),而不是它易于使用。我們也可以使用TCP,但這會使我們的代碼有點(diǎn)復(fù)雜,因此對于basic,我們使用UDP。
"ip"變量包含計(jì)算機(jī)的ip地址,"port"編號包含運(yùn)行進(jìn)程的端口。你們可以根據(jù)自己的選擇提供任何端口號,因?yàn)樗皇且粋€(gè)正在運(yùn)行并暴露于世界的進(jìn)程。s.bind()函數(shù)將綁定"ip"和"端口"號,并將其轉(zhuǎn)換為套接字。簡單地說,就是元組。
while True:x=s.recvfrom(1000000)clientip = x[1][0]data=x[0]print(data)data=pickle.loads(data)print(type(data))data = cv2.imdecode(data, cv2.IMREAD_COLOR)cv2.imshow('server', data) #to open imageif cv2.waitKey(10) == 13:breakcv2.destroyAllWindows()
上述函數(shù)將從客戶端接收數(shù)據(jù),并將數(shù)據(jù)臨時(shí)存儲到"x"變量中。在"clientip"中,我們使用通過切片數(shù)組檢索的數(shù)據(jù)存儲了客戶端的IP地址,數(shù)據(jù)變量將保存數(shù)據(jù)。現(xiàn)在,我們將使用函數(shù)imdecode對數(shù)據(jù)變量中接收的數(shù)據(jù)進(jìn)行解碼,imshow函數(shù)將顯示一個(gè)流窗口。cv2.waitkey(10)將每隔10毫秒單擊/收集數(shù)據(jù),直到你們按enter鍵并輸入數(shù)字13。按enter鍵時(shí),destroyAllWindows()將關(guān)閉應(yīng)用程序。
配置客戶端
import cv2, socket, pickle, oss=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10000000)serverip="192.168.1.5"serverport=6666
這里,我們首先導(dǎo)入了socket和OpenCV所需的庫,"s"存儲socket的地址。AF_INET表示IP系列v4和socket.SOCK_DGRAM此關(guān)鍵字用于UDP協(xié)議,第三行將創(chuàng)建一個(gè)緩沖區(qū)大小,以便我們可以存儲數(shù)據(jù)緩沖區(qū)以連續(xù)傳輸數(shù)據(jù)。"serveip"和"serverport"保存服務(wù)器的IP地址和端口號。
cap = cv2.VideoCapture(0)while True:ret,photo = cap.read()cv2.imshow('streaming', photo)ret, buffer = cv2.imencode(".jpg", photo,[int(cv2.IMWRITE_JPEG_QUALITY),30])x_as_bytes = pickle.dumps(buffer)s.sendto(x_as_bytes,(serverip , serverport))if cv2.waitKey(10) == 13:breakcv2.destroyAllWindows()cap.release()
視頻捕獲(0)存儲功能地址和用于存儲網(wǎng)絡(luò)攝像頭的"0"。ret存儲返回值和照片,并存儲cap.read()的輸出。此函數(shù)將讀取圖像。imshow將顯示流媒體窗口。緩沖區(qū)變量將存儲流媒體的數(shù)據(jù)并將其提供給服務(wù)器,這個(gè)函數(shù)將把數(shù)據(jù)轉(zhuǎn)儲到一個(gè)變量中,發(fā)送到一個(gè)函數(shù)將綁定IP和端口號的數(shù)據(jù),以便我們可以發(fā)送它。waitkey將每隔10毫秒收集一次數(shù)據(jù),直到我們按enter鍵,輸入代碼為13。destroyAllWindows()將銷毀windows,cap.release()將關(guān)閉相機(jī)。

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

