日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

MAT类如何存储数据

發布時間:2025/5/22 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MAT类如何存储数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看上去這是一個比較簡單的問題,在2.0以上的版本中,使用Mat類來儲存一幅圖像。但是具體的說,Mat類中,又是如何儲存的呢?

在opencv自帶的幫助手冊上有這么一段話:



通過這兩個式子,我們可以略知一二:首先,Mat不僅可以存圖像,也可以用來存放其他高維的數據。數據存在data指針所指向的地址中的,對于高維數據(dim維),每個數據的地址是用上面式子算的;它的一個特例是2維數據(圖像),式子簡化成了下面的那個公式。

為了驗證公式的正確性,我寫了一個小測試程序:

[cpp]?view plaincopy
  • int?main(void)??
  • {??
  • ????Mat?img1?=?imread("D:/picture/images/baboon1.jpg",0);//灰度圖像??
  • ??
  • ????cout<<img1.rows<<endl;??
  • ????cout<<img1.cols<<endl;??
  • ????cout<<img1.size[0]<<endl;//與img1.rows相等??
  • ??
  • ????cout<<(int)img1.at<uchar>(1,2)<<endl;//(1,2)點的灰度值??
  • ????cout<<(int)(*(img1.data?+?img1.step[0]?*?1?+?img1.step[1]?*?2))<<endl;//(1,2)點的灰度值??
  • ??
  • ????Mat?img2?=?imread("D:/picture/images/baboon1.jpg");//彩色圖像??
  • ????cout<<(int)img2.at<Vec3b>(1,2)[1]<<endl;//(1,2)點的G分量??
  • ????cout<<(int)(*(img2.data?+?img2.step[0]?*?1?+?img2.step[1]?*?2??+?sizeof(uchar)))<<endl;//(1,2)點的G分量??
  • ????return?0;??
  • }??

  • 注意,因為8bit圖像對應的像素值為0~255,所以opencv使用了uchar類型,這樣非常節省空間;但是如果想看到具體的像素值,那么得把他轉化為int。

    我們看到,使用at函數和直接求出地址然后對地直接引得到的像素值是相同的。at操作是一個模板函數,所以對于灰度圖像,返回的直接就是對應的像素值;而對于彩色圖像,返回的是一個3元組Vec3b。這個結構是3個uchar連續的放在一起的。所以對于彩色圖像,直接使用公式獲得的是B分量,如果想獲得其他分量,那么得在原始的地址上加上一個sizeof(uchar)。

    總結

    以上是生活随笔為你收集整理的MAT类如何存储数据的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。