【華為人】——創(chuàng)新,需要一點點超前
1039
2025-03-31
本文是《OpenCV實戰(zhàn)從入門到精通》系列之第8篇
【OpenCV】OpenCV實戰(zhàn)從入門到精通之一 -- OpenCV宏的講解
【OpenCV】OpenCV實戰(zhàn)從入門到精通之二 -- OpenCV如何進(jìn)行圖像腐蝕操作
【OpenCV】OpenCV實戰(zhàn)從入門到精通之三 -- canny邊緣檢測
【OpenCV】OpenCV實戰(zhàn)從入門到精通之四 -- 常用的函數(shù)講解(mat、imread、imshow、imwrite、nameWindow)
【OpenCV】OpenCV實戰(zhàn)從入門到精通之五 -- 教你使用Rect()函數(shù)
【OpenCV】OpenCV實戰(zhàn)從入門到精通之六 -- 教你如何使用滑動條-createTrackbar()函數(shù)
【OpenCV】OpenCV實戰(zhàn)從入門到精通之七 -- 教你如何使用鼠標(biāo)操作SetMouseCallback
目錄
本文是《OpenCV實戰(zhàn)從入門到精通》系列之第8篇
圖像容器Mat
Mat類:(1)不必手動開辟空間(2)不必再不需要時立即釋放空間
為了解決傳遞圖像時需要復(fù)制矩陣、降低程序的速度等問題,OpenCV使用了引用計數(shù)機制。(共享同一矩陣,有各自信息頭)
如果確實想復(fù)制矩陣本身
像素值存儲方法
創(chuàng)建Mat對象的多種方法
圖像容器Mat
一幅圖片(數(shù)字圖像)是一個像素點矩陣
剛開始的OpenCV,一直是C語言,也就是需要手動管理內(nèi)存,必須release掉,否則會內(nèi)存泄露
2.0時代以后,引入了C++類概念,廣義上可以自動內(nèi)存管理
Mat類:(1)不必手動開辟空間(2)不必再不需要時立即釋放空間
Mat類由兩部分?jǐn)?shù)據(jù)組成:
矩陣頭(矩陣尺寸+存儲方法+存儲地址)
指向存儲所有像素值得矩陣的指針
為了解決傳遞圖像時需要復(fù)制矩陣、降低程序的速度等問題,OpenCV使用了引用計數(shù)機制。(共享同一矩陣,有各自信息頭)
Mat A, C;//僅創(chuàng)建信息頭
A = imread("my.jpg", CV_LOAD_IMAGE_COLOR); //開辟矩陣空間
Mat B(A); //拷貝構(gòu)造函數(shù)
C = A; //賦值運算符
如果要對某個區(qū)域進(jìn)行提取。 也只需要創(chuàng)建包含邊界信息的信息頭
Mat D(A, Rect(10,10,100,100)); // 使用矩形邊界界定
Mat E = A(Range:all(), Range(1,3));//使用行和列界定
如果確實想復(fù)制矩陣本身
Mat F = A.clone();
Mat G;
A.copyTo(G);
像素值存儲方法
通常用三個或四個基元素來表示顏色。有時為了表示 透明色,會加入第四個元素alpha(A)
顏色系統(tǒng)分類:
RGB, 最常用
HSV ? ?HLS ?將顏色分為色調(diào)、飽和度、亮度/明度
YCrCb 在 JPEG圖像格式中廣泛使用
CIE ? ? ?L*a*b* 是一種感知上均勻的顏色空間,用來度量兩個顏色的距離
創(chuàng)建Mat對象的多種方法
預(yù)備知識:這里解釋下形如CV_8UC3 的意思。
形如: ?CV_[位數(shù)][帶符號與否][類型前綴]C[通道數(shù)]
那么 CV_8UC3 表示使用8位的unsigned char類型,每個像素由三個元素組成三通道。
/*
功能:新建Mat類的幾種方法
*/
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//方法1:創(chuàng)建無初始化矩陣
Mat image1;
//方法二:創(chuàng)建4行6列類型為8位單通道矩陣
Mat image2(4, 6, CV_8UC1);
//方法三:創(chuàng)建大小為4×3類型為8位3通道矩陣;為3行4列,每三個數(shù)為一組。
Mat image3(Size(4, 3), CV_8UC3);
//方法四:創(chuàng)建一個用1+3j填充的2×4復(fù)矩陣;為2行4列,每兩個數(shù)為一組。
Mat image4(2, 4, CV_32FC2, Scalar(1, 3));
//方法五:創(chuàng)建大小為5×3類型為8位3通道矩陣;為3行5列,每三個數(shù)為一組。
Mat image5(Size(5, 3), CV_8UC3, Scalar(1, 2, 3));
//方法六:將image2賦值給image6,共用數(shù)據(jù)對象
Mat image6(image2);
//方法七:將image2賦值給image6,克隆
Mat image7 = image2.clone();
//方法八:將image2賦值給image6,復(fù)制。注意:方法六、七、八、這三種復(fù)制的方法寫法!!!
Mat image8;
image2.copyTo(image8);
//輸出矩陣結(jié)果
cout << "image1 = " << endl << image1 << endl << endl;
cout << "image2 = " << endl << image2 << endl << endl;
cout << "image3 = " << endl << image3 << endl << endl;
cout << "image4 = " << endl << image4 << endl << endl;
cout << "image5 = " << endl << image5 << endl << endl;
cout << "image6 = " << endl << image6 << endl << endl;
cout << "image7 = " << endl << image7 << endl << endl;
cout << "image8 = " << endl << image8 << endl << endl;
//方法1:2x4行,3通道,三通道初值設(shè)為(1,2,3)
Mat img1(2, 4, CV_8UC3, Scalar(1, 2, 3));
//方法2:創(chuàng)造多維矩陣,指定維數(shù),然后傳遞指向數(shù)組指針,包含每個維度尺寸
//比如創(chuàng)造4維矩陣,每一維分別有2,3,4,5維,這個不能輸出
int sz[4] = {2,3,4,5};
Mat img2(4, sz,CV_8UC1 , Scalar::all(0));
//方法3:為已經(jīng)存在IplImage指針創(chuàng)建信息頭
//opencv2.4.9版本
//IplImage* img3 = cvLoadImage("1.jpg", 1);
//Mat mtx(img3);
//opencv3.0.0版本
IplImage* temp = cvLoadImage("1.jpg", 1);
Mat img3 = cv::cvarrToMat(temp);
//方法4:利用Create函數(shù)
Mat img4;
img4.create(4, 4, CV_8UC(2));
//方法5:matlab初始化
Mat img5 = Mat::eye(4, 4, CV_64F);
Mat img6 = Mat::ones(3, 3, CV_32F);
Mat img7 = Mat::zeros(2, 2, CV_8UC1);
//方法6:對小矩陣使用逗號分隔式初始化
Mat img8 = (Mat_
//輸出矩陣結(jié)果
cout << "img1 = " << endl << img1 << endl << endl;
//cout << "img2 = " << endl << img2 << endl << endl;
cout << "img3 = " << endl << img3 << endl << endl;
cout << "img4 = " << endl << img4 << endl << endl;
cout << "img5 = " << endl << img5 << endl << endl;
cout << "img6 = " << endl << img6 << endl << endl;
cout << "img7 = " << endl << img7 << endl << endl;
cout << "img8 = " << endl << img8 << endl << endl;
system("pause"); //作用:暫停黑窗口,否則窗口一閃而過,看不見信息
return 0;
}
結(jié)果如下:
Image OpenCV
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。