老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Python樹莓派之如何實現UDP傳輸視頻幀操作-創新互聯

這篇文章主要介紹Python樹莓派之如何實現UDP傳輸視頻幀操作,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

成都創新互聯主要從事網站設計、網站建設、網頁設計、企業做網站、公司建網站等業務。立足成都服務阿拉善盟,十余年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:028-86922220

具體如下:

因為我在自己筆記本電腦上沒能成功安裝OpenCV-Contrib模塊,因此不能使用人臉識別等高級功能,不過已經在樹莓派上安裝成功了,所以我想實現把樹莓派上采集的視頻幀傳輸到PC的功能,這樣可以省去給樹莓派配顯示屏的麻煩,而且以后可能可以用在遠程監控上。

1 UDP還是TCP

首先考慮用哪種傳輸方式,平常TCP用的非常多,但是像視頻幀這種數據用TCP不是太合適,因為視頻數據的傳輸最先要考慮的是速度而不是準確性,視頻幀的數據量很大,幀間隔也非常短,需要盡量保證傳輸速度,同時丟失一些數據是無所謂的。TCP需要維護連接、保證數據包正確,會耗費一些時間,因此應該使用UDP,就像所有參考書上說的,UDP不在乎是否建立連接,也不管數據是否能被準確接收,只關心能否把數據發送出去而已。

在Python的socket代碼中也可直觀地看到UDP的特點,對于發送方,我們通過server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)創建UDP套接字對象,然后執行server.connect((HOST,PORT)) 指定發送方地址,但其實connect函數直接就返回了,不像TCP中的客戶端會等待連接成功,接著就可直接在套接字對象上調用send函數發送數據了,這個過程根本沒確立連接。

2 圖像傳輸中的編解碼

但是用UDP傳輸圖像有一個很關鍵的問題需要考慮,就是圖像的大小。根據UDP協議,單個包的數據大小大只能65507個字節(去掉包頭),而一般直接從攝像頭采集的圖像幀的大小比這個數要大得多,以我的邏輯C270為例,單幅圖像的大小為480X640X3個字節,遠大于65507,因此一個包是沒法發送完的。解決方法有兩種,一種是把圖像拆成幾次進行發送,相應的接收端用個循環多次接收,這種方法可以完整地接收數據,但是速度肯定受到影響,而且可能要添加一些自定義規則,徒增麻煩;另一種方法就是發送前先對圖像進行編碼壓縮,接收后再解碼,清晰度會有所下降,但是可以保持速度上的優勢,這種方式比較合適。

OpenCV中的imencode和imdecode方法可分別用于圖像的編碼和解碼。imencode根據指定的標識將圖像數據編碼并存入緩存區,函數原型為cv2.imencode(ext, img[, params]) → retval, buf,ext為文件擴展名,指定了存儲格式,如'.jpg';img為需要編碼的圖像數據; params為指定的編碼標識,其形式為paramId_1, paramValue_1, paramId_2, paramValue_2, ... ,對于jpg格式,可以指定標識為CV_IMWRITE_JPEG_QUALITY ,其對應的值在0到100之間,表示了壓縮質量,值越大壓縮率越大,編碼后的數據量越小,但解碼后的圖像質量也越差。

imdecode從緩存區讀取圖像數據,通過指定標識,可以實現指定的解碼格式。imdecode的函數原型為cv2.imdecode(buf, flags) → retval ,其中flags指定圖像的讀取類型,實際上就是指定了以多少深度多少通道讀取圖像,比如CV_LOAD_IMAGE_ANYDEPTH(即整數2)表示單個通道,深度不變的灰度圖;CV_LOAD_IMAGE_COLOR(即整數1)表示3通道、8位深度的彩色圖。

3 樹莓派程序

結合套接字對象和編解碼函數,就可以編寫發送端的代碼了,不過還有一個需要注意的地方是發送和接收的數據格式問題,套接字的發送和接收都是字節流,或者說是byte數組,發送數據時需要以字節流格式發送,接收數據后需要把字節流類型轉換成合適的數據類型。

從攝像頭獲取的圖像是480X640X3的numpy.ndarray類型,通過imencode編碼,得到?X1的numpy.ndarray對象,經測試,這個對象可以直接發送出去;在接收端,獲得的是byte數組,這個數組直接做imdecode的參數會報錯,經調試,發現還需要把數組轉換成numpy.ndarray類型。樹莓派作為發送端,其Python代碼如下:

