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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

opencv中查看mat位图的像素幅度(Cv::matStep)

發布時間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv中查看mat位图的像素幅度(Cv::matStep) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實例

其中step里的 ,其中數據指針首地址是p=0x000000000028d7b0,1280是每行數據所占的字節數,1是每個元素的字節數。

Mat的作用

The class?Mat?represents an n-dimensional dense numerical single-channel or multi-channel array. It can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms may be better stored in a?SparseMat?).

上面的一段話引用自官方的文檔,Mat類用于表示一個多維的單通道或者多通道的稠密數組。能夠用來保存實數或復數的向量、矩陣,灰度或彩色圖像,立體元素,點云,張量以及直方圖(高維的直方圖使用SparseMat保存比較好)。簡而言之,Mat就是用來保存多維的矩陣的。

Mat的常見屬性

  • data??uchar型的指針。Mat類分為了兩個部分:矩陣頭和指向矩陣數據部分的指針,data就是指向矩陣數據的指針。
  • dims?矩陣的維度,例如5*6矩陣是二維矩陣,則dims=2,三維矩陣dims=3.
  • rows? 矩陣的行數
  • cols?? 矩陣的列數
  • size?矩陣的大小,size(cols,rows),如果矩陣的維數大于2,則是size(-1,-1)
  • channels?矩陣元素擁有的通道數,例如常見的彩色圖像,每一個像素由RGB三部分組成,則channels = 3

下面的幾個屬性是和Mat中元素的數據類型相關的。

  • type?
    表示了矩陣中元素的類型以及矩陣的通道個數,它是一系列的預定義的常量,其命名規則為CV_(位數)+(數據類型)+(通道數)。具體的有以下值:?
    CV_8UC1CV_8UC2CV_8UC3CV_8UC4
    CV_8SC1CV_8SC2CV_8SC3CV_8SC4
    CV_16UC1CV_16UC2CV_16UC3CV_16UC4
    CV_16SC1CV_16SC2CV_16SC3CV_16SC4
    CV_32SC1CV_32SC2CV_32SC3CV_32SC4
    CV_32FC1CV_32FC2CV_32FC3CV_32FC4
    CV_64FC1CV_64FC2CV_64FC3CV_64FC4
    這里U(unsigned integer)表示的是無符號整數,S(signed integer)是有符號整數,F(float)是浮點數。?
    例如:CV_16UC2,表示的是元素類型是一個16位的無符號整數,通道為2.?
    C1,C2,C3,C4則表示通道是1,2,3,4?
    type一般是在創建Mat對象時設定,如果要取得Mat的元素類型,則無需使用type,使用下面的depth
  • depth?
    矩陣中元素的一個通道的數據類型,這個值和type是相關的。例如 type為 CV_16SC2,一個2通道的16位的有符號整數。那么,depth則是CV_16S。depth也是一系列的預定義值,?
    將type的預定義值去掉通道信息就是depth值:?
    CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F
  • elemSize?
    矩陣一個元素占用的字節數,例如:type是CV_16SC3,那么elemSize = 3 * 16 / 8 = 6 bytes
  • elemSize1?
    矩陣元素一個通道占用的字節數,例如:type是CV_16CS3,那么elemSize1 = 16? / 8 = 2 bytes = elemSize / channels

下面是一個示例程序,具體說明Mat的各個屬性:

Mat img(3, 4, CV_16UC4, Scalar_<uchar>(1, 2, 3, 4));cout << img << endl;cout << "dims:" << img.dims << endl;cout << "rows:" << img.rows << endl;cout << "cols:" << img.cols << endl;cout << "channels:" << img.channels() << endl;cout << "type:" << img.type() << endl;cout << "depth:" << img.depth() << endl;cout << "elemSize:" << img.elemSize() << endl;cout << "elemSize1:" << img.elemSize1() << endl;

首先創建了一個3*4的具有4個通道的矩陣,其元素類型是CV_16U。Scalar_是一個模板向量,用來初始化矩陣的每個像素,因為矩陣具有4個通道,Scalar_有四個值。其運行結果:?
運行結果首先打印了Mat中的矩陣,接著是Mat的各個屬性。注意其type = 26,而depth = 2。這是由于上面所說的各種預定義類型?
例如,CV_16UC4,CV_8U是一些預定義的常量。

step

Mat中的step是一個MStep的一個實例。其聲明如下:

struct CV_EXPORTS MStep{MStep();MStep(size_t s);const size_t& operator[](int i) const;size_t& operator[](int i);operator size_t() const;MStep& operator = (size_t s);size_t* p;size_t buf[2];protected:MStep& operator = (const MStep&);};

從其聲明中可以看出,MStep和size_t有比較深的關系。用size_t作為參數的構造函數和重載的賦值運算符

MStep(size_t s); MStep& operator = (size_t s);

向size_t的類型轉換以及重載的[ ]運算符返回size_t

const size_t& operator[](int i) const;size_t& operator[](int i);

size_t的數組以及指針?

size_t* p;size_t buf[2];

那么size_t又是什么呢,看代碼

typedef unsigned int size_t;

size_t就是無符號整數。

再看一下MStep的構造函數,就可以知道其究竟保存的是什么了。

inline Mat::MStep::MStep(size_t s) { p = buf; p[0] = s; p[1] = 0; }

從MStep的定義可以知道,buff是一個size_t[2],而p是size_t *,也就是可以把MStep看做一個size_t[2]。那么step中保存的這個size_t[2]和Mat中的數據有何種關系呢。

step[0]是矩陣中一行元素的字節數。

