日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MAT类如何存储数据

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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类如何存储数据的全部內容,希望文章能夠幫你解決所遇到的問題。

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