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"
的mat類成員,是指向影象資料的首位址,位址型別是#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
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
表示float
有4
個位元組,不過這裡沒用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,表示乙個...