mat是opencv裡最基本的乙個類,用來表示影象。
// 預設建構函式 mat a;
mat ()
// 常用建構函式 mat a(10,10,8uc3);
mat (int rows, int cols, int type)
//mat a(300, 400, cv_8uc3,scalar(255,255,255));
mat (int ndims, const int *sizes, int type, const scalar &s)
mat (size size, int type)
mat (int rows, int cols, int type, const scalar &s)
mat (size size, int type, const scalar &s)
mat (int ndims, const int *sizes, int type)
mat (const mat &m)
mat (int rows, int cols, int type, void *data, size_t step=auto_step)
mat (size size, int type, void *data, size_t step=auto_step)
mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)
mat (const mat &m, const range &rowrange, const range &colrange=range::all())
//mat d (a, rect(10, 10, 100, 100) );
mat (const mat &m, const rect &roi)
mat (const mat &m, const range *ranges)
可以參考以下博文:
1)指標方式
座標的指標:
void colorreduce(const mat& image,mat& outimage,int div)
for(int i=0;i(i);
uchar* outdata=outimage.ptr(i);
for(int j=0;j資料的指標:
//三通道
uchar *data = image.data ;
for(int h = 0 ; h < image.rows ; ++ h) }
imshow("data" , image) ;
//單通道
}
2)at方式
at方式相當於直接訪問畫素座標:
void colorreduce(mat& image,int div)
} }
3)迭代器訪問
迭代器就是通過獲得影象矩陣的開始和結束,然後增加迭代直至從開始到結束:
cv::mat tempimage = srcimage.clone();
// 初始化源影象迭代器
cv::matconstiterator_srciterstart = srcimage.begin();
cv::matconstiterator_srciterend = srcimage.end();
// 初始化輸出影象迭代器
cv::matiterator_resiterstart = tempimage.begin();
cv::matiterator_resiterend = tempimage.end();
// 遍歷影象反色處理
while( srciterstart != srciterend )
4)查詢表函式
可以根據查詢表的對映來進行畫素的變換:
cv::mat inversecolor6(cv::mat srcimage)
可以參考以下博文:
roi允許我們選取影象特定的區域進行操作,有兩種方式。
1)使用矩形(rect)類
mat roi;
roi=image(rect_ (_tp _x, _tp _y, _tp _width, _tp _height));
x,y這兩個引數就是矩形區域左上角的座標
width,height這兩個引數就是矩形局域的寬和高
2)手動指定感興趣的行和列的範圍
mat roi;
roi=image(rect_ (range(row_start,row_end),range(col_strat,col_end)));
range(row_start,row_end):行的開始和結束
range(col_strat,col_end):列的開始和結束
可以參考以下博文:
計算直方圖:
void calchist(const mat* arrays, intnarrays, const int* channels, inputarray mask, outputarray
hist, int dims,const int* histsize, const float** ranges, bool uniform=true, boolaccumulate=false );
引數解釋:畫出直方圖:
void line(mat& img, point pt1, point pt2, const scalar& color, int thickness=1,
int linetype=8, int shift=0)
//兩點確認一條直線。
//linetype:直線型別
//shift:座標小數點維數
//畫乙個單一的實矩形
void rectangle(mat& img, point pt1,point pt2, const scalar& color, int thickness=1,
int linetype=8, int shift=0)
//一條對角線的兩個頂點可確定乙個矩形
//pt1和pt2互為對頂點
//thickness為負值表示矩形為實矩形
其中point(x,y)表示二維座標系下的點。
split用於通道分離
void split(const mat& src,mat *mvbegin)
第乙個引數為要進行分離的影象矩陣,第二個引數是乙個vector物件
merge用於通道合併
void merge(const vector& mv, outputarray dst );
第乙個引數是影象矩陣向量容器,第二個引數是輸出
舉例:
std::vectorrgb(3);
split(src, rgb); //分離通道
for (int i = 0; i < 3; i++)
merge(rgb, output); //合併通道
void minmaxloc(inputarray src, double* minval, double* maxval=0, point* minloc=0, point* maxloc=0, inputarray mask=noarray())
函式說明:
src:輸入影象。
minval:最小值,可輸入null表示不需要。
maxval :最大值,可輸入null表示不需要。
minloc:最小值的位置,可輸入null表示不需要,point型別。
maxloc:最大值的位置,可輸入null表示不需要,point型別。
mask:可有可無的掩模。
void rectangle(mat& img, point pt1,point pt2,const scalar& color, int thickness=1, int linetype=8, int shift=0)
img:輸入影象.
pt1:矩形的乙個頂點。
pt2:矩形對角線上的另乙個頂點
color:線條顏色 (rgb) 或亮度(灰度影象 )(grayscale image)。
thickness:組成矩形的線條的粗細程度。取負值時(如 cv_filled)函式繪製填充了色彩的矩形。
line_type:線條的型別。
shift:座標點的小數點位數。
Opencv 學習筆記(六)模板匹配
菜鳥一枚,這是我的第六個部落格,剛剛入門opencv,想將自己的學習過程分享給大家!include stdafx.h include include opencv highgui 模組 include opencv 影象處理標頭檔案 using namespace cv define window ...
opencv 學習筆記 1 常用函式和方法。
cv2.imread filename,falg filename是檔案名字 flag是讀入的方式 cv2.imread color 進行轉化為三通道影象。cv2.imread anydepth 如果影象深度為16位則讀出為16位,32位則讀出為32位,其餘的轉化為8位。實際應用中,falg 0就是...
OpenCV常用函式
直接訪問 效率高,但容易出錯 用指標直接訪問 在某些情況下簡單高效 image void operator iplimage img inline t operator const int rowindx typedef struct rgbpixel typedef struct rgbpixel...