說明:關(guān)于OpenCV的教程和書籍已經(jīng)很多了,所以,我不想重復(fù)別人已經(jīng)做過的事情。如何系統(tǒng)全面的掌握OpenCV?我想這是每個(gè)學(xué)習(xí)OpenCV的人都想要做到的事情。說到底,OpenCV只是一個(gè)數(shù)字圖像處理函數(shù)庫(kù),要全面掌握OpenCV的使用,只需要明白有哪些函數(shù),每個(gè)函數(shù)怎么使用。這個(gè)系列教程要完成的事情,就是讓大家系統(tǒng)的了解OpenCV有哪些函數(shù),熟練掌握每個(gè)函數(shù)的作用和使用方法。因此,我不會(huì)花時(shí)間去詳細(xì)介紹每個(gè)函數(shù)的算法原理。我重點(diǎn)介紹每個(gè)函數(shù)的作用和使用方法,同時(shí)利用詳細(xì)的示例代碼進(jìn)行演示。示例代碼包括c++、python、emgucv、OpenCVsharp四種。
一、OpenCV簡(jiǎn)介及功能模塊
1、OpenCV簡(jiǎn)介
OpenCV(Open Source Computer Vision Library)是一個(gè)廣泛使用的開源計(jì)算機(jī)視覺庫(kù),旨在提供豐富的圖像和視頻處理功能。它最初由Intel于1999年開發(fā),并演變成為一個(gè)全球性的開源項(xiàng)目,得到了眾多開發(fā)者的貢獻(xiàn)和支持。OpenCV可以通過C++、Python、Java等編程語(yǔ)言調(diào)用,使得開發(fā)者能夠在不同平臺(tái)上進(jìn)行圖像處理和計(jì)算機(jī)視覺應(yīng)用程序的開發(fā)。作為一個(gè)全面且強(qiáng)大的計(jì)算機(jī)視覺庫(kù),OpenCV包含了數(shù)百個(gè)用于圖像處理、特征檢測(cè)、對(duì)象識(shí)別、視頻分析等領(lǐng)域的函數(shù)和工具。無(wú)論您是希望讀取和顯示圖像、進(jìn)行圖像濾波、邊緣檢測(cè)、圖像分割、特征提取,還是進(jìn)行目標(biāo)跟蹤,OpenCV都能提供相應(yīng)的功能豐富的API。
對(duì)于圖像處理方面,OpenCV提供了各種各樣的功能,例如色彩空間轉(zhuǎn)換、圖像濾波(平滑、銳化)、形態(tài)學(xué)操作、圖像變換(旋轉(zhuǎn)、縮放)、圖像配準(zhǔn)等。這些功能對(duì)于不同的圖像處理任務(wù)非常有用。此外,OpenCV還支持直方圖操作、二值化、形狀描述符計(jì)算、圖像輪廓提取等高級(jí)功能,用于更復(fù)雜的圖像處理和分析。在特征檢測(cè)和描述方面,OpenCV提供了一系列經(jīng)典算法的實(shí)現(xiàn),如Harris角點(diǎn)檢測(cè)、SIFT(尺度不變特征變換)、SURF(速度ed特征變換)、ORB(Oriented FAST and Rotated BRIEF)等。這些算法可用于檢測(cè)圖像中的關(guān)鍵點(diǎn),生成描述符,并進(jìn)行特征匹配和對(duì)象識(shí)別。當(dāng)涉及到視頻處理時(shí),OpenCV同樣提供了豐富的功能。它可以從攝像頭或視頻文件中讀取視頻數(shù)據(jù),并進(jìn)行實(shí)時(shí)分析和處理。您可以使用OpenCV來(lái)捕獲視頻流、提取視頻幀、進(jìn)行視頻編解碼、計(jì)算光流、跟蹤運(yùn)動(dòng)目標(biāo)等。
此外,OpenCV還提供了相機(jī)標(biāo)定、立體視覺、運(yùn)動(dòng)估計(jì)、光流分析等高級(jí)計(jì)算機(jī)視覺功能,以及實(shí)時(shí)圖像處理和視頻處理的支持。開發(fā)者可以利用這些功能構(gòu)建各種應(yīng)用程序,如機(jī)器人視覺導(dǎo)航、自動(dòng)駕駛、安防監(jiān)控系統(tǒng)、虛擬現(xiàn)實(shí)等。近年來(lái),隨著深度學(xué)習(xí)的廣泛應(yīng)用,OpenCV也提供了針對(duì)神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的高級(jí)功能。通過集成Deep Learning模塊,OpenCV支持常見的深度學(xué)習(xí)框架,如TensorFlow、PyTorch和Caffe,使開發(fā)者能夠利用神經(jīng)網(wǎng)絡(luò)進(jìn)行人臉檢測(cè)、物體識(shí)別和語(yǔ)義分割等任務(wù)。這為計(jì)算機(jī)視覺的發(fā)展帶來(lái)了更多的可能性。
OpenCV在各個(gè)領(lǐng)域得到了廣泛的應(yīng)用。在醫(yī)療領(lǐng)域,OpenCV可以幫助進(jìn)行醫(yī)學(xué)圖像分析、病變檢測(cè)和診斷。在工業(yè)領(lǐng)域,OpenCV可以應(yīng)用于質(zhì)量控制、產(chǎn)品檢測(cè)和機(jī)器視覺系統(tǒng)。在娛樂領(lǐng)域,OpenCV可以用于實(shí)現(xiàn)增強(qiáng)現(xiàn)實(shí)、虛擬現(xiàn)實(shí)和交互式游戲等。OpenCV具有強(qiáng)大的跨平臺(tái)性,可以在Windows、Linux、macOS等操作系統(tǒng)上運(yùn)行。它還可以與其他流行的計(jì)算機(jī)視覺庫(kù)和工具集成,如NumPy、SciPy、Matplotlib等,為開發(fā)者提供更多選擇和更豐富的功能。
總之,OpenCV是一個(gè)功能強(qiáng)大且廣泛使用的計(jì)算機(jī)視覺庫(kù),提供了豐富的圖像處理和計(jì)算機(jī)視覺功能,幫助開發(fā)者解決各種圖像處理和計(jì)算機(jī)視覺問題。無(wú)論是學(xué)術(shù)研究、教育或商業(yè)應(yīng)用,OpenCV都是一個(gè)不可或缺的工具,為人們創(chuàng)造出更美好的視覺體驗(yàn)和智能化應(yīng)用。
2、OpenCV的功能模塊
OpenCV的組織關(guān)系如下圖所示:
OpenCV的功能模塊分為兩部分,一部分是基本模塊,一部分是擴(kuò)展模塊。
(1)基本模塊主要有以下功能模塊
calib3d:相機(jī)標(biāo)定相關(guān)
core;核心功能模塊,主要包含opencv庫(kù)的基礎(chǔ)結(jié)構(gòu)和基本操作。
dnn:深度學(xué)習(xí)模塊
features2d:二維特征檢測(cè)點(diǎn)檢測(cè)、描述、匹配等
flann;最近鄰匹配、聚類等。
gapi:該模塊對(duì)圖像處理算法做了加速處理
highgui:圖像顯示、按鈕、鼠標(biāo)等操作。
imgcodecs:負(fù)責(zé)圖像文件讀寫,如圖像讀取與保存
imgproc:圖像處理函數(shù)
ml:機(jī)器學(xué)習(xí)相關(guān)算法
objdetect:目標(biāo)檢測(cè),包括Cascade face detector; latent SVM; HOG等
photo:用于計(jì)算攝影處理和恢復(fù)照片的算法
stitching:圖像拼接,利用圖像特征點(diǎn)進(jìn)行圖像拼接
video:視頻處理,包括背景分割、視頻跟蹤等
videoio:負(fù)責(zé)視頻文件的讀取和寫入
在基本模塊中,大家使用最多的是核心功能模塊、圖像處理模塊、特征檢測(cè)模塊;其次是目標(biāo)檢測(cè)、相機(jī)標(biāo)定、機(jī)器學(xué)習(xí)等功能。圖像顯示功能通常在上面功能完成后用來(lái)查看處理結(jié)果。
(2)擴(kuò)展模塊
除了上面的基本模塊之外,OpenCV提供了更多的擴(kuò)展模塊
擴(kuò)展模塊包含在contrib中,擴(kuò)展模塊是對(duì)基本模塊的補(bǔ)充,其中也包括了一些專利算法。擴(kuò)展模塊隨著版本的不同可能會(huì)有些區(qū)別,新版本可能會(huì)增加一些新的功能。雖然如此,其每個(gè)模塊的使用方法都是差不多的。OpenCV4.0提供的擴(kuò)展模塊如下:
aruco: ArUco和ChArUco標(biāo)記。包括增強(qiáng)現(xiàn)實(shí)的ArUco標(biāo)記和ChArUco標(biāo)記
bgsegm:背景分割。改進(jìn)的自適應(yīng)背景混合模型,用于在不同照明條件下實(shí)時(shí)人體跟蹤。
ccalib:自定義校準(zhǔn)。用于3D重建、全景相機(jī)校準(zhǔn)、隨機(jī)模式校準(zhǔn)和多攝像頭校準(zhǔn)的模式。
cnn_3dobj:深度物體識(shí)別與姿態(tài)。使用Caffe深度神經(jīng)網(wǎng)絡(luò)庫(kù)構(gòu)建、訓(xùn)練和測(cè)試視覺物體識(shí)別和姿態(tài)的CNN模型。
cuda:利用GPU處理圖像的模塊,包括下面部分:
cudaarithm:在CUDA架構(gòu)上執(zhí)行數(shù)學(xué)計(jì)算的庫(kù)
cudabgsegm: 在CUDA架構(gòu)上進(jìn)行背景分割
cudacodec:在CUDA架構(gòu)上進(jìn)行編碼解碼
cudafeatures2d:在CUDA架構(gòu)上進(jìn)行特征檢測(cè)
cudafilters:在CUDA架構(gòu)上進(jìn)行圖像濾波
cudaimgproc:在CUDA架構(gòu)上進(jìn)行圖像處理
cudalegacy:在CUDA架構(gòu)上進(jìn)行的傳統(tǒng)處理支持
cudaobjdetect:在CUDA架構(gòu)上進(jìn)行目標(biāo)檢測(cè)
cudaoptflow:在CUDA架構(gòu)上進(jìn)行光流計(jì)算
cudastereo:基于CUDA技術(shù)的用于立體視覺任務(wù)的模塊,它可以加速立體視覺算法的計(jì)算過程,提高處理速度和效率
cudawarping:利用NVIDIA的CUDA技術(shù)來(lái)進(jìn)行圖像畸變校正和圖像重投影的計(jì)算,以實(shí)現(xiàn)更高效的處理速度和更好的性能
cudev;為OpenCV中的某些功能提供了CUDA實(shí)現(xiàn),以加速這些操作。它可以與其他OpenCV模塊配合使用,以利用GPU的并行計(jì)算能力來(lái)提高圖像處理和計(jì)算的速度。
cvv:調(diào)試器, 彈出一個(gè)圖形用戶界面(GUI),能夠交互式地進(jìn)行視覺調(diào)試計(jì)算機(jī)視覺程序
datasets: 用于讀取現(xiàn)有的計(jì)算機(jī)視覺數(shù)據(jù)庫(kù)的代碼,并且展示如何使用這些讀取器來(lái)進(jìn)行數(shù)據(jù)集的訓(xùn)練、測(cè)試和運(yùn)行的示例。
dnn_objdetect: 用于對(duì)象檢測(cè)和識(shí)別的深度學(xué)習(xí)模塊
dnns_easily_fooled: 一種能夠欺騙深度神經(jīng)網(wǎng)絡(luò)(DNNs)的代碼或技術(shù)。這種方法利用網(wǎng)絡(luò)中的激活值來(lái)欺騙網(wǎng)絡(luò),使其識(shí)別錯(cuò)誤的目標(biāo)或?qū)⒛硞€(gè)目標(biāo)識(shí)別為另一個(gè)目標(biāo)。
dpm: 一種用于目標(biāo)識(shí)別的算法,它基于 Felzenszwalb 的級(jí)聯(lián)檢測(cè)器(cascade detector)并添加了可變形對(duì)象檢測(cè)和識(shí)別
face: 人臉識(shí)別,包括特征臉(Eigen)、Fisher和局部二值模式直方圖(LBPH)方法。
freetype: 用于在圖像上繪制文本的功能模塊。它提供了一些函數(shù)和類,可用于在圖像中添加文字,包括選擇字體、設(shè)置字體大小、指定顏色、位置和對(duì)齊方式等。
fuzzy: 模糊數(shù)學(xué)的圖像處理
hdf:: 分層數(shù)據(jù)存儲(chǔ)。該模塊包含用于分層數(shù)據(jù)格式的輸入/輸出(I/O)例程,旨在存儲(chǔ)大量數(shù)據(jù)。
hfs: 層次特征選擇,一種用于特征選擇和降維的算法,可應(yīng)用于計(jì)算機(jī)視覺和模式識(shí)別任務(wù)中
img_hash: 哈希算法來(lái)計(jì)算圖像的哈希值,用來(lái)比較兩個(gè)圖像的相似性
line_descriptor: 用于線段提取和匹配的功能模塊。提供了從圖像中提取、描述和匹配線段的方法,使用二進(jìn)制描述符來(lái)表示線段
matlab: MATLAB接口
optflow: 光流算法。用于運(yùn)行和評(píng)估deepflow、simpleflow、sparsetodenseflow和motion templates(輪廓光流)的算法。
ovis: 用于渲染、可視化和交互式操作的工具包。它是基于OpenGL的一個(gè)功能模塊,用于創(chuàng)建和展示3D場(chǎng)景、模型和虛擬現(xiàn)實(shí)(VR)環(huán)境
phase_unwrapping: 一個(gè)用于相位展開的功能模塊
plot: 允許在一維或二維中繪制數(shù)據(jù)。
reg: 圖像配準(zhǔn)?;谙袼氐膱D像配準(zhǔn),用于精確對(duì)齊
rgbd: RGB深度處理模塊。Linemod三維物體識(shí)別。
saliency: 顯著性API。用于確定人眼在場(chǎng)景中的關(guān)注點(diǎn)。具有靜態(tài)、運(yùn)動(dòng)和“物體性”顯著性的計(jì)算例程。
sfm: 該模塊包含從2D圖像進(jìn)行三維重建的算法。該模塊的核心是Libmv的輕量級(jí)版本
shape: 提供了一些形狀相關(guān)的功能和操作
stereo: 立體匹配。使用不同描述符進(jìn)行的立體匹配:Census、CS-Census、MCT、BRIEF 和 MV。
structured_light: 生成結(jié)構(gòu)光模式,投影結(jié)構(gòu)光,解碼結(jié)構(gòu)光圖像,三維重建等
superres: 超分辨率圖像處理技術(shù),旨在通過使用算法和圖像處理方法將低分辨率圖像恢復(fù)到高分辨率的過程
surface_matching: 用于三維物體檢測(cè)和定位的功能
text: 視覺文本匹配,在一個(gè)視覺場(chǎng)景中檢測(cè)文字,切分單詞,并識(shí)別文字
tracking: 基于視覺的物體跟蹤
videostab: 視頻穩(wěn)定功能。用于減少由于相機(jī)抖動(dòng)或運(yùn)動(dòng)導(dǎo)致的視頻劇烈晃動(dòng)或抖動(dòng)。
viz: 提供了三維可視化功能。該模塊允許在應(yīng)用程序中創(chuàng)建、渲染和交互式顯示三維場(chǎng)景和對(duì)象。
xfeatures2d: 特征檢測(cè)與描述符的擴(kuò)展功能,包含了一些實(shí)驗(yàn)性的和付費(fèi)的專利特征檢測(cè)器/描述符算法
ximgproc: 擴(kuò)展圖像處理。包括結(jié)構(gòu)化森林、域變換濾波器、引導(dǎo)濾波器、自適應(yīng)流形濾波器、聯(lián)合雙邊濾波器和超像素等算法。
xobjdetect: 增強(qiáng)的2D對(duì)象檢測(cè)。使用Waldboost級(jí)聯(lián)和計(jì)算作為積分特征的局部二值模式,用于2D對(duì)象檢測(cè)。
xphoto: 擴(kuò)展的計(jì)算攝影。提供額外的照片處理算法:色彩平衡、降噪和修復(fù)處理等功能。
二、常用函數(shù)目錄
盡管OpenCV提供了眾多的圖像處理函數(shù),但是對(duì)于大多數(shù)人而言,可能很多功能函數(shù)都用不到。OpenCV是一個(gè)包括了多個(gè)視覺方向的圖像庫(kù),針對(duì)每個(gè)人自己感興趣的方向,學(xué)習(xí)使用對(duì)應(yīng)的功能函數(shù)即可。比如,做工業(yè)視覺檢測(cè)方向的人,可能更關(guān)注常規(guī)的圖像處理方法、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等功能;做三維視覺的人,可能更關(guān)注OpenCV的三維功能;專注做視覺算法的人,可能更關(guān)注某個(gè)方向的最新的圖像處理算法。做人臉識(shí)別的人,可能關(guān)注點(diǎn)是OpenCV的人臉識(shí)別功能。
但是,不管利用OpenCV來(lái)實(shí)現(xiàn)什么功能,一些常用的圖像處理函數(shù)還是需要熟悉怎么使用,下面是OpenCV的常用函數(shù)列表。如果熟悉了這些函數(shù)的使用方法,則可以快速實(shí)現(xiàn)自己想要的功能。
三、imread、imwrite、imshow、VideoCapture、VideoWriter
imread、imwrite、imshow、VideoCapture是OpenCV提供的最基本的功能,包括圖像、視頻的讀取,顯示和保存。
1、imread函數(shù)
用于讀取圖像,定義如下:
Mat imread( const String& filename, int flags = IMREAD_COLOR );
參數(shù):
Filename:文件名
Flags:讀取標(biāo)識(shí),枚舉類型,可以取以下值
enum ImreadModes {
IMREAD_UNCHANGED = -1, //返回原始通道圖像
IMREAD_GRAYSCALE = 0, //返回灰度圖
IMREAD_COLOR = 1, //返回三通道BGR圖像
IMREAD_ANYDEPTH = 2, //當(dāng)輸入具有相應(yīng)的深度時(shí)返回16位/ 32位圖像,否則將其轉(zhuǎn)換為8位
IMREAD_ANYCOLOR = 4, //以任何可能的顏色格式讀取圖像
IMREAD_LOAD_GDAL = 8, //使用gdal的驅(qū)動(dòng)加載圖像
IMREAD_REDUCED_GRAYSCALE_2 = 16, //總是為灰度圖像,并且圖像大小為原來(lái)的1/2
IMREAD_REDUCED_COLOR_2 = 17, //總是為三通道BGR圖像,并且圖像大小為原來(lái)的1/2
IMREAD_REDUCED_GRAYSCALE_4 = 32, //總是為灰度圖像,并且圖像大小為原來(lái)的1/4.
IMREAD_REDUCED_COLOR_4 = 33, //總是為三通道BGR圖像,并且圖像大小為原來(lái)的1/4.
IMREAD_REDUCED_GRAYSCALE_8 = 64, //總是為灰度圖像,并且圖像大小為原來(lái)的1/8.
IMREAD_REDUCED_COLOR_8 = 65, //總是為三通道BGR圖像,并且圖像大小為原來(lái)的1/8.
IMREAD_IGNORE_ORIENTATION = 128 //不會(huì)根據(jù)EXIF的方向標(biāo)志旋轉(zhuǎn)圖像.
};
flags參數(shù)取“0”或“1”比較常見,取“0”是得到的圖像是灰度圖像。取“1”得到三通道彩色圖像。
2、imwrite函數(shù)
用于保存圖像,定義如下:
bool imwrite( const String& filename, InputArray img, const std::vector& params = std::vector());
參數(shù):
Filename:文件名
img:要保存的圖像
params:表示為特定格式保存的參數(shù)編碼,通常直接采用默認(rèn)值。
3、imshow函數(shù)
用于顯示圖像,常和namedWindows函數(shù)同時(shí)使用,namedWindows函數(shù)用于創(chuàng)建一個(gè)顯示窗體,如果不使用namedWindows函數(shù),imshow函數(shù)將默認(rèn)采用一個(gè)窗體顯示圖像。該函數(shù)定義如下:
void imshow(const String& winname, InputArray mat)
參數(shù):
winname:顯示圖像的窗口名稱,可以用namedWindow函數(shù)創(chuàng)建顯示窗口。
mat:需要顯示的Mat圖像
如果用namedWindow函數(shù)創(chuàng)建窗體,namedWindow函數(shù)定義如下:
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
其中參數(shù)winname, 用于設(shè)置窗口名,flags 參數(shù)表示窗口的樣式,有以下幾種值可以選擇:
WINDOW_NORMAL、WINDOW_AUTOSIZE、WINDOW_FREERATIO、WINDOW_KEEPRATIO、WINDOW_FULLSCREEN、WINDOW_GUI_EXPANDED、WINDOW_GUI_NORMAL。
示例代碼:
c++:讀寫圖像、顯示圖像
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
Mat ReadImage = imread("E:/TestImage/data/aloeL.jpg", 1);
namedWindow("ReadImage", 0);
imwrite("E:/TestImage/test.png", ReadImage);
imshow("ReadImage", ReadImage);
waitKey(0);
return 0;
}
python:讀寫圖像、顯示圖像
import cv2.cv2 as cv2
#如果支持中文路徑,可以采用以下方式
#ReadImage=cv2.imread("E:/TestImage/data/aloeL.jpg",1)
#如果不支持中文,請(qǐng)采用以下方式
ReadImage = cv2.imdecode(np.fromfile("E:/TestImage/data/aloeL.jpg", dtype =np.uint8),1)
#如果支持中文路徑,可以采用以下方式
#cv2.imwrite("E:/TestImage/test.png",ReadImage)
#如果不支持中文,請(qǐng)采用以下方式
fileName ="E:/TestImage/test.png"
cv2.imencode('.png',ReadImage)[1].tofile(fileName)
cv2.namedWindow("ReadImage",cv2.WINDOW_NORMAL)
cv2.imshow("ReadImage",ReadImage)
cv2.waitKey(0)
注意:如果讀寫圖像不支持中文路徑,OpenCV還提供了imdecode和imencode兩個(gè)函數(shù),用于編解碼方法讀寫圖像。
emgucv:讀寫圖像、顯示圖像
using Emgu.CV.CvEnum;
namespace test
{
class Program
{
static void Main(string[] args)
{
Mat ReadImage = CvInvoke.Imread("E:/TestImage/data/aloeL.jpg", (ImreadModes)0);
CvInvoke.Imwrite("E:/TestImage/test.png", ReadImage);
CvInvoke.NamedWindow("ReadImage", 0);
CvInvoke.Imshow("ReadImage", ReadImage);
CvInvoke.WaitKey(0);
return;
}
}
}
OpenCVsharp:讀寫圖像、顯示圖像
using OpenCvSharp;
namespace OpenCVSharpTestFunction
{
class Program
{
static void Main(string[] args)
{
Mat ReadImage = Cv2.ImRead("E:/TestImage/data/aloeL.jpg", (ImreadModes)0);
Cv2.ImWrite("E:/TestImage/test.png", ReadImage);
Cv2.NamedWindow("ReadImage", 0);
Cv2.ImShow("ReadImage", ReadImage);
Cv2.WaitKey(0);
return;
}
}
}
4、VideoCapture類
VideoCapture是OpenCV提供的用于讀取視頻的類。通過open函數(shù)可以打開攝像頭或者視頻文件,該類中還提供了set函數(shù),設(shè)置攝像頭圖像采集參數(shù)的函數(shù)。
c++:讀取視頻
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
cv::VideoCapture cap; //聲明相機(jī)捕獲對(duì)象
cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
cap.set(cv::CAP_PROP_FRAME_WIDTH, 640); //圖像的寬,需要相機(jī)支持此寬
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480); //圖像的高,需要相機(jī)支持此高,圖像分辨率640×480
int deviceID = 0; //相機(jī)設(shè)備號(hào)
cap.open(deviceID); //打開相機(jī),如果打開視頻文件,直接輸入視頻文件路徑和文件名
if (!cap.isOpened()) //判斷相機(jī)是否打開
{
std::cerr << "ERROR!!Unable to open camera\n";
return -1;
}
cv::Mat img;
while (true)
{
cap >> img; //以流形式捕獲圖像
cv::namedWindow("example", 1); //創(chuàng)建一個(gè)窗口用于顯示圖像,1代表窗口適應(yīng)圖像的分辨率進(jìn)行拉伸。
if (img.empty() == false) //圖像不為空則顯示圖像
{
cv::imshow("example", img);
}
int key = cv::waitKey(30); //等待30ms
if (key == int('q')) //按下q退出
{
break;
}
}
cap.release(); //釋放相機(jī)捕獲對(duì)象
cv::destroyAllWindows(); //關(guān)閉所有窗口
return 0;
}
python:讀取視頻
import numpy as np
import cv2.cv2 as cv2
#讀取攝像頭圖像
# cap = cv2.VideoCapture(0)
cap = cv2.VideoCapture('E:/TestImage/test.mp4')
while cap.isOpened():
ret, frame = cap.read()
if ret:
# 在這里進(jìn)行對(duì)幀的處理,比如展示、分析等
cv2.imshow("test",frame);
# 按下 'q' 鍵退出循環(huán)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
emgucv:讀取視頻
using Emgu.CV;
using System;
namespace test
{
class Program
{
static void Main(string[] args)
{
// 視頻文件路徑
string videoPath = "E:/TestImage/test.mp4";
VideoCapture capture = new VideoCapture(videoPath);
if (!capture.IsOpened)
{
Console.WriteLine("無(wú)法打開視頻文件!");
return;
}
// 創(chuàng)建一個(gè)窗口顯示視頻幀
CvInvoke.NamedWindow("Video", 0);
while (true)
{
// 從視頻中讀取下一幀
Mat frame = capture.QueryFrame();
if (frame == null)
break;
CvInvoke.Imshow("Video", frame);
if (CvInvoke.WaitKey(30) == 27)
break;
}
// 關(guān)閉視頻窗口
CvInvoke.DestroyWindow("Video");
}
}
}
OpenCVsharp:讀取視頻
using OpenCvSharp;
using System;
namespace OpenCVSharpTestFunction
{
class Program
{
static void Main(string[] args)
{
string videoPath = "E:/TestImage/test.mp4";
VideoCapture capture = new VideoCapture(videoPath);
if (!capture.IsOpened())
{
Console.WriteLine("無(wú)法打開視頻文件!");
return;
}
Cv2.NamedWindow("Video", WindowMode.AutoSize);
while (true)
{
Mat frame = new Mat();
if (!capture.Read(frame))
break;
Cv2.ImShow("Video", frame);
if (Cv2.WaitKey(30) == 'q')
break;
}
// 關(guān)閉視頻窗口
Cv2.DestroyWindow("Video");
}
}
}
5、VideoWriter類
VideoWriter是OpenCV提供的用于保存視頻的類。VideoWriter與VideoCapture類似。
c++:寫視頻
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap;
cap.open(0); // 打開攝像頭,如果打開視頻文件,直接輸入文件路徑和文件名
if (!cap.isOpened())
{
cout << "Couldn't open capture." << endl;
return -1;
}
double fps = 30;
cv::Size size(
(int)cap.get(cv::CAP_PROP_FRAME_WIDTH), (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT)
);
cv::VideoWriter writer;
writer.open("E:/test/test.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, size);
if (!writer.isOpened())
{
cout << "Could not open the output video file for write" << endl;
return -1;
}
cv::Mat bgr_frame;
for (;;)
{
cap >> bgr_frame;
if (bgr_frame.empty()) break;
writer << bgr_frame;
char c = cv::waitKey(10);
if (c == 27) break;
}
return 0;
}
python:寫視頻
import cv2.cv2 as cv2
cap = cv2.VideoCapture('E:/TestImage/test.mp4')
output_file = 'E:/TestImage/output.mp4'
codec = cv2.VideoWriter_fourcc(*'mp4v')
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
# 創(chuàng)建VideoWriter對(duì)象
out = cv2.VideoWriter(output_file, codec, 24,(frame_width, frame_height))
cv2.namedWindow("test", 0)
while cap.isOpened():
# 在這里獲取當(dāng)前幀
ret, frame = cap.read()
if frame is not None:
# 將幀寫入視頻
out.write(frame)
cv2.imshow("test", frame)
# 按下 'q' 鍵退出循環(huán)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
out.release()
cv2.destroyAllWindows()
emgucv:寫視頻
using Emgu.CV.CvEnum;
using Emgu.CV;
using System;
using System.Drawing;
namespace test
{
class Program
{
static void Main(string[] args)
{
string videoPath = "E:/TestImage/test.mp4";
VideoCapture capture = new VideoCapture(videoPath);
if (!capture.IsOpened)
{
Console.WriteLine("無(wú)法打開視頻文件!");
return;
}
string outputPath = "E:/TestImage/output.mp4";
int width = (int)capture.GetCaptureProperty(CapProp.FrameWidth);
int height = (int)capture.GetCaptureProperty(CapProp.FrameHeight);
VideoWriter writer = new VideoWriter(outputPath, 24, new Size(width, height), true);
if (!writer.IsOpened)
{
Console.WriteLine("無(wú)法創(chuàng)建視頻文件!");
return;
}
// 創(chuàng)建一個(gè)窗口顯示視頻幀
CvInvoke.NamedWindow("Video", 0);
while (true)
{
using (Mat frame = capture.QueryFrame())
{
if (frame == null)
break;
writer.Write(frame);
CvInvoke.Imshow("Video", frame);
if (CvInvoke.WaitKey(30) == 'q')
break;
}
}
}
}
}
OpenCVsharp:寫視頻文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-730580.html
using OpenCvSharp;
using System;
namespace OpenCVSharpTestFunction
{
class Program
{
static void Main(string[] args)
{
string videoPath = "E:/TestImage/test.mp4";
VideoCapture capture = new VideoCapture(videoPath);
if (!capture.IsOpened())
{
Console.WriteLine("無(wú)法打開視頻文件!");
return;
}
string outputPath = "E:/TestImage/output.mp4";
int width = capture.FrameWidth;
int height = capture.FrameHeight;
VideoWriter writer = new VideoWriter(outputPath, VideoWriter.FourCC(@"MP4V"), 24, new Size(width, height));
if (!writer.IsOpened())
{
Console.WriteLine("無(wú)法創(chuàng)建視頻文件!");
return;
}
Cv2.NamedWindow("Video", WindowMode.FreeRatio);
try
{
while (true)
{
Mat frame = new Mat();
if (!capture.Read(frame))
break;
writer.Write(frame);
Cv2.ImShow("Video", frame);
if (Cv2.WaitKey(30) == 'q')
break;
}
// 關(guān)閉視頻窗口
Cv2.DestroyWindow("Video");
}
catch
{
}
}
}
}
OpenCV學(xué)習(xí)平臺(tái),是一個(gè)交互式可視化的操作平臺(tái),旨在讓大家快速掌握OpenCV,代碼自動(dòng)生成,不需要寫代碼即可快速掌握OpenCV的使用。支持c++、python、opencvshape,emgucv、直接復(fù)制生成的代碼就可以使用。
鏈接: https://pan.baidu.com/s/1XyotEmXLfD-XCNCYOiVUYg
提取碼: aj9d文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-730580.html
到了這里,關(guān)于OpenCV從入門到精通(一) ——OpenCV簡(jiǎn)介、模塊、常用函數(shù)、圖像視頻讀取顯示保存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!