OpenCV 累加乙個三通道矩陣的所有元素

2022-08-27 18:00:12 字數 2659 閱讀 2597

看了《學習opencv》,發現例3-9**有問題,就找了這篇文章:    以下內容**這篇文章。

在learning opencv書中,講到乙個基礎資料型別cvmat,其中有一段程式:

1 example 3-9. summing all of the elements in a three-channel matrix

2float sum( const cvmat* mat )

10 }

11return( s );

12 }

不知是我理解錯了,還是書中的注釋錯了,「summing all of the elements in a three-channel matrix」,我覺得是對三通道cvmat中的所有資料進行求和,按我之前的編寫風格,這個函式應該是這樣:

example 3-9. summing all of the elements in a three-channel matrix

float sum( const cvmat* mat )

}return( s );

}

自己構建乙個三通道矩陣,為測試方便,假設其為乙個3*3的三通道矩陣:

( 1,  2,  3)  (11, 12, 13)  (21, 22, 23)

(31, 32, 33) (41, 42, 43) (51, 52, 53)

(61, 62, 63) (71, 72, 73) (81, 82, 83)

//用**構建如下

cvmat* mat = cvcreatemat(3,3,cv_32fc3);//

矩陣元素為三通道浮點數

cvzero(mat);//

將矩陣置0

//----------為矩陣元素賦值-----------------

//獲得矩陣元素(0,0)的指標

float *p = (float*)cvptr2d(mat, 0, 0);

//為矩陣賦值

for(int i = 0; i < 9; i++)

經過測試,書中的程式得到的結果是279,即如下數的和:

---------------

|( 1, 2, 3) | (11, 12, 13) (21, 22, 23)

|(31, 32, 33) | (41, 42, 43) (51, 52, 53)

|(61, 62, 63) | (71, 72, 73) (81, 82, 83)

---------------

即僅僅求了乙個3*3 float矩陣的值,嚴格的說是矩陣中每行第乙個元素的三通道元素和。

我們可以對其進行進一步剖析,先看cvmat的申明:

1 typedef struct cvmat

2 data;

14 #ifdef __cplusplus

15 union

16 ;

20 union

21 ;

25#else

26int rows;

27int cols;

28#endif

29 } cvmat;

在大多數情況下,你需要使用最有效率的方式來訪問矩陣中的資料。如果使用函式介面來訪問資料,效率比較低,你應該使用指標方式來直接訪問矩陣中資料。特別是,如果你想遍歷矩陣中所有元素時,就更需要這樣做了。

在用指標直接訪問矩陣元素時,就需要格外注意矩陣結構體中的step成員。該成員是以位元組為單位的每行的長度。而矩陣結構體的cols或width就不適合此時使用,因為為了訪問效率,矩陣中的記憶體分配上,是以每四個位元組做為最小單位的。因此如果乙個矩陣的寬度是三個位元組,那麼就會在寬度上分配四個位元組,而此時每行最後乙個位元組會被忽略掉。所以我們用step則會準確地按行訪問資料。

我們可以通過以下例子,看一下rows,cols,height,width,step的資料,你可以通過改變矩陣的元素型別定義,來檢視step的改變:

1

#pragma comment(lib,"cxcore.lib")

2 #include"

cv.h

"3 #include

4void main()

5

//輸出為rows=3,cols=3,height=3,width=3,step=36
如果我們的矩陣儲存的是浮點型(或整數型別)資料,此時矩陣中每個元素佔4位元組,則如果我們用float型別指標指向下一行時,我們實際上要用float型別指標挪動step/4的長度,因為float型別指標每挪動乙個單位就是4個位元組長度。

如果我們的矩陣儲存的是double型別資料,此時矩陣中每個元素佔8位元組,則如果我們用double型別指標指向下一行時,我們實際上要用double型別指標挪動step/8的長度,因為double型別指標每挪動乙個單位就是8個位元組長度。

在書上原始碼中:

const

float* ptr = (const

float*)(mat->data.ptr + row * mat->step);//

獲取第row行的首位址

1

for(int row=0; rowrows; row++ )

7 }

8return( s );

9 }

OpenCV 單通道三通道理解

單通道 此通道上值為0 255。255為白色,0是黑色 只能表示灰度,不能表示彩色。三通道,在bgr 255,255,255為白色,0,0,0是黑色 可以表示彩色,灰度也是彩色的一種。cv imread函式。screen是一張彩色圖 cv mat mat cv imread root desktop...

關於單通道轉三通道一些問題

源影象的格式時 單通道 1280 712,輸出影象的格式位三通到 1280 3.源影象每一行的位元組數時1280個 因為1280個畫素點 我想問下三通到每一行的位元組數是不是1280 3 如果是的話 程式中 源影象的第一行畫素值賦給三通到1280個值後 輸出影象的部長我用的是源影象img imgst...

三通道輸入一通道輸出實現三路觸控功能

華誠hc8t046p觸控ic有4個輸入 輸出管腳,所以最大可以實現三通道輸入。用這顆ic實現三通道觸控的最大難點在於只有乙個通道負責輸出,三個通道三種波形,如果對波形識別不準確就會導致竄鍵的產生。p10 p13是4個輸入 輸出管腳 ic定製p10 p11 p13觸控輸入管腳,p12為pwm輸出管腳。...