看了《學習opencv》,發現例3-9**有問題,就找了這篇文章: 以下內容**這篇文章。
在learning opencv書中,講到乙個基礎資料型別cvmat,其中有一段程式:
1 example 3-9. summing all of the elements in a three-channel matrix不知是我理解錯了,還是書中的注釋錯了,「summing all of the elements in a three-channel matrix」,我覺得是對三通道cvmat中的所有資料進行求和,按我之前的編寫風格,這個函式應該是這樣:2float sum( const cvmat* mat )
10 }
11return( s );
12 }
example 3-9. summing all of the elements in a three-channel matrix自己構建乙個三通道矩陣,為測試方便,假設其為乙個3*3的三通道矩陣:float sum( const cvmat* mat )
}return( s );
}
( 1, 2, 3) (11, 12, 13) (21, 22, 23)經過測試,書中的程式得到的結果是279,即如下數的和:(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++)
---------------即僅僅求了乙個3*3 float矩陣的值,嚴格的說是矩陣中每行第乙個元素的三通道元素和。|( 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的申明:
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個位元組長度。
在書上原始碼中:
constfloat* ptr = (const
float*)(mat->data.ptr + row * mat->step);//
獲取第row行的首位址
1for(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輸出管腳。...