閱讀本節內容,建議先閱讀lecture 2 opencv2系列之初識mat,了解影象畫素資料在mat
中的儲存方式。
《the opencv tutorials》給出3種遍歷mat中影象畫素矩陣的方法,分別是指標遍歷(ptr)、迭代器(matiterator)、
at函式,前兩者亦分別稱作高效方法、安全方法。其中最為高效的是指標方法。
本文只介紹指標方法。
以下**實現對影象畫素資料的遍歷,我們列印影象的紅色分量。
#include
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
using
namespace
std;
using
namespace cv;
int main(int argc, const
char *argv)
mat src = imread(argv[1],imread_color);
int channels = src.channels();
int nrows = src.rows;
//影象資料列需要考慮通道數的影響;
int ncols = src.cols * channels;
if (src.iscontinuous())//連續儲存的資料,按一行處理
int i,j;
uchar* p;
for( i = 0; i < nrows; ++i)
cout
0;}
如果只是單純列印影象資料的話,可以直接用cout<
影象座標系和畫素矩陣。
影象左上角作為原點,按行和列展開。故影象左上角畫素對應矩陣的0行0列資料,這裡列不計通道。
opencv預設使用bgr的通道順序。
行資料的填補。
寬w高h的真彩色影象,畫素資料儲存需要wxhx3個uchar
構成的記憶體塊,但是出於效率考慮,每行可能
會填補一些額外畫素,亦即儲存畫素資料的寬度不一定是w,往往填補為4或8的倍數,因為這樣一些多
**處理晶元可以更高效的處理影象。
影象的寬高分別由cols
、rows
給出,行畫素個數由cols*channels()
給出,實際行的位元組數由step[0]
給出。對於有額外填補的行資料,cols!= step[0]/elemsize()
,反之,cols==step[0]/elemsize()
。
我們可以用成員函式iscontinuous()
判斷影象是否對行進行了填補,對於沒有進行填補的影象,我們視其
畫素資料為乙個長為wxhxchannels()
的一維陣列,加快迴圈速度。
行首位址。
mat的成員函式ptr(int j)
返回第j
行的首位址。
如果仔細閱讀過lecture 2 opencv2系列之初識mat,對於遍歷mat
,自然想到用data+step+elemsize()
來
實現,這也是基於指標的方法。
核心迴圈**為:
int i,j;
uchar *p;
for (i = 0; i < nrows; i++)
}
本質上是因為src.ptr(i) == src.data + i * src.step[0]
。
在《opencv2 計算機視覺程式設計手冊》一書中,laganiere不建議用這種方法,原因是:容易出錯,並且不適用於帶「感興趣
區域」的影象。
the opencv reference manual release 2.4.9.0。
the opencv tutorials release 2.4.9.0。
加拿大, laganiere, r., & 張靜. opencv2 計算機視覺程式設計手冊.
Lecture 3 程式設計初步(一)
利用選擇結構,當某個條件成立時做乙個事情,不成立時做另乙個事情 關係運算和邏輯運算 關係運算用於表達條件,從而能夠給出判斷 例 amount 1000,temperature 35 邏輯運算將多個判斷組合起來,形成更複雜的條件 例 x 0 x是非負數 s 2000 s 3500 收入在2000 到3...
Lecture 2 矩陣消元
高斯消元的矩陣變換理解 現在有矩陣 a begin 1 2 1 3 8 1 0 4 1 end 需要將其變換為階梯形矩陣 u 首先,第二行減去第一行的三倍。begin 1 0 0 3 1 0 0 0 1 end begin 1 2 1 3 8 1 0 4 1 end begin 1 2 1 0 2 ...
演算法導論Lecture 2 解遞迴
這個lecture包括了clrs中的chapter3 chapter4兩章內容 漸近性標記和解遞迴。erik demaine主講。gee 每次看到erik的一頭 秀髮 跟leiserson教授的光頭就想笑笑,別誤會,erik s a man.解遞迴 解遞迴常用的有三種方法 替換法 substitut...