OpenCV中圖像與視頻的基礎(chǔ)操作總結(jié)
引言
在計算機視覺領(lǐng)域,OpenCV是一款廣泛使用的開源庫,用于圖像處理和計算機視覺任務(wù)。當(dāng)你開始使用OpenCV時,了解如何創(chuàng)建和顯示窗口,以及加載和保存圖片是至關(guān)重要的基礎(chǔ)知識。本文將介紹如何使用OpenCV進行這些操作,幫助你更好地掌握圖像處理和視覺任務(wù)的開發(fā)技巧。
創(chuàng)建和顯示窗口
創(chuàng)建和顯示窗口是圖像處理中的重要步驟之一。在OpenCV中,你可以使用一些簡單而強大的函數(shù)來完成這些操作。讓我們來詳細(xì)了解一下這些函數(shù):
- namedWindow() - 創(chuàng)建一個窗口,并指定窗口的名稱和類型。
- resizeWindow() - 調(diào)整窗口的大小,接受窗口名稱、寬度和高度作為參數(shù)。
- imshow() - 在指定的窗口中顯示圖像,接受窗口名稱和要顯示的圖像作為參數(shù)。
- waitKey() - 等待鍵盤輸入,接受等待時間(以毫秒為單位)作為參數(shù),0表示無限等待用戶的鍵盤輸入。
- destroyAllWindows() - 關(guān)閉所有窗口。
下面是一個完整的示例代碼:
import cv2 cv2.namedWindow('new', cv2.WINDOW_NORMAL) cv2.resizeWindow('new', 640, 480) cv2.imshow("new", 0) key = cv2.waitKey(0) if(key == 'q'): exit() cv2.destroyAllWindows()
如何通過 OpenCV 加載圖片問題
加載圖像是使用 OpenCV 進行圖像處理的常見操作之一。在下面的示例中,我們將了解如何使用 OpenCV 加載圖像:
1.im == image - 在代碼中,im代表圖像對象,通常用于存儲加載的圖像數(shù)據(jù)。
2.imread(path, flag) - 這是一個用于讀取圖像文件的函數(shù)。它接受兩個參數(shù):path表示圖像文件的路徑,flag表示讀取圖像的方式。常見的flag選項包括:
- cv2.IMREAD_COLOR:加載彩色圖像。
- cv2.IMREAD_GRAYSCALE:以灰度模式加載圖像。
- cv2.IMREAD_UNCHANGED:加載圖像,包括 alpha 通道。
在下面的示例代碼中,我們將加載名為 sample.jpg
的圖像文件并顯示出來:
import cv2 cv2.namedWindow('img', cv2.WINDOW_NORMAL) img = cv2.imread('sample.jpg') cv2.imshow('img', img) key = cv2.waitKey(0) if key == ord('q'): exit() cv2.destroyAllWindows()
加載圖片存在的問題
在原始代碼中,存在一些問題需要解決,包括語法檢測、跨平臺路徑訪問以及程序退出邏輯。下面是對這些問題進行優(yōu)化的詳細(xì)解釋和示例代碼:
存在的問題:
1.語法檢測有問題:原始代碼中的縮進存在問題,影響代碼的可讀性和執(zhí)行。
2.Windows 下訪問圖片的路徑與 Mac/Linux 不同:在不同的操作系統(tǒng)中,訪問文件的路徑表示方式可能有所差異。需要注意在不同平臺上正確指定圖像文件的路徑。
3.程序退出的邏輯有問題:原始代碼中使用key == 'q'
來檢測用戶是否按下 ‘q’ 鍵退出程序,但實際上waitKey()
函數(shù)返回的是一個整數(shù)值。正確的做法是將鍵碼與 'q'
的 ASCII 碼值進行比較。
以下是優(yōu)化后的代碼示例:
import cv2 cv2.namedWindow('img', cv2.WINDOW_NORMAL) img = cv2.imread('sample.jpg') cv2.imshow('img', img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): exit() cv2.destroyAllWindows()
通過以上改進,我們解決了原始代碼中存在的語法檢測、跨平臺路徑訪問和程序退出邏輯的問題。這樣的優(yōu)化使代碼更具可讀性和可靠性。
如何通過 OpenCV 保存圖片
在OpenCV中,可以使用imwrite()
函數(shù)來保存圖片。該函數(shù)接受兩個參數(shù):要保存的文件名和要保存的圖像(以O(shè)penCV中的Mat
類型表示)。你可以指定保存的文件名和文件格式(如.jpg、.png等),并將圖像數(shù)據(jù)作為參數(shù)傳遞給imwrite()
函數(shù),即可將圖像保存到指定的文件中。
imwrite(name, img)
- name,要保存的文件名
- img,是 Mat 類型
import cv2 cv2.namedWindow('img', cv2.WINDOW_NORMAL) img = cv2.imread('sample.jpg') cv2.imshow("img", img) key = cv2.waitKey(0) if(key & 0xFF == ord('q')): cv2.destroyAllWindows() elif(key & 0xFF == ord('s')): cv2.imwrite('sample.png', img) # 改了一下文件格式
改善后的代碼:
import cv2 cv2.namedWindow('img', cv2.WINDOW_NORMAL) img = cv2.imread('sample.jpg') while True: cv2.imshow("img", img) key = cv2.waitKey(0) if(key & 0xFF == ord('q')): break elif(key & 0xFF == ord('s')): cv2.imwrite('sample.png', img) # 改了一下文件格式 else: print(key) cv2.destroyAllWindows()
如何利用 OpenCV 從攝像頭采集視頻(讀取視頻文件)
在許多計算機視覺應(yīng)用中,從攝像頭采集視頻是一個常見的任務(wù)。OpenCV提供了簡單而強大的函數(shù)來實現(xiàn)這個目標(biāo)。下面我們將介紹如何利用OpenCV從攝像頭讀取視頻幀。
VideoCapture()
:用于獲取視頻設(shè)備。它接受一個參數(shù)index,表示要使用的視頻設(shè)備的索引。通常情況下,索引為0表示使用默認(rèn)的攝像頭。
cap.read()
:用于從攝像頭讀取視頻幀。
- 返回兩個值,第一個為狀態(tài)值,讀到幀為 true
- 第二個值為視頻幀
cap.release()
:用于釋放VideoCapture對象。在程序結(jié)束時,應(yīng)該調(diào)用該函數(shù)釋放占用的資源。
下面是一個完整的示例代碼,展示了如何利用OpenCV從攝像頭采集視頻并實時顯示:
import cv2 # 創(chuàng)建窗口 cv2.namedWindow('video', cv2.WINDOW_NORMAL) cv2.resizeWindow('video', 640, 480) # 獲取視頻設(shè)備 cap = cv2.VideoCapture(0) while True: # 從攝像頭讀視頻幀 ret, frame = cap.read() # 將視頻幀在窗口中顯示 cv2.imshow('video', frame) # 等待鍵盤時間,如果為q,退出 key = cv2.waitKey(1) # 設(shè)置1ms,最低為1ms if(key & 0xFF == ord('q')): break # 釋放 VideoCapture cap.release() cv2.destroyAllWindows()
如何從多媒體文件中讀取視頻幀(讀取視頻文件)
除了從攝像頭采集視頻幀,OpenCV還提供了讀取視頻文件中的視頻幀的功能。下面我們將介紹如何使用cv2.VideoCapture()函數(shù)從多媒體文件中讀取視頻幀。
cv2.VideoCapture()
從視頻文件中讀取視頻幀
下面是一個完整的示例代碼,展示了如何從視頻文件中讀取視頻幀并顯示:
import cv2 # 創(chuàng)建窗口 cv2.namedWindow('video', cv2.WINDOW_NORMAL) cv2.resizeWindow('video', 640, 480) # 獲取視頻設(shè)備/從視頻文件中讀取視頻幀 cap = cv2.VideoCapture("sample.mp4") while True: # 從攝像頭讀視頻幀 ret, frame = cap.read() # 將視頻幀在窗口中顯示 cv2.imshow('video', frame) # 等待鍵盤時間,如果為q,退出 key = cv2.waitKey(40) # 設(shè)置1ms,最低為1ms if(key & 0xFF == ord('q')): break # 釋放 VideoCapture cap.release() cv2.destroyAllWindows()
如何將視頻數(shù)據(jù)錄制成多媒體文件(視頻錄制)
OpenCV提供了VideoWriter類,可以將視頻數(shù)據(jù)錄制成多媒體文件。
VideoWriter
- 參數(shù)一為輸出文件
- 參數(shù)二為多媒體文件格式(
VideoWriter_fourcc
) - 參數(shù)三為幀率
- 參數(shù)四為分辨率大小
write
release
下面是使用VideoWriter類進行視頻錄制的示例代碼:
import cv2 # 創(chuàng)建 VideoWriter 為寫多媒體文件 fourcc = cv2.VideoWriter_fourcc(*'MJPG') vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720)) # 分辨率要按照真實攝像頭分辨率填寫 # 創(chuàng)建窗口 cv2.namedWindow('video', cv2.WINDOW_NORMAL) cv2.resizeWindow('video', 640, 480) # 獲取視頻設(shè)備/從視頻文件中讀取視頻幀 cap = cv2.VideoCapture(0) while True: # 從攝像頭讀視頻幀 ret, frame = cap.read() # 將視頻幀在窗口中顯示 cv2.imshow('video', frame) # 寫數(shù)據(jù)到多媒體文件 vw.write(frame) # 等待鍵盤時間,如果為q,退出 key = cv2.waitKey(1) # 設(shè)置1ms,最低為1ms if(key & 0xFF == ord('q')): break # 釋放 VideoCapture cap.release() # 釋放VideoWriter vw.release() cv2.destroyAllWindows()
代碼優(yōu)化
在下面的代碼中,我們對代碼進行了優(yōu)化以解決一些問題:
- 顯示窗口為什么變大了?
- 使用
isOpened()
判斷攝像頭是否已打開 - 采集數(shù)據(jù)時要判斷數(shù)據(jù)是否獲取到了
import cv2 # 創(chuàng)建 VideoWriter 為寫多媒體文件 fourcc = cv2.VideoWriter_fourcc(*'MJPG') vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720)) # 分辨率要按照真實攝像頭分辨率填寫 # 創(chuàng)建窗口 cv2.namedWindow('video', cv2.WINDOW_NORMAL) cv2.resizeWindow('video', 640, 480) # 獲取視頻設(shè)備/從視頻文件中讀取視頻幀 cap = cv2.VideoCapture(0) while cap.isOpened(): # ?判斷攝像頭是否打開 # 從攝像頭讀視頻幀 ret, frame = cap.read() if ret == True: # ?判斷是否獲取到數(shù)據(jù) # 將視頻幀在窗口中顯示 cv2.imshow('video', frame) cv2.resizeWindow('video', 640, 480) # ?窗口變大了 # 寫數(shù)據(jù)到多媒體文件 vw.write(frame) # 等待鍵盤時間,如果為q,退出 key = cv2.waitKey(1) # 設(shè)置1ms,最低為1ms if(key & 0xFF == ord('q')): break else: break # 釋放 VideoCapture cap.release() # 釋放VideoWriter vw.release() cv2.destroyAllWindows()
OpenCV 控制鼠標(biāo)
下面將了解如何使用 OpenCV 控制鼠標(biāo)。具體來說,我們將了解如何設(shè)置鼠標(biāo)回調(diào)函數(shù),以便在鼠標(biāo)事件發(fā)生時執(zhí)行特定的操作。
設(shè)置鼠標(biāo)回調(diào)函數(shù)
setMouseCallback(winname, callback, userdata)
callback(event, x, y, flags, userdata)
- event:鼠標(biāo)移動,按下左鍵
- x,y:鼠標(biāo)左鍵
- flags:鼠標(biāo)鍵及組合鍵
下面是一個完整的示例代碼,演示了如何設(shè)置鼠標(biāo)回調(diào)函數(shù)并在窗口中顯示鼠標(biāo)事件的信息:
import cv2 import numpy as np # 鼠標(biāo)回調(diào)函數(shù) def mouse_callback(event, x, y, flags, userdata): print(event, x, y, flags, userdata) # mouse_callback(1, 100, 100, 16, "666") # 創(chuàng)建窗口 cv2.namedWindow('mouse', cv2.WINDOW_NORMAL) cv2.resizeWindow('mouse', 640, 360) # 設(shè)置鼠標(biāo)回調(diào) cv2.setMouseCallback('mouse', mouse_callback, "123") # 顯示窗口和背景 img = np.zeros((360, 640, 3), np.uint8) # 全黑圖片 while True: cv2.imshow('mouse', img) key = cv2.waitKey(1) if key & 0xFF == ord('q'): break cv2.destroyAllWindows()
OpenCV 中的 TrackBar 控件
TrackBar 是 OpenCV 提供的一個圖形用戶界面控件,用于在窗口中創(chuàng)建滑動條,通過滑動條可以動態(tài)調(diào)整某個參數(shù)的值。下面將介紹如何在 OpenCV 中使用 TrackBar 控件。
createTrackbar
- trackbarname,winname
- value:trackbar 當(dāng)前值
- count:最小值為0,最大值為 count
- callback,userdata
getTrackbarPos
- 輸入?yún)?shù):trackbarname
- 輸入?yún)?shù):winname
- 輸出:當(dāng)前值
在下面代碼中,我們將創(chuàng)建了一個名為 ‘trackbar’ 的窗口,并在其中創(chuàng)建了三個 TrackBar,分別用于控制紅、綠、藍(lán)三個通道的值。每個 TrackBar 的取值范圍為 0~255。我們還創(chuàng)建了一個背景圖片,其顏色將根據(jù) TrackBar 的值進行實時更新。
import cv2 import numpy as np def callback(): pass # 創(chuàng)建窗口 cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL) # 創(chuàng)建 trackbar cv2.createTrackbar('R', 'trackbar', 0, 255, callback) cv2.createTrackbar('G', 'trackbar', 0, 255, callback) cv2.createTrackbar('B', 'trackbar', 0, 255, callback) # 創(chuàng)建一個背景圖片 img = np.zeros((480, 640, 3), np.uint8) # 黑色背景 while True: # 獲取當(dāng)前 trackbar 的值 r = cv2.getTrackbarPos('R', 'trackbar') g = cv2.getTrackbarPos('G', 'trackbar') b = cv2.getTrackbarPos('B', 'trackbar') # 改變背景圖片顏色 img[:] = [b, g, r] # img[:] 表示所有像素 cv2.imshow('trackbar', img) key = cv2.waitKey(10) if key & 0xFF == ord('q'): break cv2.destroyAllWindows()
總結(jié)
這篇博客簡單介紹了 OpenCV 的OpenCV 圖像與視頻的基礎(chǔ)操作,包括窗口創(chuàng)建、圖像加載和保存、攝像頭視頻采集以及多媒體文件錄制等內(nèi)容。同時,還提供了代碼優(yōu)化技巧以及鼠標(biāo)交互和 TrackBar 控件的應(yīng)用。通過閱讀這篇博客,讀者可以全面了解 OpenCV 的功能和用法,掌握圖像處理的基本技能。
以上就是OpenCV中圖像與視頻的基礎(chǔ)操作總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于OpenCV圖像視頻操作的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python和GDAL給圖片加坐標(biāo)系的實現(xiàn)思路(坐標(biāo)投影轉(zhuǎn)換)
這篇文章主要介紹了使用Python和GDAL給圖片加坐標(biāo)系的實現(xiàn)思路(坐標(biāo)投影轉(zhuǎn)換),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03學(xué)生如何注冊Pycharm專業(yè)版以及pycharm的安裝
這篇文章主要介紹了學(xué)生如何注冊Pycharm專業(yè)版以及pycharm的安裝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09