久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【從零學(xué)習(xí)OpenCV 4】Mat類介紹

 小白學(xué)視覺 2021-01-28

重磅干貨,,第一時(shí)間送達(dá)

經(jīng)過幾個(gè)月的努力,小白終于完成了市面上第一本OpenCV 4入門書籍《從零學(xué)習(xí)OpenCV 4》,。為了更讓小伙伴更早的了解最新版的OpenCV 4,,小白與出版社溝通,提前在公眾號(hào)上連載部分內(nèi)容,,請(qǐng)持續(xù)關(guān)注小白,。

其實(shí)在最早的OpenCV 1.0版本中,,圖像使用名為IplImage的C語言結(jié)構(gòu)體進(jìn)行存儲(chǔ)的,,所以在很多比較老的OpenCV版本教程中常會(huì)看到其身影,。但是使用IplImage類型存在需要用戶手動(dòng)釋放內(nèi)存的缺點(diǎn),,如果程序結(jié)束后存在沒有釋放內(nèi)存的IplImage變量,,就會(huì)造成內(nèi)存泄漏的問題,。值得慶幸的是,,隨著OpenCV版本的更新,,OpenCV引入C++接口,,提供Mat類用于存儲(chǔ)數(shù)據(jù),,利用自動(dòng)內(nèi)存管理技術(shù)很好的解決了內(nèi)存自動(dòng)釋放的問題,,當(dāng)變量不再需要時(shí)立即釋放內(nèi)存。


Mat類用來保存矩陣類型的數(shù)據(jù)信息,,包括向量,、矩陣、灰度或彩色圖像等數(shù)據(jù),。Mat類分為矩陣頭和指向存儲(chǔ)數(shù)據(jù)的矩陣指針兩部分,。矩陣頭中包含矩陣的尺寸、存儲(chǔ)方法,、地址和引用次數(shù)等,。矩陣頭的大小是一個(gè)常數(shù),不會(huì)隨著矩陣尺寸大小而改變,。在絕大多數(shù)情況下矩陣頭大小遠(yuǎn)小于矩陣中數(shù)據(jù)量的大小,,因此圖像復(fù)制和傳遞過程中主要的開銷是存放矩陣數(shù)據(jù)。為了解決這個(gè)問題,,在OpenCV中復(fù)制和傳遞圖像時(shí),,只是復(fù)制了矩陣頭和指向存儲(chǔ)數(shù)據(jù)的指針,因此在創(chuàng)建Mat類時(shí)可以先創(chuàng)建矩陣頭后賦值數(shù)據(jù),,其方法如代碼清單2-1所示,。

代碼清單2-1 創(chuàng)建Mat類
cv::Mat a; //創(chuàng)建一個(gè)名為a的矩陣頭
a = cv::imread(“test.jpg”); //向a中賦值圖像數(shù)據(jù),矩陣指針指向像素?cái)?shù)據(jù)
cv::Mat b=a; //復(fù)制矩陣頭,,并命名為b

上面這段代碼首先創(chuàng)建了一個(gè)名為a的矩陣頭,,之后讀入一張圖像并將a中的矩陣指針指向該圖像的像素?cái)?shù)據(jù),最后將a矩陣頭中的內(nèi)容復(fù)制到b矩陣頭中,。雖然a,、b有各自的矩陣頭,但是其矩陣指針指向的是同一個(gè)矩陣數(shù)據(jù),,通過任意一個(gè)矩陣頭修改矩陣中的數(shù)據(jù),,另一個(gè)矩陣頭指向的數(shù)據(jù)也會(huì)跟著發(fā)生改變。但是當(dāng)刪除a變量時(shí),,b變量并不會(huì)指向一個(gè)空數(shù)據(jù),,只有當(dāng)兩個(gè)變量都刪除后,才會(huì)釋放矩陣數(shù)據(jù),。因?yàn)榫仃囶^中引用次數(shù)標(biāo)記了引用某個(gè)矩陣數(shù)據(jù)的次數(shù),,只有當(dāng)矩陣數(shù)據(jù)引用次數(shù)為0的時(shí)候才會(huì)釋放矩陣數(shù)據(jù)。

提示

采用引用次數(shù)來釋放存儲(chǔ)內(nèi)容是C++中常見的方式,,用這種方式可以避免仍有某個(gè)變量引用數(shù)據(jù)時(shí)將這個(gè)數(shù)據(jù)刪除造成程序崩潰的問題,,同時(shí)極大的縮減了程序運(yùn)行時(shí)所占用的內(nèi)存。

