




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Introduction to programming with OpenCVOpenCV編程簡介作者: Gady Agam· Department of Computer Science· January 27, 2006· Illinois Institute of Technology· URL: /agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00040000000000000000翻譯: chenyusiyuan· Jan
2、uary 26, 2010·摘要:本文旨在幫助讀者快速入門OpenCV,而無需閱讀冗長的參考手冊(cè)。掌握了OpenCV的以下基礎(chǔ)知識(shí)后,有需要的話再查閱相關(guān)的參考手冊(cè)。目錄隱藏1 一、簡介1.1 1、OpenCV的特點(diǎn)§ 1.1.1 (1) 總體描述§ 1.1.2 (2) 功能§ 1.1.3 (3) OpenCV模塊1.2 2、有用的學(xué)習(xí)資源§ 1.2.1 (1) 參考手冊(cè):§ 1.2.2 (2) 網(wǎng)絡(luò)資源:§ 1.2.3 (3) 書籍:§ 1.2.4 (4) 視頻處理例程(在 <opencv-root>
3、/samples/c/):§ 1.2.5 (5) 圖像處理例程 (在 <opencv-root>/samples/c/):1.3 3、OpenCV 命名規(guī)則§ 1.3.1 (1) 函數(shù)名:§ 1.3.2 (2) 矩陣數(shù)據(jù)類型:§ 1.3.3 (3) 圖像數(shù)據(jù)類型:§ 1.3.4 (4) 頭文件:1.4 4、編譯建議§ 1.4.1 (1) Linux:§ 1.4.2 (2) Windows:o 1.5 5、C例程2 二、GUI 指令2.1 1、窗口管理§ 2.1.1 (1) 創(chuàng)建和定位一個(gè)新窗口:
4、7; 2.1.2 (2) 載入圖像:§ 2.1.3 (3) 顯示圖像:§ 2.1.4 (4) 關(guān)閉窗口:§ 2.1.5 (5) 改變窗口大小:2.2 2、輸入處理§ 2.2.1 (1) 處理鼠標(biāo)事件:§ 2.2.2 (2) 處理鍵盤事件:§ 2.2.3 (3) 處理滑動(dòng)條事件:3 三、OpenCV的基本數(shù)據(jù)結(jié)構(gòu)3.1 1、圖像數(shù)據(jù)結(jié)構(gòu)§ 3.1.1 (1) IPL 圖像:3.2 2、矩陣與向量§ 3.2.1 (1) 矩陣:§ 3.2.2 (2) 一般矩陣:§ 3.2.3 (3) 標(biāo)量:3.3 3
5、、其它結(jié)構(gòu)類型§ 3.3.1 (1) 點(diǎn):§ 3.3.2 (2) 矩形框大小(以像素為精度):§ 3.3.3 (3) 矩形框的偏置和大小:4 四、圖像處理4.1 1、圖像的內(nèi)存分配與釋放§ 4.1.1 (1) 分配內(nèi)存給一幅新圖像:§ 4.1.2 (2) 釋放圖像:§ 4.1.3 (3) 復(fù)制圖像:§ 4.1.4 (4) 設(shè)置/獲取感興趣區(qū)域ROI:§ 4.1.5 (5) 設(shè)置/獲取感興趣通道COI:4.2 2、圖像讀寫§ 4.2.1 (1) 從文件中讀入圖像:§ 4.2.2 (2) 保存圖像:
6、4.3 3、訪問圖像像素§ 4.3.1 (1) 假設(shè)你要訪問第k通道、第i行、第j列的像素。§ 4.3.2 (2) 間接訪問: (通用,但效率低,可訪問任意格式的圖像)§ 4.3.3 (3) 直接訪問: (效率高,但容易出錯(cuò))§ 4.3.4 (4) 基于指針的直接訪問: (簡單高效)§ 4.3.5 (5) 基于 c+ wrapper 的直接訪問: (更簡單高效)4.4 4、圖像轉(zhuǎn)換§ 4.4.1 (1) 字節(jié)型圖像的灰度-彩色轉(zhuǎn)換:§ 4.4.2 (2) 彩色圖像->灰度圖像:§ 4.4.3 (3) 不同彩色
7、空間之間的轉(zhuǎn)換:4.5 5、繪圖指令§ 4.5.1 (1) 繪制矩形:§ 4.5.2 (2) 繪制圓形:§ 4.5.3 (3) 繪制線段:§ 4.5.4 (4) 繪制一組線段:§ 4.5.5 (5) 繪制一組填充顏色的多邊形:§ 4.5.6 (6) 文本標(biāo)注:5 五、矩陣處理5.1 1、矩陣的內(nèi)存分配與釋放§ 5.1.1 (1) 總體上:§ 5.1.2 (2) 為新矩陣分配內(nèi)存:§ 5.1.3 (3) 釋放矩陣內(nèi)存:§ 5.1.4 (4) 復(fù)制矩陣:§ 5.1.5 (5) 初始化矩陣:
8、§ 5.1.6 (6) 初始化矩陣為單位矩陣:5.2 2、訪問矩陣元素§ 5.2.1 (1) 假設(shè)需要訪問一個(gè)2D浮點(diǎn)型矩陣的第(i, j)個(gè)單元.§ 5.2.2 (2) 間接訪問:§ 5.2.3 (3) 直接訪問(假設(shè)矩陣數(shù)據(jù)按4字節(jié)行對(duì)齊):§ 5.2.4 (4) 直接訪問(當(dāng)數(shù)據(jù)的行對(duì)齊可能存在間隙時(shí) possible alignment gaps):§ 5.2.5 (5) 對(duì)于初始化后的矩陣進(jìn)行直接訪問:5.3 3、矩陣/向量運(yùn)算§ 5.3.1 (1) 矩陣之間的運(yùn)算:§ 5.3.2 (2) 矩陣之間的元素
9、級(jí)運(yùn)算:§ 5.3.3 (3) 向量乘積:§ 5.3.4 (4) 單一矩陣的運(yùn)算:§ 5.3.5 (5) 非齊次線性方程求解:§ 5.3.6 (6) 特征值與特征向量 (矩陣為方陣):6 六、視頻處理6.1 1、從視頻流中捕捉一幀畫面§ 6.1.1 (1) OpenCV 支持從攝像頭或視頻文件(AVI格式)中捕捉幀畫面.§ 6.1.2 (2) 初始化一個(gè)攝像頭捕捉器:§ 6.1.3 (3) 初始化一個(gè)視頻文件捕捉器:§ 6.1.4 (4) 捕捉一幀畫面:§ 6.1.5 (5) 釋放視頻流捕捉器:6.2 2
10、、獲取/設(shè)置視頻流信息§ 6.2.1 (1) 獲取視頻流設(shè)備信息:§ 6.2.2 (2) 獲取幀圖信息:§ 6.2.3 (3) 設(shè)置從視頻文件抓取的第一幀畫面的位置:6.3 3、保存視頻文件§ 6.3.1 (1) 初始化視頻編寫器:§ 6.3.2 (2) 保持視頻文件:§ 6.3.3 (3) 釋放視頻編寫器:編輯一、簡介編輯1、OpenCV的特點(diǎn)編輯(1) 總體描述· OpenCV是一個(gè)基于C/C+語言的開源圖像處理函數(shù)庫· 其代碼都經(jīng)過優(yōu)化,可用于實(shí)時(shí)處理圖像· 具有良好的可移植性· 可以進(jìn)行
11、圖像/視頻載入、保存和采集的常規(guī)操作· 具有低級(jí)和高級(jí)的應(yīng)用程序接口(API)· 提供了面向Intel IPP高效多媒體函數(shù)庫的接口,可針對(duì)你使用的Intel CPU優(yōu)化代碼,提高程序性能(譯注:OpenCV 2.0版的代碼已顯著優(yōu)化,無需IPP來提升性能,故2.0版不再提供IPP接口)編輯(2) 功能· 圖像數(shù)據(jù)操作(內(nèi)存分配與釋放,圖像復(fù)制、設(shè)定和轉(zhuǎn)換)Image data manipulation (allocation, release, copying, setting, conversion).· 圖像/視頻的輸入輸出(支持文件或攝像頭的輸入
12、,圖像/視頻文件的輸出)Image and video I/O (file and camera based input, image/video file output).· 矩陣/向量數(shù)據(jù)操作及線性代數(shù)運(yùn)算(矩陣乘積、矩陣方程求解、特征值、奇異值分解)Matrix and vector manipulation and linear algebra routines (products, solvers, eigenvalues, SVD).· 支持多種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)(鏈表、隊(duì)列、數(shù)據(jù)集、樹、圖)Various dynamic data structures (lists
13、, queues, sets, trees, graphs).· 基本圖像處理(去噪、邊緣檢測、角點(diǎn)檢測、采樣與插值、色彩變換、形態(tài)學(xué)處理、直方圖、圖像金字塔結(jié)構(gòu))Basic image processing (filtering, edge detection, corner detection, sampling and interpolation, color conversion, morphological operations, histograms, image pyramids).· 結(jié)構(gòu)分析(連通域/分支、輪廓處理、距離轉(zhuǎn)換、圖像矩、模板匹配、霍夫變換、多
14、項(xiàng)式逼近、曲線擬合、橢圓擬合、狄勞尼三角化)Structural analysis (connected components, contour processing, distance transform, various moments, template matching, Hough transform, polygonal approximation, line fitting, ellipse fitting, Delaunay triangulation).· 攝像頭定標(biāo)(尋找和跟蹤定標(biāo)模式、參數(shù)定標(biāo)、基本矩陣估計(jì)、單應(yīng)矩陣估計(jì)、立體視覺匹配)Camera calibr
15、ation (finding and tracking calibration patterns, calibration, fundamental matrix estimation, homography estimation, stereo correspondence).· 運(yùn)動(dòng)分析(光流、動(dòng)作分割、目標(biāo)跟蹤)Motion analysis (optical flow, motion segmentation, tracking).· 目標(biāo)識(shí)別(特征方法、HMM模型)Object recognition (eigen-methods, HMM).· 基本的
16、GUI(顯示圖像/視頻、鍵盤/鼠標(biāo)操作、滑動(dòng)條)Basic GUI (display image/video, keyboard and mouse handling, scroll-bars).· 圖像標(biāo)注(直線、曲線、多邊形、文本標(biāo)注)Image labeling (line, conic, polygon, text drawing)編輯(3) OpenCV模塊· cv 核心函數(shù)庫· cvaux 輔助函數(shù)庫· cxcore 數(shù)據(jù)結(jié)構(gòu)與線性代數(shù)庫· highgui GUI函數(shù)庫· ml 機(jī)器學(xué)習(xí)函數(shù)庫編輯2、有用的學(xué)習(xí)資源編輯(1
17、) 參考手冊(cè):· <opencv-root>/docs/index.htm (譯注:在你的OpenCV安裝目錄<opencv-root>內(nèi))編輯(2) 網(wǎng)絡(luò)資源:· 官方網(wǎng)站: · 軟件下載: 編輯(3) 書籍:· Open Source Computer Vision Libraryby Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). chenyusiyuan: 補(bǔ)充以下書籍· Learn
18、ing OpenCV - Computer Vision with the OpenCV Libraryby Gary Bradski & Adrian Kaehler, O'Reilly Media, 1 st ed. (September, 2008).· OpenCV教程基礎(chǔ)篇作者:劉瑞禎 于仕琪,北京航空航天大學(xué)出版社,出版日期:200706編輯(4) 視頻處理例程(在 <opencv-root>/samples/c/):· 顏色跟蹤: camshiftdemo· 點(diǎn)跟蹤: lkdemo· 動(dòng)作分割: motempl&
19、#183; 邊緣檢測: laplace編輯(5) 圖像處理例程 (在 <opencv-root>/samples/c/):· 邊緣檢測: edge· 圖像分割: pyramid_segmentation· 形態(tài)學(xué): morphology· 直方圖: demhist· 距離變換: distrans· 橢圓擬合: fitellipse編輯3、OpenCV 命名規(guī)則編輯(1) 函數(shù)名: cvActionTargetMod(.) Action = 核心功能(core functionality) (e.g. set, create
20、) Target = 目標(biāo)圖像區(qū)域(target image area) (e.g. contour, polygon) Mod = (可選的)調(diào)整語(optional modifiers) (e.g. argument type)編輯(2) 矩陣數(shù)據(jù)類型: CV_<bit_depth>(S|U|F)C<number_of_channels> S = 符號(hào)整型 U = 無符號(hào)整型 F = 浮點(diǎn)型 E.g.: CV_8UC1 是指一個(gè)8位無符號(hào)整型單通道矩陣, CV_32FC2是指一個(gè)32位浮點(diǎn)型雙通道矩陣.編輯(3) 圖像數(shù)據(jù)類型: IPL_DEPTH_<bit_
21、depth>(S|U|F) E.g.: IPL_DEPTH_8U 圖像像素?cái)?shù)據(jù)是8位無符號(hào)整型. IPL_DEPTH_32F圖像像素?cái)?shù)據(jù)是32位浮點(diǎn)型.編輯(4) 頭文件:#include <cv.h>#include <cvaux.h>#include <highgui.h> #include <ml.h>#include <cxcore.h> / 一般不需要,cv.h 內(nèi)已包含該頭文件編輯4、編譯建議編輯(1) Linux:g+ hello-world.cpp-o hello-world -I /usr/local/incl
22、ude/opencv -L /usr/local/lib -lm -lcv -lhighgui -lcvaux編輯(2) Windows:在Visual Studio的選項(xiàng)和項(xiàng)目中設(shè)置好OpenCV相關(guān)文件的路徑。編輯5、C例程/ hello-world.cpp/ 該程序從文件中讀入一幅圖像,將之反色,然后顯示出來./#include <stdlib.h>#include <stdio.h>#include <math.h>#include <cv.h>#include <highgui.h>int main(int argc,cha
23、r*argv) IplImage* img =0;int height,width,step,channels; uchar *data;int i,j,k;if(argc<2)printf("Usage: main <image-file-name>n7"); exit(0);/ load an image img=cvLoadImage(argv1);if(!img)printf("Could not load image file: %sn",argv1); exit(0);/ get the image data height
24、= img->height; width = img->width; step = img->widthStep; channels = img->nChannels; data =(uchar *)img->imageData;printf("Processing a %dx%d image with %d channelsn",height,width,channels);/ create a window cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindo
25、w("mainWin",100,100);/ invert the image/ 相當(dāng)于 cvNot(img);for(i=0;i<height;i+)for(j=0;j<width;j+)for(k=0;k<channels;k+) datai*step+j*channels+k=255-datai*step+j*channels+k;/ show the image cvShowImage("mainWin", img );/ wait for a key cvWaitKey(0);/ release the image cvRel
26、easeImage(&img );return0;編輯二、GUI 指令編輯1、窗口管理編輯(1) 創(chuàng)建和定位一個(gè)新窗口:cvNamedWindow("win1", CV_WINDOW_AUTOSIZE); cvMoveWindow("win1",100,100);/ offset from the UL corner of the screen編輯(2) 載入圖像:IplImage* img=0; img=cvLoadImage(fileName, CV_LOAD_IMAGE_COLOR);if(!img)printf("Could n
27、ot load image file: %sn",fileName);編輯(3) 顯示圖像:cvShowImage("win1",img);該函數(shù)可以顯示彩色或灰度的字節(jié)型/浮點(diǎn)型圖像。字節(jié)型圖像像素值范圍為0-255;浮點(diǎn)型圖像像素值范圍為0-1。彩色圖像的三色元素按BGR(藍(lán)-綠-紅)順序存儲(chǔ)。編輯(4) 關(guān)閉窗口:cvDestroyWindow("win1");編輯(5) 改變窗口大小:cvResizeWindow("win1",100,100);/ new width/heigh in pixels編輯2、輸入處理編
28、輯(1) 處理鼠標(biāo)事件:· 定義一個(gè)鼠標(biāo)處理程序:void mouseHandler(int event,int x,int y,int flags,void* param)switch(event)case CV_EVENT_LBUTTONDOWN:if(flags & CV_EVENT_FLAG_CTRLKEY)printf("Left button down with CTRL pressedn");break;case CV_EVENT_LBUTTONUP:printf("Left button upn");break; x,y
29、: 相對(duì)于左上角的像素坐標(biāo) event: CV_EVENT_LBUTTONDOWN, CV_EVENT_RBUTTONDOWN, CV_EVENT_MBUTTONDOWN, CV_EVENT_LBUTTONUP, CV_EVENT_RBUTTONUP, CV_EVENT_MBUTTONUP, CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK, CV_EVENT_MBUTTONDBLCLK, CV_EVENT_MOUSEMOVE: flags: CV_EVENT_FLAG_CTRLKEY, CV_EVENT_FLAG_SHIFTKEY, CV_EVEN
30、T_FLAG_ALTKEY, CV_EVENT_FLAG_LBUTTON, CV_EVENT_FLAG_RBUTTON, CV_EVENT_FLAG_MBUTTON· 注冊(cè)該事件處理程序:mouseParam=5; cvSetMouseCallback("win1",mouseHandler,&mouseParam);/第三個(gè)參數(shù)可以設(shè)置為NULL編輯(2) 處理鍵盤事件:· 實(shí)際上對(duì)于鍵盤輸入并沒有專門的事件處理程序.· 按一定間隔檢測鍵盤輸入(適用于循環(huán)體中):int key; key=cvWaitKey(10);/ wait 10
31、ms for input· 中止程序等待鍵盤輸入:int key; key=cvWaitKey(0);/ wait indefinitely for input· 鍵盤輸入的循環(huán)處理程序:while(1) key=cvWaitKey(10);if(key=27)break;switch(key)case'h': .break;case'i': .break;編輯(3) 處理滑動(dòng)條事件:· 定義一個(gè)滑動(dòng)條處理程序:void trackbarHandler(int pos)printf("Trackbar position:
32、%dn",pos);· 注冊(cè)該事件處理程序:int trackbarVal=25;int maxVal=100; cvCreateTrackbar("bar1","win1",&trackbarVal ,maxVal , trackbarHandler);· 獲取當(dāng)前的滑動(dòng)條位置:int pos = cvGetTrackbarPos("bar1","win1");· 設(shè)置滑動(dòng)條位置:cvSetTrackbarPos("bar1","win
33、1",25);編輯三、OpenCV的基本數(shù)據(jù)結(jié)構(gòu)(譯注:OpenCV 1.1、1.2或2.0版本中各數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)體元素有所調(diào)整,以下僅作參考)編輯1、圖像數(shù)據(jù)結(jié)構(gòu)編輯(1) IPL 圖像:IplImage|-int nChannels;/ 顏色通道數(shù)目 (1,2,3,4)|-int depth;/ 像素的位深:|/ IPL_DEPTH_8U, IPL_DEPTH_8S,|/ IPL_DEPTH_16U,IPL_DEPTH_16S,|/ IPL_DEPTH_32S,IPL_DEPTH_32F,|/ IPL_DEPTH_64F|-int width;/ 圖像寬度(像素為單位)|-int
34、 height;/ 圖像高度|-char* imageData;/ 圖像數(shù)據(jù)指針|/ 注意彩色圖像按BGR順序存儲(chǔ)數(shù)據(jù)|-int dataOrder;/ 0 - 將像素點(diǎn)不同通道的值交錯(cuò)排在一起,形成單一像素平面|/ 1 - 把所有像素同通道值排在一起,形成若干個(gè)通道平面,再把平面排列起來|/ cvCreateImage 只能創(chuàng)建像素交錯(cuò)排列式的圖像|-int origin;/ 0 像素原點(diǎn)為左上角,|/ 1 像素原點(diǎn)為左下角 (Windows bitmaps style)|-int widthStep;/ 相鄰行的同列點(diǎn)之間的字節(jié)數(shù)|-int imageSize;/ 圖像的大小(字節(jié)為單位)
35、 = height*widthStep|-struct _IplROI *roi;/ 圖像的感興趣區(qū)域(ROI). ROI非空時(shí)對(duì)圖像的|/ 處理僅限于ROI區(qū)域.|-char*imageDataOrigin;/ 圖像數(shù)據(jù)未對(duì)齊時(shí)的數(shù)據(jù)原點(diǎn)指針|/ (需要正確地重新分配圖像內(nèi)存 )|/ (needed for correct image deallocation)|-int align;/ 圖像數(shù)據(jù)的行對(duì)齊: 4 or 8 byte alignment|/ OpenCV 中無此項(xiàng),采用widthStep代替|-char colorModel4;/ 顏色模型 OpenCV中忽略此項(xiàng)編輯2、矩陣與
36、向量編輯(1) 矩陣:CvMat / 2D 矩陣|-int type;/ 元素類型 (uchar,short,int,float,double) 與標(biāo)志|-int step;/ 整行長度字節(jié)數(shù)|-int rows, cols;/ 行、列數(shù)|-int height, width;/ 矩陣高度、寬度,與rows、cols對(duì)應(yīng)|-union data;|- uchar* ptr;/ data pointer for an unsigned char matrix|-short* s;/ data pointer for a short matrix|-int* i;/ data pointer fo
37、r an integer matrix|-float* fl;/ data pointer for a float matrix|-double* db;/ data pointer for a double matrixCvMatND / N-維矩陣|-int type;/ 元素類型 (uchar,short,int,float,double) 與標(biāo)志|-int dims;/ 矩陣維數(shù)|-union data;|- uchar* ptr;/ data pointer for an unsigned char 矩陣|-short* s;/ data pointer for a short ma
38、trix|-int* i;/ data pointer for an integer matrix|-float* fl;/ data pointer for a float matrix|-double* db;/ data pointer for a double matrix|-struct dim;/ 各維信息|- size;/ 元素?cái)?shù)目|- step;/ 元素間距(字節(jié)為單位)CvSparseMat / N-維稀疏矩陣編輯(2) 一般矩陣:CvArr*/ 僅作為函數(shù)定義的參數(shù)使用,/ 表明函數(shù)可以接受不同類型的矩陣作為參數(shù),/ 例如:IplImage*, CvMat* 甚至是 CvS
39、eq*./ 矩陣的類型通過矩陣頭的前4個(gè)字節(jié)信息來確定編輯(3) 標(biāo)量:CvScalar|-double val4;/4D 向量初始化函數(shù):CvScalar s = cvScalar(double val0,double val1=0,double val2=0,double val3=0);/ Example:CvScalar s = cvScalar(20.0);s.val0=20.0;注意該初始化函數(shù)的函數(shù)名與對(duì)應(yīng)的結(jié)構(gòu)體名稱幾乎同名,差別僅在于函數(shù)名第一個(gè)字母是小寫的,而結(jié)構(gòu)體名第一個(gè)字母是大寫的。它并不是一個(gè) C+ 構(gòu)造函數(shù)。(譯注:類似的還有 cvMat 與 CvMat、cvPoi
40、nt 與 CvPoint 等等)編輯3、其它結(jié)構(gòu)類型編輯(1) 點(diǎn):CvPoint p = cvPoint(int x,int y);CvPoint2D32f p = cvPoint2D32f(float x,float y);CvPoint3D32f p = cvPoint3D32f(float x,float y,float z);/E.g.:p.x=5.0;p.y=5.0;編輯(2) 矩形框大小(以像素為精度):CvSize r = cvSize(int width,int height);CvSize2D32f r = cvSize2D32f(float width,float hei
41、ght);編輯(3) 矩形框的偏置和大小:CvRect r = cvRect(int x,int y,int width,int height);編輯四、圖像處理編輯1、圖像的內(nèi)存分配與釋放編輯(1) 分配內(nèi)存給一幅新圖像:IplImage* cvCreateImage(CvSize size,int depth,int channels);size: cvSize(width,height);depth: 像素深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F,
42、IPL_DEPTH_64F channels: 像素通道數(shù). Can be 1, 2, 3 or 4. 各通道是交錯(cuò)排列的. 一幅彩色圖像的數(shù)據(jù)排列格式如下: b0 g0 r0 b1 g1 r1 .示例:/ Allocate a 1-channel byte imageIplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);/ Allocate a 3-channel float imageIplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);編輯(2) 釋放
43、圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);cvReleaseImage(&img);編輯(3) 復(fù)制圖像:IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);IplImage* img2;img2=cvCloneImage(img1);/ 注意通過cvCloneImage得到的圖像/ 也要用 cvReleaseImage 釋放,否則容易產(chǎn)生內(nèi)存泄漏編輯(4) 設(shè)置/獲取感興趣區(qū)域ROI:void cvSetImageROI(IplIm
44、age* image, CvRect rect);void cvResetImageROI(IplImage* image);CvRect cvGetImageROI(const IplImage* image);大多數(shù)OpenCV函數(shù)都支持 ROI.編輯(5) 設(shè)置/獲取感興趣通道COI:void cvSetImageCOI(IplImage* image,int coi);/ 0=allint cvGetImageCOI(const IplImage* image);大多數(shù)OpenCV函數(shù)不支持 COI.編輯2、圖像讀寫編輯(1) 從文件中讀入圖像:IplImage* img=0; img
45、=cvLoadImage(fileName);if(!img)printf("Could not load image file: %sn",fileName); 支持的圖像格式: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF, TIFOpenCV默認(rèn)將讀入的圖像強(qiáng)制轉(zhuǎn)換為一幅三通道彩色圖像. 不過可以按以下方法修改讀入方式:img=cvLoadImage(fileName,flag); flag: >0 將讀入的圖像強(qiáng)制轉(zhuǎn)換為一幅三通道彩色圖像 =0 將讀入的圖像強(qiáng)制轉(zhuǎn)換為一幅單通道灰度圖像
46、<0 讀入的圖像通道數(shù)與所讀入的文件相同.編輯(2) 保存圖像:if(!cvSaveImage(outFileName,img)printf("Could not save: %sn", outFileName);保存的圖像格式由 outFileName 中的擴(kuò)展名確定.編輯3、訪問圖像像素編輯(1) 假設(shè)你要訪問第k通道、第i行、第j列的像素。編輯(2) 間接訪問: (通用,但效率低,可訪問任意格式的圖像)· 對(duì)于單通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);CvS
47、calar s;s=cvGet2D(img,i,j);/ get the (j,i) pixel value, 注意cvGet2D與cvSet2D中坐標(biāo)參數(shù)的順序與其它opencv函數(shù)坐標(biāo)參數(shù)順序恰好相反.本函數(shù)中i代表y軸,即height;j代表x軸,即weight.printf("intensity=%fn",s.val0);s.val0=111;cvSet2D(img,i,j,s);/ set the (j,i) pixel value· 對(duì)于多通道字節(jié)型/浮點(diǎn)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),I
48、PL_DEPTH_32F,3);CvScalar s;s=cvGet2D(img,i,j);/ get the (i,j) pixel valueprintf("B=%f, G=%f, R=%fn",s.val0,s.val1,s.val2);s.val0=111;s.val1=111;s.val2=111;cvSet2D(img,i,j,s);/ set the (i,j) pixel value編輯(3) 直接訪問: (效率高,但容易出錯(cuò))· 對(duì)于單通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_
49、DEPTH_8U,1);(uchar *)(img->imageData + i*img->widthStep)j=111;· 對(duì)于多通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);(uchar *)(img->imageData + i*img->widthStep)j*img->nChannels +0=111;/ B(uchar *)(img->imageData + i*img->widthStep)j*img->nChannels +1=1
50、12;/ G(uchar *)(img->imageData + i*img->widthStep)j*img->nChannels +2=113;/ R· 對(duì)于多通道浮點(diǎn)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);(float*)(img->imageData + i*img->widthStep)j*img->nChannels +0=111;/ B(float*)(img->imageData + i*img->widthStep)j*img-&
51、gt;nChannels +1=112;/ G(float*)(img->imageData + i*img->widthStep)j*img->nChannels +2=113;/ R編輯(4) 基于指針的直接訪問: (簡單高效)· 對(duì)于單通道字節(jié)型圖像:IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);int height = img->height;int width = img->width;int step = img->widthStep/sizeof(uchar
52、);uchar* data =(uchar *)img->imageData;datai*step+j=111;· 對(duì)于多通道字節(jié)型圖像:IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);int height = img->height;int width = img->width;int step = img->widthStep/sizeof(uchar);int channels = img->nChannels;uchar* data =(uchar *)img->i
53、mageData;datai*step+j*channels+k=111;· 對(duì)于多通道浮點(diǎn)型圖像(假設(shè)圖像數(shù)據(jù)采用4字節(jié)(32位)行對(duì)齊方式):IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);int height = img->height;int width = img->width;int step = img->widthStep/sizeof(float);int channels = img->nChannels;float* data =(float*)img->
54、imageData;datai*step+j*channels+k=111;編輯(5) 基于 c+ wrapper 的直接訪問: (更簡單高效)· 首先定義一個(gè) c+ wrapper Image,然后基于Image定義不同類型的圖像:template<class T> class Image private: IplImage* imgp; public: Image(IplImage* img=0)imgp=img; Image()imgp=0;void operator=(IplImage* img)imgp=img;inline T* operator(consti
55、nt rowIndx)return(T *)(imgp->imageData + rowIndx*imgp->widthStep);typedefstructunsignedchar b,g,r; RgbPixel;typedefstructfloat b,g,r; RgbPixelFloat;typedef Image<RgbPixel> RgbImage;typedef Image<RgbPixelFloat> RgbImageFloat;typedef Image<unsigned char> BwImage;typedef Image&l
56、t;float> BwImageFloat;· 對(duì)于單通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);BwImage imgA(img);imgAij=111;· 對(duì)于多通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);RgbImage imgA(img);imgAij.b=111;imgAij.g=111;imgAij.r=111;· 對(duì)于多通道浮點(diǎn)型圖像:IplImage* img=cvCreateImage
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國有機(jī)橙數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國日華椅數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國小刮勺數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國女式牛仔長褲數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國大理石仿古鐘數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國塑料防腐設(shè)備數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國保安巡檢電腦管理系統(tǒng)數(shù)據(jù)監(jiān)測研究報(bào)告
- 水泥路面注漿施工方案
- 2025年中國燃?xì)膺B續(xù)自動(dòng)配氣系統(tǒng)市場調(diào)查研究報(bào)告
- 工業(yè)建筑物裝修施工方案
- 2024年達(dá)州市總工會(huì)招聘工會(huì)社會(huì)工作者筆試真題
- 2025至2030年中國肌酸數(shù)據(jù)監(jiān)測研究報(bào)告
- 周口2024年河南周口市公安機(jī)關(guān)招聘輔警458人筆試歷年參考題庫附帶答案詳解
- 2025年度電視產(chǎn)品進(jìn)出口貿(mào)易合同4篇
- 《頭面部穴位按摩》課件
- 2024美團(tuán)簡化版商家合作合同標(biāo)準(zhǔn)文本一
- 2025年貴州黔源電力股份有限公司招聘筆試參考題庫含答案解析
- 《休閑食品加工技術(shù)》 課件 1 休閑食品生產(chǎn)與職業(yè)生活
- 2025年“開學(xué)第一課”觀后感心得體會(huì)(3篇)
- 春季開學(xué)安全第一課
- 《病史采集》課件
評(píng)論
0/150
提交評(píng)論