import cv2
import numpy
import socket
import struct
HOST='192.168.1.122'
PORT=9999
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #socket對象
server.connect((HOST,PORT))
print('now starting to send frames...')
capture=cv2.VideoCapture(0) #VideoCapture對象,可獲取攝像頭設備的數據
try:
  while True:
    success,frame=capture.read()
    while not success and frame is None:
      success,frame=capture.read() #獲取視頻幀
  result,imgencode=cv2.imencode('.jpg',frame,[cv2.IMWRITE_JPEG_QUALITY,50]) #編碼
  server.sendall(struct.pack('i',imgencode.shape[0])) #發送編碼后的字節長度,這個值不是固定的
  server.sendall(imgencode) #發送視頻幀數據
  print('have sent one frame')
except Exception as e:
  print(e)
  server.sendall(struct.pack('c',1)) #發送關閉消息
  capture.release()
  server.close()

在代碼中,首先把編碼后的字節長度發送了過去,目的是讓接收端可以進行簡單的校驗,并且接收端可以據此判斷是否應該關閉程序,相應的,自定義單字節的1為關閉消息。

4 PC端程序

自己的電腦作為接收端,為了解碼數據,需要把原始字節流轉成numpy.ndarray對象,代碼如下:

import cv2
import numpy
import socket
import struct
HOST='192.168.191.122'
PORT=9999
buffSize=65535
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #創建socket對象
server.bind((HOST,PORT))
print('now waiting for frames...')
while True:
  data,address=server.recvfrom(buffSize) #先接收的是字節長度
  if len(data)==1 and data[0]==1: #如果收到關閉消息則停止程序
    server.close()
    cv2.destroyAllWindows()
    exit()
  if len(data)!=4: #進行簡單的校驗,長度值是int類型,占四個字節
    length=0
  else:
    length=struct.unpack('i',data)[0] #長度值
  data,address=server.recvfrom(buffSize) #接收編碼圖像數據
  if length!=len(data): #進行簡單的校驗
    continue
  data=numpy.array(bytearray(data)) #格式轉換
  imgdecode=cv2.imdecode(data,1) #解碼
  print('have received one frame')
  cv2.imshow('frames',imgdecode) #窗口顯示
  if cv2.waitKey(1)==27: #按下“ESC”退出
    break
server.close()
cv2.destroyAllWindows()

5 測試

因為我樹莓派上的OpenCV只關聯了Python2,因此以python2 UDP_Frame_Send.py 的命令啟動發送程序(接好攝像頭);電腦上,在開始菜單中輸入cmd進入Windows的控制臺,進入程序文件目錄,輸入python UDP_Frame_Recv.py啟動接收程序,結果表明可以比較流暢地窗口顯示,不過有幾個問題,一是在樹莓派上,程序有時候打不開攝像頭,需要重啟幾次程序,二是在電腦上,recvfrom這個函數是阻塞式的,在Windows系統的控制臺中似乎沒辦法用鍵盤中斷強制從這個函數退出,所以如果發送端出錯接收端的程序就沒法正常退出了,對此可以用TCP&UDP調試助手手動發送單個字節的1來終止程序。

以上是“Python樹莓派之如何實現UDP傳輸視頻幀操作”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創新互聯成都網站設計公司行業資訊頻道!

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


網站欄目:Python樹莓派之如何實現UDP傳輸視頻幀操作-創新互聯
文章出自:http://www.xueling.net.cn/article/cocdhs.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 中文字幕在线视频免费观看 | 久久精品日韩一区二区三区 | 最近2019年好看中文字幕视频 | 97精品久久天干天天 | 久久这里精品青草免费 | 中文无字幕一区二区三区 | 国产免费a级片 | 久久久国产精品无码一区二区 | 国产丶欧美丶日本不卡视频 | 欧美高潮又爽又黄又硬又无遮 | 日韩中文字幕在线视频观看 | 成人综合网站 | 色婷婷av777| 国产目拍亚洲精品一区二区 | 99精品不卡一区二区三区 | 久久久久国产精品熟女影院 | 国产一级视频观看 | 久久久久久久久久久久久9999 | 国产成人亚洲精品无码青 | 欧美顶级METART裸体全部自慰 | 硬汉视频在线观看手机版 | 嗯啊ww免费视频网站 | 成年免费无码动漫AV片在线观看 | 午夜老司机免费视频 | 国产真实乱免费高清视频 | 中文字幕人成无码免费视频 | 欧美黑人又粗又大又爽免费 | 国产一区日韩二区欧美三区 | 在线免费小视频 | 欧美激情精品久久久久久黑人 | 国产亚洲欧美日韩在线一区二区三区 | 国产泡妞岁18xxxx免费看 | 精品国产乱码 | 优优亚洲精品久久久久久久 | 久久精品在线观看视频 | 亚洲精品国自产拍在线观看 | 亚洲首页 | 亚洲人成网77777亚洲色 | 适合女士自慰时看的黄文 | 中文av在线播放 | 中文字幕一区二区三区在线视频 |