无线电爱好网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

Python OpenCV 影像處理:讀取、顯示、儲存影片

2024-3-12 08:58| 发布者: 闪电| 查看: 1| 评论: 0

摘要: ►前言本篇將介紹使用OpenCV Python擷取網路攝影機(webcam)的即時畫面影像處理與顯示,以及透過讀取、顯示和儲存硬碟中的影片檔案來實現影片操作。這將幫助大家瞭解如何使用OpenCV在影片上進行各種操作。► OpenCV P ...
► 前言

本篇將介紹使用OpenCV Python擷取網路攝影機(webcam)的即時畫面影像處理與顯示,以及透過讀取、顯示和儲存硬碟中的影片檔案來實現影片操作。這將幫助大家瞭解如何使用OpenCV在影片上進行各種操作。

► OpenCV Python擷取網路攝影機

OpenCV首先建立了一個VideoCapture物件,指定了網路攝影機的索引,使用再透過 cap.isOpened() 來判斷影片是否正常開啟,正常開啟會回傳 True,失敗則是 False。能夠正常開啟後進入一個無窮迴圈,每次迴圈透過函數read從攝影機中讀取一幀影像,再於視窗上進行顯示。其中還可以透過cap.get(propID): 獲取影片的屬性值以及cap.set(propID, value): 設置影片的屬性值。

import cv2
# 使用網路攝影機的預設索引(通常為0)
camera_index = 0
# 建立VideoCapture物件,指定網路攝影機的索引
cap = cv2.VideoCapture(camera_index)
# 檢查攝影機是否成功開啟
if not cap.isOpened():
print("無法開啟攝影機")
exit()
# 設定攝影機屬性,例如幀寬度和幀高度
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 獲取攝影機屬性值,例如幀寬度和幀高度
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("攝影機幀寬度:", width)
print("攝影機幀高度:", height)
while True:
# 讀取當前幀的影像
ret, frame = cap.read()
# 檢查是否成功讀取影像
if not ret:
print("無法讀取影像")
break
# 顯示當前幀的影像
cv2.imshow("Webcam", frame)
# 按下Esc鍵退出迴圈
if cv2.waitKey(1) == 27:
break
# 釋放攝影機資源並關閉視窗
cap.release()
cv2.destroyAllWindows()



► OpenCV Python
 
讀取與顯示影片
OpenCV讀取影片只需要在cv2.VideoCapture中傳入的參數從camera index 改為影片檔案位置,(檔案相對路徑、絕對路徑都可以),就可以進行OpenCV 讀取硬碟中的影片操作了。
import cv2
# 影片檔案的路徑
video_path = 'path/to/your/video/file.mp4'
# 建立VideoCapture物件,指定影片檔案路徑
cap = cv2.VideoCapture(video_path)
# 檢查影片是否成功開啟
if not cap.isOpened():
print("無法開啟影片檔案")
exit()
# 設定影片屬性,例如幀寬度和幀高度
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 獲取影片屬性值,例如幀寬度和幀高度
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("影片幀寬度:", width)
print("影片幀高度:", height)
while True:
# 讀取當前幀的影像
ret, frame = cap.read()
# 檢查是否成功讀取影像
if not ret:
print("影片讀取完成或無法讀取影像")
break
# 顯示當前幀的影像
cv2.imshow("Video Playback", frame)
# 按下Esc鍵退出迴圈
if cv2.waitKey(1) == 27:
break
# 釋放影片資源並關閉視窗
cap.release()
cv2.destroyAllWindows()

► OpenCV Python 儲存影片

OpenCV使用以下函數(cv2.VideoWriter) 將影像幀序列寫入為影片檔案,透過以下參數進行相關設定。

filename:指定儲存的影片檔案路徑,例如 "output/video.mp4"。
fourcc:指定影片的編碼方式,使用四個字符的代碼。常見的幾種編碼方式包括:
MP4V:MP4編碼(需要安裝MPEG-4編碼庫)。
XVID:XVID編碼(需要安裝XVID編碼庫)。
MJPG:Motion-JPEG編碼。
fps:指定影片的幀率(每秒的幀數),例如 30 表示每秒 30 幀。
frameSize:指定影片的幀尺寸,可以是 (width, height) 的元組或整數值。
isColor:指定是否要儲存彩色影像。預設為True。

最後將上面的擷取網路攝影機與儲存影片組合,就可以透過OpenCV進行影片的讀取、顯示與儲存。

import cv2
# 設定網路攝影機索引,0表示第一個網路攝影機
camera_index = 0
# 建立VideoCapture物件,指定網路攝影機索引
cap = cv2.VideoCapture(camera_index)
# 設定影片的儲存器
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 使用MP4編碼
output_path = 'path/to/save/output/video.mp4'
fps = 30 # 幀率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while True:
# 讀取當前幀的影像
ret, frame = cap.read()
# 檢查是否成功讀取影像
if not ret:
print("無法讀取影像")
break
# 顯示當前幀的影像
cv2.imshow("Camera", frame)
# 儲存當前幀的影像到輸出影片
out.write(frame)
# 按下Esc鍵退出迴圈
if cv2.waitKey(1) == 27:
break
# 釋放資源並關閉視窗
cap.release()
out.release()
cv2.destroyAllWindows()​

►Q&A 

問題一:為甚麼讀取圖像錯誤?

在讀取圖像時,如果指定的圖像路徑不正確,將無法讀取圖像。因此,要確保提供正確的路徑和檔案名稱。建議採用全英文路徑進行讀取。
問題二:影像解析度不正確

網路攝影機可能支援多種解析度,但程式碼中可能未正確設定所需的解析度。確保程式碼中的解析度設定與攝影機的
支援解析度相匹配,以獲得正確的影像解析度。
問題三:影像變形或畸變

網路攝影機可能具有廣角或魚眼鏡頭,這可能導致影像變形或畸變。在顯示或儲存影像之前,
你可能需要進行校正或去除畸變的處理。這可以通過適當的校正技術,如相機校正或魚眼校正,來實現。
問題四:影片播放速度問題

在讀取和顯示影片時,可能會遇到播放速度不正確的問題,導致影片過快或過慢。這可能是由於設定的幀率不正確或影片本身的幀率不匹配所引起。
檢查幀率設定,確保它與影片的實際幀率相符。
問題五:影片編碼問題

在儲存影片時,可能會遇到編碼問題,導致儲存的影片無法正常播放或讀取。這可能是由於使用不支援的編碼方式或編碼參數設定不正確所引起。
確保選擇適當的編碼方式並正確設定編碼參數,以確保儲存的影片能夠順利播放和讀取。


► 小結

透過以上講解,搭配程式碼進行範例講解與Q&A進行問題解惑,相信各位對於OpenCV擷取網路攝影機的即時畫面影像處理與顯示,以及透過讀取、顯示和儲存硬碟中的影片檔案來實現影片操作能有更深刻的理解,期待下一篇博文吧!


路过

雷人

握手

鲜花

鸡蛋

QQ|关于本站|小黑屋|Archiver|手机版|无线电爱好网 ( 粤ICP备15040352号 ) 无线电爱好技术交流5 无线电爱好技术交流1无线电爱好技术交流9开关电源讨论群LED照明应用、电源无线电爱好技术交流4无线电爱好技术交流8无线电爱好技术交流10无线电爱好技术交流11

粤公网安备 44030702001224号

GMT+8, 2024-3-12 08:58 , Processed in 0.109201 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

返回顶部