国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV從入門到精通(一) ——OpenCV簡(jiǎn)介、模塊、常用函數(shù)、圖像視頻讀取顯示保存

這篇具有很好參考價(jià)值的文章主要介紹了OpenCV從入門到精通(一) ——OpenCV簡(jiǎn)介、模塊、常用函數(shù)、圖像視頻讀取顯示保存。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

說明:關(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模塊介紹,OpenCV4從入門到精通,opencv,計(jì)算機(jī)視覺,圖像處理
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)自己想要的功能。
opencv模塊介紹,OpenCV4從入門到精通,opencv,計(jì)算機(jī)視覺,圖像處理
opencv模塊介紹,OpenCV4從入門到精通,opencv,計(jì)算機(jī)視覺,圖像處理
opencv模塊介紹,OpenCV4從入門到精通,opencv,計(jì)算機(jī)視覺,圖像處理
opencv模塊介紹,OpenCV4從入門到精通,opencv,計(jì)算機(jī)視覺,圖像處理

三、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:寫視頻

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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C語(yǔ)言進(jìn)階】最常用的庫(kù)函數(shù)大全——從入門到精通

    【C語(yǔ)言進(jìn)階】最常用的庫(kù)函數(shù)大全——從入門到精通

    前言: 一.字符串函數(shù) 1.strlen——求字符串長(zhǎng)度 strlen 2.長(zhǎng)度不受限制的字符串函數(shù) a.strcpy——字符串拷貝 strcpy ?b.strcat——追加字符串 strcat ?c.strcmp——字符串比較 strcmp 3.長(zhǎng)度受限制的字符串函數(shù)——strncpy,strncat,strncmp 為什么會(huì)出現(xiàn)這些函數(shù)呢? strncpy函數(shù): strncpy strncat函數(shù)

    2024年02月03日
    瀏覽(19)
  • 《Python入門到精通》time模塊詳解,Python time標(biāo)準(zhǔn)庫(kù),time庫(kù)函數(shù)大全

    《Python入門到精通》time模塊詳解,Python time標(biāo)準(zhǔn)庫(kù),time庫(kù)函數(shù)大全

    「作者主頁(yè)」: 士別三日wyx 「作者簡(jiǎn)介」: CSDN top100、阿里云博客專家、華為云享專家、網(wǎng)絡(luò)安全領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 「推薦專欄」: 小白零基礎(chǔ)《Python入門到精通》

    2024年02月09日
    瀏覽(20)
  • 【OpenCV常用函數(shù):視頻捕獲函數(shù)】cv2.VideoCapture

    輸入視頻路徑,創(chuàng)建VideoCapture的對(duì)象 該類的函數(shù)有: 1)video.isOpened: 檢查視頻捕獲是否成功 2)video.read(): 讀取視頻幀,返回ret, frame,ret為bool類型,表示是否成功 3)video.release(): 關(guān)閉視頻 4)video.get(prop): 獲取video的屬性 如果要讀取視頻的每一幀,然后進(jìn)行相關(guān)的處理時(shí),可

    2024年02月13日
    瀏覽(100)
  • 圖像形態(tài)學(xué)-閾值的概念、功能及操作(threshold()函數(shù)))【C++的OpenCV 第九課-OpenCV圖像常用操作(六)】

    圖像形態(tài)學(xué)-閾值的概念、功能及操作(threshold()函數(shù)))【C++的OpenCV 第九課-OpenCV圖像常用操作(六)】

    首先,顧名思義,“ 閾 ”就是范圍或者 限制 ,所以,“閾值”就是 某個(gè)限制的值 (該值具有一定的數(shù)學(xué)含義,即“ 臨界值 ”,例如車輛限高桿的高度就是一種閾值,不可超越;亦或者1.1米以下兒童不收費(fèi),超過1.1就要收費(fèi)。) 其次,圖形學(xué)中的閾值,往往指某個(gè)你想要

    2024年02月03日
    瀏覽(22)
  • 音視頻從入門到精通——FFmpeg之a(chǎn)v_image_get_buffer_size函數(shù)

    函數(shù)的作用是通過指定像素格式、圖像寬、圖像高來(lái)計(jì)算所需的內(nèi)存大小 重點(diǎn)說明一個(gè)參數(shù)align:此參數(shù)是設(shè)定內(nèi)存對(duì)齊的對(duì)齊數(shù),也就是按多大的字節(jié)進(jìn)行內(nèi)存對(duì)齊。比如設(shè)置為1,表示按1字節(jié)對(duì)齊,那么得到的結(jié)果就是與實(shí)際的內(nèi)存大小一樣。再比如設(shè)置為4,表示按4字節(jié)

    2023年04月15日
    瀏覽(24)
  • 100天精通Golang(基礎(chǔ)入門篇)——第12天:深入解析Go語(yǔ)言中的集合(Map)及常用函數(shù)應(yīng)用

    100天精通Golang(基礎(chǔ)入門篇)——第12天:深入解析Go語(yǔ)言中的集合(Map)及常用函數(shù)應(yīng)用

    ?? 博主 libin9iOak帶您 Go to Golang Language.? ?? 個(gè)人主頁(yè)——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動(dòng)形象??簡(jiǎn)單易學(xué)!歡迎大家來(lái)踩踩~?? ?? 《IDEA開發(fā)秘籍》學(xué)會(huì)IDEA常用操作,工作效率翻倍~?? ?? 希望本文能夠給您帶來(lái)一定的幫助??文章粗淺,敬請(qǐng)批

    2024年02月12日
    瀏覽(26)
  • Opencv4基于C++基礎(chǔ)入門筆記:圖像 顏色 事件響應(yīng) 圖形 視頻 直方圖
