銅仁建設(shè)集團(tuán)招聘信息網(wǎng)站seo快速優(yōu)化軟件網(wǎng)站
目錄
前提步驟
打開樹莓派攝像頭
查看是否有圖像,登錄游覽器打開樹莓派IP地址的8080端口
獲取mjpg的視頻流url
代碼
先設(shè)定好mjpg的視頻流的url
利用opencv庫中的v2.VideoCapture類讀取mjpg視頻流? ?cv2.VideoCapture()
檢查攝像頭是否成功打開,如果沒有,則打印錯(cuò)誤消息并退出程序? ?cap.isOpened()
創(chuàng)建一個(gè)空的numpy數(shù)組? ??np.empty()
從視頻中讀取一幀圖像? ??cap.read()
在窗口中顯示圖像輸出? ??cv2.imshow
延時(shí)50毫秒,播放下一幀圖像? ??cv2.waitKey
全部代碼?
?將幀保存為圖像? ?cv2.imwrite()
?讀取圖像??cv2.imread()? ??cv2.cvtColor
釋放VideoCapture對象并關(guān)閉視頻文件? ?cap.release()
前提步驟
- 樹莓派可以用mjpg-streame庫開啟攝像頭
- 安裝好python
打開樹莓派攝像頭
- 進(jìn)入mjpg庫
cd mjpg-streamer/mjpg-streamer-experimental
- 啟動(dòng)攝像頭腳本
./start.sh
查看是否有圖像,登錄游覽器打開樹莓派IP地址的8080端口
http://xxx.xxx.xxx.xxx:8080
獲取mjpg的視頻流url
點(diǎn)開stream,復(fù)制當(dāng)前的網(wǎng)址(url)
http://xxx.xxx.xxx.xxx:8080/?action=stream
代碼
先設(shè)定好mjpg的視頻流的url
ip_address = '172.20.10.14'
port_number = 8080
url = f'http://{ip_address}:{port_number}/?action=stream'
利用opencv庫中的v2.VideoCapture類讀取mjpg視頻流? ?cv2.VideoCapture()
- 使用cv2.VideoCapture類的一個(gè)實(shí)例,可以通過傳入攝像頭設(shè)備ID或視頻文件路徑來連接攝像頭或讀取視頻文件。例如,cv2.VideoCapture(0)表示打開筆記本的內(nèi)置攝像頭,cv2.VideoCapture("..\test.avi")表示打開指定路徑的視頻文件。
cap = cv2.VideoCapture(f'http://{ip_address}:{port_number}/?action=stream')
檢查攝像頭是否成功打開,如果沒有,則打印錯(cuò)誤消息并退出程序? ?cap.isOpened()
cap.isOpened()
是OpenCV中VideoCapture
類的一個(gè)函數(shù),用于檢查視頻是否成功打開。如果返回值為True,表示視頻已經(jīng)成功打開,反之則沒有成功打開。if not cap.isOpened():print("無法打開攝像頭")exit()
創(chuàng)建一個(gè)空的numpy數(shù)組? ??np.empty()
- 得到一個(gè)240行,320列,3個(gè)通道(顏色通道)的數(shù)組,每個(gè)元素都是一個(gè)無符號8位整數(shù)(0-255)。
- 該數(shù)組的形狀為(240, 320, 3),并且數(shù)據(jù)類型為
np.uint8。
- 用于存儲(chǔ)圖像數(shù)據(jù)。許多圖像格式(例如RGB)都有三個(gè)顏色通道,因此這個(gè)數(shù)組可以用于存儲(chǔ)圖像數(shù)據(jù)。
- 在使用這個(gè)數(shù)組時(shí),你可以像處理其他numpy數(shù)組一樣處理它。
# 創(chuàng)建一個(gè)空的numpy數(shù)組output來存儲(chǔ)圖像數(shù)據(jù) output = np.empty((240, 320, 3), dtype=np.uint8)
從視頻中讀取一幀圖像? ??cap.read()
cap.read()
?是 OpenCV 中?VideoCapture
?類的函數(shù)- 該函數(shù)返回一個(gè)布爾值(True/False)以及一個(gè)幀圖像。如果幀讀取正確,則返回 True,否則返回 False。
ret
?表示讀取幀是否正確,frame
?則是當(dāng)前幀的圖像。如果?ret
?為 True,則可以處理?frame
?圖像;如果?ret
?為 False,則表明視頻已經(jīng)讀取完畢。ret, frame = cap.read()
在窗口中顯示圖像輸出? ??cv2.imshow
cv2.imshow
接受兩個(gè)參數(shù):窗口的名稱和要顯示的圖像- 窗口名稱是'output',要顯示的圖像是變量
output
。cv2.imshow('output', output)
延時(shí)50毫秒,播放下一幀圖像? ??cv2.waitKey
cv2.waitKey
是 OpenCV 的一個(gè)函數(shù),用于等待并處理鍵盤事件。50
?是等待的毫秒數(shù)。這意味著如果用戶在 50 毫秒內(nèi)沒有按任何鍵,則函數(shù)會(huì)返回當(dāng)前活動(dòng)的熱鍵。否則,如果有按鍵被按下,它會(huì)被立即返回cv2.waitKey(50)
全部代碼?
import cv2
import numpy as npip_address = '172.20.10.14'
port_number = 8080cap = cv2.VideoCapture(f'http://{ip_address}:{port_number}/?action=stream')if not cap.isOpened():print("無法打開攝像頭")exit()output = np.empty((240, 320, 3), dtype=np.uint8)while True:ret, output = cap.read()cv2.imshow('output', output)cv2.waitKey(50)
?將幀保存為圖像? ?cv2.imwrite()
cv2.imwrite()
?是 OpenCV 庫中的一個(gè)函數(shù)- 用于將圖像寫入文件
- 兩個(gè)參數(shù):輸出文件名和要寫入的圖像。
- 使用?
cv2.imwrite()
?將?img
?寫入名為 "image.jpg" 的文件中。cv2.imwrite("capture.jpg", output)
?讀取圖像??cv2.imread()
? ??cv2.cvtColor
cv2.imread()
?是 OpenCV 庫中的一個(gè)函數(shù)- 用于讀取圖像文件
- 一個(gè)參數(shù),即要讀取的圖像文件的路徑
- 如果圖像文件不存在或無法讀取,
cv2.imread()
?將返回 None。如果圖像文件存在并成功讀取,則將返回一個(gè) NumPy 數(shù)組,其中包含圖像的像素值。 cv2.imread()
?函數(shù)默認(rèn)使用 BGR 顏色空間,而非 RGB 顏色空間。- 如果需要在處理圖像時(shí)使用 RGB 顏色空間,可以使用?
cv2.cvtColor()
?函數(shù)將 BGR 圖像轉(zhuǎn)換為 RGB 圖像。
img = cv2.imread('input.jpg') #如果是BGR圖像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_rgb
?是通過將?img
?從 BGR 顏色空間轉(zhuǎn)換為 RGB 顏色空間得到的。在 OpenCV 中,圖像的默認(rèn)格式是 BGR,而大多數(shù)其他圖像處理庫(如 Python 的 PIL 或 matplotlib)使用 RGB 顏色空間。因此,如果你需要在這些庫中處理 OpenCV 圖像,可能需要進(jìn)行顏色空間的轉(zhuǎn)換。mg_rgb
?通常指的是 RGB 圖像,而?img
?通常指的是 BGR 圖像。雖然它們在數(shù)值上是一樣的(因?yàn)樗鼈儽硎镜氖峭环鶊D像的像素值),但在處理圖像時(shí),使用哪個(gè)變量取決于你的需求。例如,如果你需要將圖像顯示在 matplotlib 中,你可能需要使用?img_rgb
。如果你需要處理圖像的顏色通道順序,你可能需要使用?img
。- 總的來說,雖然?
img_rgb
?和?img
?在數(shù)值上相同,但它們的使用和語義上有一些區(qū)別。
釋放VideoCapture對象并關(guān)閉視頻文件? ?cap.release()
cap.release()
是OpenCV庫中的一個(gè)函數(shù)- 用于釋放VideoCapture對象并關(guān)閉視頻文件
- 使用
cv2.VideoCapture()
創(chuàng)建一個(gè)VideoCapture對象后,這個(gè)對象會(huì)占用視頻文件的相關(guān)資源,比如文件句柄、內(nèi)存等。當(dāng)你完成視頻的讀取后,應(yīng)該調(diào)用cap.release()
釋放這些資源,以避免資源泄漏和占用。# 釋放VideoCapture對象并關(guān)閉視頻文件 cap.release()
- ?在調(diào)用
cap.release()
后,你不能再使用cap
對象,否則會(huì)拋出異常。如果你需要再次讀取視頻文件,應(yīng)該重新創(chuàng)建一個(gè)新的VideoCapture對象。