OpenCV3編程入門》第5章-學習筆記7--輸入輸出XML和YAML文件--詳解代碼示例">《OpenCV3編程入門》第5章-學習筆記7--輸入輸出XML和YAML文件--詳解代碼示例
1043
2025-04-02
圖像容器Mat
一幅圖片(數字圖像)是一個像素點矩陣
剛開始的OpenCV,一直是C語言,也就是需要手動管理內存,必須release掉,否則會內存泄露
2.0時代以后,引入了C++類概念,廣義上可以自動內存管理
Mat類:(1)不必手動開辟空間(2)不必再不需要時立即釋放空間
Mat類由兩部分數據組成:
矩陣頭(矩陣尺寸+存儲方法+存儲地址)
指向存儲所有像素值得矩陣的指針
為了解決傳遞圖像時需要復制矩陣、降低程序的速度等問題,OpenCV使用了引用計數機制。(共享同一矩陣,有各自信息頭)
Mat A, C;//僅創建信息頭
A = imread("my.jpg", CV_LOAD_IMAGE_COLOR); //開辟矩陣空間
Mat B(A); //拷貝構造函數
C = A; //賦值運算符
如果要對某個區域進行提取。 也只需要創建包含邊界信息的信息頭
Mat D(A, Rect(10,10,100,100)); // 使用矩形邊界界定
Mat E = A(Range:all(), Range(1,3));//使用行和列界定
如果確實想復制矩陣本身
Mat F = A.clone();
Mat G;
A.copyTo(G);
像素值存儲方法
通常用三個或四個基元素來表示顏色。有時為了表示 透明色,會加入第四個元素alpha(A)
顏色系統分類:
RGB, 最常用
HSV ? ?HLS ?將顏色分為色調、飽和度、亮度/明度
YCrCb 在 JPEG圖像格式中廣泛使用
CIE ? ? ?L*a*b* 是一種感知上均勻的顏色空間,用來度量兩個顏色的距離
創建Mat對象的多種方法
預備知識:這里解釋下形如CV_8UC3 的意思。
形如: ?CV_[位數][帶符號與否][類型前綴]C[通道數]
那么 CV_8UC3 表示使用8位的unsigned char類型,每個像素由三個元素組成三通道。
/*
功能:新建Mat類的幾種方法
*/
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//方法1:創建無初始化矩陣
Mat image1;
//方法二:創建4行6列類型為8位單通道矩陣
Mat image2(4, 6, CV_8UC1);
//方法三:創建大小為4×3類型為8位3通道矩陣;為3行4列,每三個數為一組。
Mat image3(Size(4, 3), CV_8UC3);
//方法四:創建一個用1+3j填充的2×4復矩陣;為2行4列,每兩個數為一組。
Mat image4(2, 4, CV_32FC2, Scalar(1, 3));
//方法五:創建大小為5×3類型為8位3通道矩陣;為3行5列,每三個數為一組。
Mat image5(Size(5, 3), CV_8UC3, Scalar(1, 2, 3));
//方法六:將image2賦值給image6,共用數據對象
Mat image6(image2);
//方法七:將image2賦值給image6,克隆
Mat image7 = image2.clone();
//方法八:將image2賦值給image6,復制。注意:方法六、七、八、這三種復制的方法寫法!!!
Mat image8;
image2.copyTo(image8);
//輸出矩陣結果
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通道,三通道初值設為(1,2,3)
Mat img1(2, 4, CV_8UC3, Scalar(1, 2, 3));
//方法2:創造多維矩陣,指定維數,然后傳遞指向數組指針,包含每個維度尺寸
//比如創造4維矩陣,每一維分別有2,3,4,5維,這個不能輸出
int sz[4] = {2,3,4,5};
Mat img2(4, sz,CV_8UC1 , Scalar::all(0));
//方法3:為已經存在IplImage指針創建信息頭
//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函數
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_
//輸出矩陣結果
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;
}
結果如下:
Image OpenCV
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。