step[1]是矩陣中一個元素的字節數,也就是和上面所說的elemSize相等。

上面說到,Mat中一個uchar* data指向矩陣數據的首地址,而現在又知道了每一行和每一個元素的數據大小,就可以快速的訪問Mat中的任意元素了。下面公式:

step1

?

規整化的step,值為step / elemSize1。 定義如下:

inline size_t Mat::step1(int i) const { return step.p[i]/elemSize1(); }

仍以上例代碼中定義的img為例,來看下step,step1具體的值:?
img(3*4)的type是CV_16UC4,step[0]是其一行所占的數據字節數4 *4 * 16 / 8? = 32.?
step[1] 是一個元素所占的字節數,img的一個元素具有4個通道,故:4 * 16 / 8 = 2?
step1 = step / elemSize1,elemSize1是元素的每個通道所占的字節數。

N維的step(N > 2)

上面分析step是一個size_t[2],實際不是很正確,正確的來說step應該是size_t[dims],dims是Mat的維度,所以對于上面的二維的Mat來說,step是size_t[2]也是正確的。?
下面就對三維的Mat數據布局以及step(維度大于3的就算了吧)。

上圖引用自http://ggicci.blog.163.com/blog/static/210364096201261052543349/? 搜集資料時發現了這幅圖,一切就變的簡單了? 感謝作者?Ggicci

三維的數據在Mat中是按面來存儲的,上圖描述的很清晰,這里不再多說。?
上面言道,step是一個size_t[dims],dims是維度。so,三維的step就是size_t[3]。其余的不多說了,看圖就有了。下面來創建一個三維的Mat,實際看看

int dims[3] = { 3, 3, 3 };Mat src(3, dims, CV_16SC2, Scalar_<short>(1,2));cout << "step[0]:" << src.step[0] << endl;cout << "step[1]:" << src.step[1] << endl;cout << "step[2]:" << src.step[2] << endl;

首先創建一個3*3*3,depth為CV_16S的兩通道的Mat?
step[0]是一個數據面的大小? 3 * 3 * (16 / 8 ) * 2 = 36?
step[1]是一行數據的大小 3 * (16 / 8 ) * 2 = 12?
step[2]是一個元素的大小 2 * (16 / 8) = 4?
?
PS: 三維的Mat 不能使用 <<運算符進行輸出的。

總結

以上是生活随笔為你收集整理的opencv中查看mat位图的像素幅度(Cv::matStep)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 17c精品麻豆一区二区免费 | 打开免费观看视频在线 | 国产精品v日韩精品v在线观看 | 国产精品久久久久久久久久久久久久 | 午夜精品一区二区三区免费视频 | 一区二区视频在线观看 | 欧美xxxxx精品 | 日韩在线免费观看视频 | 天堂在线官网 | 放几个免费的毛片出来看 | 天天操天天干天天爽 | 老司机精品视频网站 | 国产午夜在线观看 | 国产成人自拍网 | 骚视频在线观看 | 好吊色欧美一区二区三区视频 | 免看一级片 | 一区二区三区四区在线播放 | 老妇free性videosxx | 四虎精品视频 | 精品午夜一区二区三区在线观看 | 好吊妞视频在线观看 | 99爱免费 | 亚洲毛片大全 | 天天综合日韩 | 日韩淫视频 | 麻豆免费视频 | 欧美aa视频 | 国产精品国产三级国产传播 | a免费在线| 国产成人免费 | 国产色a | 天天综合天天 | 99精品乱码国产在线观看 | 女~淫辱の触手3d动漫 | 午夜视频a| 1769国产精品视频 | 美女扒开内看个够网站 | xxxwww18| 国产成人专区 | 成人3d动漫一区二区三区 | 亚洲福利网| 风间由美一二三区av片 | 欧美日韩3p | 国产乱码精品一区二区三区五月婷 | 侵犯女教师一区二区三区 | 老司机在线精品视频 | 欧美一区二区三区精品 | 国产极品一区 | 一区二区高清 | 一区二区不卡av | 午夜影视在线观看 | 91丨九色丨蝌蚪丨对白 | 不许穿内裤随时挨c调教h苏绵 | 超碰2020| 女人扒开屁股让我添 | 久色影视 | 亚洲国产精品va在线看黑人 | 中文字幕免费视频 | 亚洲综合成人亚洲 | 又爽又黄又无遮挡 | 欧美一区二区三区在线观看 | 亚洲精品在线视频免费观看 | 天天色成人 | 中文字幕在线观看高清 | 欧美精品一区二区免费 | 性a视频 | 亚洲一区二区不卡视频 | 国内免费精品视频 | 国产女主播在线一区二区 | 在线观看国产麻豆 | 熟睡侵犯の奶水授乳在线 | 最好看的日本字幕mv视频大全 | 欧美久久久久久久久久 | 一区二区成人网 | 视频一区二区在线观看 | 深爱激情五月婷婷 | 99国产视频| 亚洲精品一区二区三区区别 | 99这里都是精品 | 日本免费一区二区视频 | 久精品在线 | 女人性高潮视频 | 免费成人黄 | 黄色av观看 | 91精品福利在线 | 国产精品自拍在线观看 | a级片在线观看 | 91视频综合网 | 黄色免费大片 | 丁香婷婷社区 | 国产成人精品久久二区二区91 | 国产网友自拍视频 | 日日日网站 | 一区二区毛片 | 色久婷婷 | 欧美日本免费 | 久久久国产视频 | 粗大的内捧猛烈进出视频 |