接下來我們來了解Mat類里可以存儲(chǔ)的數(shù)據(jù)類型,,根據(jù)官方給出的Mat類繼承圖,,如圖2-2所示,,我們發(fā)現(xiàn)Mat類可以存儲(chǔ)的數(shù)據(jù)類型包含double、float,、uchar,、unsigned char以及自定義的模板等。

圖2-2 Mat類繼承關(guān)系圖

我們可以通過代碼清單2-2的方式聲明一個(gè)存放指定類型的Mat類變量:

代碼清單2-2 聲明一個(gè)指定類型的Mat類
cv::Mat A = Mat_<double>(3,3);//創(chuàng)建一個(gè)3*3的矩陣用于存放double類型數(shù)據(jù)

由于OpenCV提出Mat類主要用于存儲(chǔ)圖像,,而像素值的最大值又決定了圖像的質(zhì)量,,如果用8位無符號(hào)整數(shù)去存儲(chǔ)16位圖像,會(huì)造成嚴(yán)重的圖像顏色失真或造成數(shù)據(jù)錯(cuò)誤,。而由于不同位數(shù)的編譯器對(duì)數(shù)據(jù)長(zhǎng)度定義不同,,為了避免在不同環(huán)境下因變量位數(shù)長(zhǎng)度不同而造成程序執(zhí)行問題,OpenCV根據(jù)數(shù)值變量存儲(chǔ)位數(shù)長(zhǎng)度定義了數(shù)據(jù)類型,,表2-1中列出了OpenCV中的數(shù)據(jù)類型與取值范圍,。

表2-1 OpenCV中的數(shù)據(jù)類型與取值范圍

數(shù)據(jù)類型

具體類型

取值范圍

CV_8U

8位無符號(hào)整數(shù)

0—255

CV_8S

8位符號(hào)整數(shù)

-128—127

CV_16U

16位無符號(hào)整數(shù)

0-65535

CV_16S

16位符號(hào)整數(shù)

-32768—32767

CV_32S

32位符號(hào)整數(shù)

-2147483648—2147483647

CV_32F

32位浮點(diǎn)整數(shù)

-FLT_MAX—FLT_MAX, INF, NAN

CV_64F

64位浮點(diǎn)整數(shù)

-DBL_MAX—DBL_MAX, INF, NAN

僅有數(shù)據(jù)類型是不夠的,,還需要定義圖像數(shù)據(jù)的通道(Channel)數(shù),,例如灰度圖像數(shù)據(jù)是單通道數(shù)據(jù),彩色圖像數(shù)據(jù)是3通道或者4通道數(shù)據(jù),。因此針對(duì)這個(gè)情況,,OpenCV還定義了通道數(shù)標(biāo)識(shí),C1,、C2,、C3、C4分別表示單通道,、雙通道,、3通道和4通道。每一種數(shù)據(jù)類型都存在多個(gè)通道的情況,,所以將數(shù)據(jù)類型與通道數(shù)表示結(jié)合便得到了OpenCV中對(duì)圖像數(shù)據(jù)類型的完整定義,,例如CV_8UC1表示的就是8位單通道數(shù)據(jù),用于表示8位灰度圖,,而CV_8UC3表示的是8位3通道數(shù)據(jù),,用于表示8位彩色圖。我們可以通過代碼清單2-3的方式創(chuàng)建一個(gè)聲明通道數(shù)和數(shù)據(jù)類型的Mat類:

代碼清單2-3 通過OpenCV數(shù)據(jù)類型創(chuàng)建Mat類
cv::Mat a(640,480,CV_8UC3) //創(chuàng)建一個(gè)640*480的3通道矩陣用于存放彩色圖像
cv::Mat a(3,3,CV_8UC1) //創(chuàng)建一個(gè)3*3的8位無符號(hào)整數(shù)的單通道矩陣
cv::Mat a(3,3,CV_8U) //創(chuàng)建單通道矩陣C1標(biāo)識(shí)可以省略

注意

雖然在64位編輯器里,,uchar和CV_8U都表示8位無符號(hào)整數(shù),,但是兩者有嚴(yán)格的定義,CV_8U只能用在Mat類內(nèi)部的方法,。例如用Mat_<CV_8U>(3,3)和Mat a(3,3,uchar)會(huì)提示創(chuàng)建錯(cuò)誤,。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多