【OpenCV】OpenCV實戰(zhàn)從入門到精通之八 -- 帶你深入理解Mat容器

      網(wǎ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類的幾種方法

      */

      【OpenCV】OpenCV實戰(zhàn)從入門到精通之八 -- 帶你深入理解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_(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);

      //輸出矩陣結(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)容。

      上一篇:excel截長圖(excel截長圖怎么保存)
      下一篇:Excel怎么快速插入自己收藏的剪貼畫
      相關(guān)文章
      国产青草亚洲香蕉精品久久| 国产成人精品日本亚洲语音| 国产91精品一区二区麻豆亚洲| 亚洲欧美日韩中文字幕一区二区三区| 亚洲国产韩国一区二区| 亚洲综合久久1区2区3区| 亚洲日本中文字幕| 亚洲一区二区成人| 亚洲视频国产视频| 亚洲国产福利精品一区二区| 亚洲精品456在线播放| 亚洲短视频在线观看| 亚洲嫩草影院在线观看| 亚洲熟妇av一区二区三区下载| 亚洲综合在线成人一区| 亚洲美女色在线欧洲美女| 亚洲精品中文字幕乱码| 亚洲乱码日产精品BD在线观看| 亚洲一区二区三区久久| 色婷五月综激情亚洲综合| 亚洲精品av无码喷奶水糖心| 国产AV无码专区亚洲AV蜜芽| 亚洲精品和日本精品| 91麻豆精品国产自产在线观看亚洲| 在线观看午夜亚洲一区| 亚洲AV永久无码精品一百度影院| 久久精品国产亚洲av麻| 亚洲高清无在码在线无弹窗| 亚洲电影在线播放| 亚洲看片无码在线视频| 亚洲av乱码中文一区二区三区| 亚洲国产成人久久综合区| 精品国产日韩亚洲一区| 亚洲AV无码一区二区乱孑伦AS | 亚洲av成人片在线观看| 高清在线亚洲精品国产二区| 国产a v无码专区亚洲av| 久久亚洲精品成人综合| 91亚洲视频在线观看| 亚洲欧美中文日韩视频| 亚洲第一页综合图片自拍|