opencv image 指標 畫素

2021-08-31 11:41:34 字數 3655 閱讀 9683

opencv 中3通道image,image中每個點包含3個值,這上個值分別是b g r

例如:2x2 cv_8uc3(uchar channels=3)的影象

mat img_8uc3(2, 2, cv_8uc3, scalar(0, 255, 255)); //初始化為(b g r)=(0, 255, 255)

資料排列方式:

(0,255,255)(0,255,255)

(0,255,255)(0,255,255)

#include "opencv2/imgproc.hpp"

#include "opencv2/imgcodecs.hpp"

#include "opencv2/highgui.hpp"

#include "opencv2/core/utility.hpp" // #include "opencv2/core.hpp"

#include #include//標準輸入輸出

//命名空間

using namespace cv;

using namespace std;

int main(int argc, char const *argv)

{ //建立乙個2*2 型別為8位的uchar型別三通道的 顏色為黃色

mat img_8uc3(2, 2, cv_8uc3, scalar(0, 255, 255));

imshow("img_8uc3",img_8uc3);

mat img_32fc3(2,2,cv_32fc3,scalar(255,0,0));

imshow("img_32fc3",img_32fc3);

for (int i = 0; i(i,j)[k];

//t=((vec3f*)(img_32fc3.data + img_32fc3.step.p[0] * i))[j][k];

t=((float*)(img_32fc3.data + img_32fc3.step.p[0] * i))[ch*j+k];

cout

的mat類成員,是指向影象資料的首位址,位址型別是uchar。在上面個的例子中是img_32fc3的首位址。

mat.step.p[0]代表影象每一行所佔的位元組數,而mat.step.p[1]mat.elemsize()一樣,表示image中每個點所佔的位元組數,對於img_32fc3,img_32fc3.step.p[1]=3*4=12,3表示3通道,4表示float4個位元組,不過這裡沒用mat.step.p[1].

img_32fc3.data + img_32fc3.step.p[0] * i)表示第i+1行的首位址,img_32fc3.data + img_32fc3.step.p[0] * i)位址型別還是uchar,而(float*)表示強制轉換,因為影象img_32fc3是3通道的float型別

[ch*j+k]表示第j列第k(0,1,2)個通道的值。

也可以通過vec的方式操作:

t=((vec3f*)(img_32fc3.data + img_32fc3.step.p[0] * i))[j][0];

t=((vec3f*)(img_32fc3.data + img_32fc3.step.p[0] * i))[j][1];

t=((vec3f*)(img_32fc3.data + img_32fc3.step.p[0] * i))[j][2];

或者使用mat.at的方式,和vec的方式等價

at操作要比指標的操作慢很多,所以對於不連續資料或者單個點處理,可以考慮at操作,對於連續的大量資料,不要使用它

img_32fc3.at(i,j)[0] 

img_32fc3.at(i,j)[1]

img_32fc3.at(i,j)[2]

類似的:

//(i,j)表示行列

t=(img_8uc3.data + img_8uc3.step.p[0] * i)[ch*j+k]//k=0,1,2

t=((vec3b*)(img_8uc3.data + img_8uc3.step.p[0] * i))[j][k];//k=0,1,2

t=img_8uc3.at(i,j)[k];//k=0,1,2

-      if matrix is of type `cv_8u` then use `mat.at(y,x)`.

- if matrix is of type `cv_8s` then use `mat.at(y,x)`.

- if matrix is of type `cv_16u` then use `mat.at(y,x)`.

- if matrix is of type `cv_16s` then use `mat.at(y,x)`.

- if matrix is of type `cv_32s` then use `mat.at(y,x)`.

- if matrix is of type `cv_32f` then use `mat.at(y,x)`.

- if matrix is of type `cv_64f` then use `mat.at(y,x)`.

typedef mat_mat1b;

typedef mat_mat2b;

typedef mat_mat3b;

typedef mat_mat4b;

typedef mat_mat1s;

typedef mat_mat2s;

typedef mat_mat3s;

typedef mat_mat4s;

typedef mat_mat1w;

typedef mat_mat2w;

typedef mat_mat3w;

typedef mat_mat4w;

typedef mat_mat1i;

typedef mat_mat2i;

typedef mat_mat3i;

typedef mat_mat4i;

typedef mat_mat1f;

typedef mat_mat2f;

typedef mat_mat3f;

typedef mat_mat4f;

typedef mat_mat1d;

typedef mat_mat2d;

typedef mat_mat3d;

typedef mat_mat4d;

譯文 此畫素非彼畫素,非彼畫素

這是 一篇 2010 年的文章,很老了。翻譯完這篇文章後,我感覺對於移動網頁的開發。我多想了兩個問題 變模糊?字型使用 em 而不是畫素?這根本就不是一開始就應該擔心的事情。作為網頁開發人員,我只要知道能從手機螢幕上得到多大的使用空間就行了,其他問題都會順其自然的發現並解決的。還有一點 當設定後,1...

CSS畫素 裝置獨立畫素 裝置畫素之間關係

css畫素 裝置獨立畫素 裝置畫素,三者聯絡緊密又有很大的區別,而我們主要是在做移動端開發的時候需要更多地用到這些概念,那他們分別是指什麼呢?css畫素 css pixel 適用於web程式設計,指的是我們在樣式 中使用到的邏輯畫素,是乙個抽象概念,實際並不存在 裝置獨立畫素 device inde...

OpenGL畫素預設畫素儲存格式

opengl的畫素儲存格式是有glpixedstore來設定的,預設情況下相鄰兩行的儲存的位置是相差4的整數倍,也就是一行的儲存要用4的整數倍的位元組,不夠的情況下要補充。舉例說明 255,0,0 255,0,0 255,0,0 255,0,0 這裡 255,0,0 表示三個連續的byte,表示乙個...