Opencv4基于C++的 實(shí)時(shí)人臉檢測(cè)

    Opencv4基于C++基礎(chǔ)入門筆記:圖像 顏色 事件響應(yīng) 圖形 視頻 直方圖 Opencv4基于C++的 實(shí)時(shí)人臉檢測(cè)

    ? 效果圖 ???:opencv人臉識(shí)別效果圖(請(qǐng)叫我真愛粉)???先看一下效果圖勾起你的興趣!? 文章目錄: 一:環(huán)境配置搭建 二:圖像 1.圖像讀取與顯示 main.cpp? 運(yùn)行結(jié)果 2.圖像色彩空間轉(zhuǎn)換 2.1 換色彩? test.h? test.cpp main.cpp?? ?運(yùn)行結(jié)果 2.2 照片換背景 test.h? ? ? ? test.

    2024年02月13日
    瀏覽(26)
  • Opencv4基于C++基礎(chǔ)入門筆記:圖像 顏色 事件響應(yīng) 圖形 視頻 直方圖
Opencv4基于C++的 實(shí)時(shí)人臉監(jiān)測(cè)

    Opencv4基于C++基礎(chǔ)入門筆記:圖像 顏色 事件響應(yīng) 圖形 視頻 直方圖 Opencv4基于C++的 實(shí)時(shí)人臉監(jiān)測(cè)

    ? 效果圖 ???:opencv人臉識(shí)別效果圖(請(qǐng)叫我真愛粉)???先看一下效果圖勾起你的興趣!? 文章目錄: 一:環(huán)境配置搭建 二:圖像 1.圖像讀取與顯示 main.cpp? 運(yùn)行結(jié)果 2.圖像色彩空間轉(zhuǎn)換 2.1 換色彩? test.h? test.cpp main.cpp?? ?運(yùn)行結(jié)果 2.2 照片換背景 test.h? ? ? ? test.

    2024年02月10日
    瀏覽(32)
  • 物聯(lián)網(wǎng)Lora模塊從入門到精通(七)串口通訊

    物聯(lián)網(wǎng)Lora模塊從入門到精通(七)串口通訊

    ? ? ? ? 在Lora模塊的程序設(shè)計(jì)中,串口通信一定是一個(gè)極其重要且常用的通信方式,借助串口通信,我們不但可以向外傳輸我們獲取的數(shù)據(jù),還可以根據(jù)外部指令做出相應(yīng)。 ? ? ? ? 同樣的,在例程中,為我們提供了一個(gè)名為usart1-board.c的庫(kù),幫助我們更好更快的完成串口通

    2024年02月08日
    瀏覽(24)
  • Redis從入門到精通(三:常用指令)

    前邊我們介紹了redis存儲(chǔ)的四種基本數(shù)據(jù)類型,并縱向介紹了這四種數(shù)據(jù)類型的各種指令操作,現(xiàn)在我們這個(gè)章節(jié)從橫向來(lái)總結(jié)一下關(guān)于key的常用指令和數(shù)據(jù)庫(kù)常用指令 刪除指定key del key 獲取key是否存在 exists key 獲取key的類型 type key 排序 sort 改名 rename key newkey renamenx key new

    2024年02月07日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包