高效opencv編程入門(OpenCV 編程簡介(矩陣圖像視頻的基本讀寫操作))_第1頁
高效opencv編程入門(OpenCV 編程簡介(矩陣圖像視頻的基本讀寫操作))_第2頁
高效opencv編程入門(OpenCV 編程簡介(矩陣圖像視頻的基本讀寫操作))_第3頁
高效opencv編程入門(OpenCV 編程簡介(矩陣圖像視頻的基本讀寫操作))_第4頁
高效opencv編程入門(OpenCV 編程簡介(矩陣圖像視頻的基本讀寫操作))_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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,而無需閱讀冗長的參考手冊。掌握了OpenCV的以下基礎知識后,有需要的話再查閱相關的參考手冊。目錄隱藏1 一、簡介1.1 1、OpenCV的特點§ 1.1.1 (1) 總體描述§ 1.1.2 (2) 功能§ 1.1.3 (3) OpenCV模塊1.2 2、有用的學習資源§ 1.2.1 (1) 參考手冊:§ 1.2.2 (2) 網(wǎng)絡資源:§ 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)建和定位一個新窗口:

4、7; 2.1.2 (2) 載入圖像:§ 2.1.3 (3) 顯示圖像:§ 2.1.4 (4) 關閉窗口:§ 2.1.5 (5) 改變窗口大小:2.2 2、輸入處理§ 2.2.1 (1) 處理鼠標事件:§ 2.2.2 (2) 處理鍵盤事件:§ 2.2.3 (3) 處理滑動條事件:3 三、OpenCV的基本數(shù)據(jù)結構3.1 1、圖像數(shù)據(jù)結構§ 3.1.1 (1) IPL 圖像:3.2 2、矩陣與向量§ 3.2.1 (1) 矩陣:§ 3.2.2 (2) 一般矩陣:§ 3.2.3 (3) 標量:3.3 3

5、、其它結構類型§ 3.3.1 (1) 點:§ 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) 復制圖像:§ 4.1.4 (4) 設置/獲取感興趣區(qū)域ROI:§ 4.1.5 (5) 設置/獲取感興趣通道COI:4.2 2、圖像讀寫§ 4.2.1 (1) 從文件中讀入圖像:§ 4.2.2 (2) 保存圖像:

6、4.3 3、訪問圖像像素§ 4.3.1 (1) 假設你要訪問第k通道、第i行、第j列的像素。§ 4.3.2 (2) 間接訪問: (通用,但效率低,可訪問任意格式的圖像)§ 4.3.3 (3) 直接訪問: (效率高,但容易出錯)§ 4.3.4 (4) 基于指針的直接訪問: (簡單高效)§ 4.3.5 (5) 基于 c+ wrapper 的直接訪問: (更簡單高效)4.4 4、圖像轉換§ 4.4.1 (1) 字節(jié)型圖像的灰度-彩色轉換:§ 4.4.2 (2) 彩色圖像->灰度圖像:§ 4.4.3 (3) 不同彩色

7、空間之間的轉換: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) 文本標注: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) 復制矩陣:§ 5.1.5 (5) 初始化矩陣:

8、§ 5.1.6 (6) 初始化矩陣為單位矩陣:5.2 2、訪問矩陣元素§ 5.2.1 (1) 假設需要訪問一個2D浮點型矩陣的第(i, j)個單元.§ 5.2.2 (2) 間接訪問:§ 5.2.3 (3) 直接訪問(假設矩陣數(shù)據(jù)按4字節(jié)行對齊):§ 5.2.4 (4) 直接訪問(當數(shù)據(jù)的行對齊可能存在間隙時 possible alignment gaps):§ 5.2.5 (5) 對于初始化后的矩陣進行直接訪問:5.3 3、矩陣/向量運算§ 5.3.1 (1) 矩陣之間的運算:§ 5.3.2 (2) 矩陣之間的元素

9、級運算:§ 5.3.3 (3) 向量乘積:§ 5.3.4 (4) 單一矩陣的運算:§ 5.3.5 (5) 非齊次線性方程求解:§ 5.3.6 (6) 特征值與特征向量 (矩陣為方陣):6 六、視頻處理6.1 1、從視頻流中捕捉一幀畫面§ 6.1.1 (1) OpenCV 支持從攝像頭或視頻文件(AVI格式)中捕捉幀畫面.§ 6.1.2 (2) 初始化一個攝像頭捕捉器:§ 6.1.3 (3) 初始化一個視頻文件捕捉器:§ 6.1.4 (4) 捕捉一幀畫面:§ 6.1.5 (5) 釋放視頻流捕捉器:6.2 2

10、、獲取/設置視頻流信息§ 6.2.1 (1) 獲取視頻流設備信息:§ 6.2.2 (2) 獲取幀圖信息:§ 6.2.3 (3) 設置從視頻文件抓取的第一幀畫面的位置:6.3 3、保存視頻文件§ 6.3.1 (1) 初始化視頻編寫器:§ 6.3.2 (2) 保持視頻文件:§ 6.3.3 (3) 釋放視頻編寫器:編輯一、簡介編輯1、OpenCV的特點編輯(1) 總體描述· OpenCV是一個基于C/C+語言的開源圖像處理函數(shù)庫· 其代碼都經(jīng)過優(yōu)化,可用于實時處理圖像· 具有良好的可移植性· 可以進行

11、圖像/視頻載入、保存和采集的常規(guī)操作· 具有低級和高級的應用程序接口(API)· 提供了面向Intel IPP高效多媒體函數(shù)庫的接口,可針對你使用的Intel CPU優(yōu)化代碼,提高程序性能(譯注:OpenCV 2.0版的代碼已顯著優(yōu)化,無需IPP來提升性能,故2.0版不再提供IPP接口)編輯(2) 功能· 圖像數(shù)據(jù)操作(內(nèi)存分配與釋放,圖像復制、設定和轉換)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ù)運算(矩陣乘積、矩陣方程求解、特征值、奇異值分解)Matrix and vector manipulation and linear algebra routines (products, solvers, eigenvalues, SVD).· 支持多種動態(tài)數(shù)據(jù)結構(鏈表、隊列、數(shù)據(jù)集、樹、圖)Various dynamic data structures (lists

13、, queues, sets, trees, graphs).· 基本圖像處理(去噪、邊緣檢測、角點檢測、采樣與插值、色彩變換、形態(tài)學處理、直方圖、圖像金字塔結構)Basic image processing (filtering, edge detection, corner detection, sampling and interpolation, color conversion, morphological operations, histograms, image pyramids).· 結構分析(連通域/分支、輪廓處理、距離轉換、圖像矩、模板匹配、霍夫變換、多

14、項式逼近、曲線擬合、橢圓擬合、狄勞尼三角化)Structural analysis (connected components, contour processing, distance transform, various moments, template matching, Hough transform, polygonal approximation, line fitting, ellipse fitting, Delaunay triangulation).· 攝像頭定標(尋找和跟蹤定標模式、參數(shù)定標、基本矩陣估計、單應矩陣估計、立體視覺匹配)Camera calibr

15、ation (finding and tracking calibration patterns, calibration, fundamental matrix estimation, homography estimation, stereo correspondence).· 運動分析(光流、動作分割、目標跟蹤)Motion analysis (optical flow, motion segmentation, tracking).· 目標識別(特征方法、HMM模型)Object recognition (eigen-methods, HMM).· 基本的

16、GUI(顯示圖像/視頻、鍵盤/鼠標操作、滑動條)Basic GUI (display image/video, keyboard and mouse handling, scroll-bars).· 圖像標注(直線、曲線、多邊形、文本標注)Image labeling (line, conic, polygon, text drawing)編輯(3) OpenCV模塊· cv 核心函數(shù)庫· cvaux 輔助函數(shù)庫· cxcore 數(shù)據(jù)結構與線性代數(shù)庫· highgui GUI函數(shù)庫· ml 機器學習函數(shù)庫編輯2、有用的學習資源編輯(1

17、) 參考手冊:· <opencv-root>/docs/index.htm (譯注:在你的OpenCV安裝目錄<opencv-root>內(nèi))編輯(2) 網(wǎng)絡資源:· 官方網(wǎng)站: · 軟件下載: 編輯(3) 書籍:· Open Source Computer Vision Libraryby Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). chenyusiyuan: 補充以下書籍· Learn

18、ing OpenCV - Computer Vision with the OpenCV Libraryby Gary Bradski & Adrian Kaehler, O'Reilly Media, 1 st ed. (September, 2008).· OpenCV教程基礎篇作者:劉瑞禎 于仕琪,北京航空航天大學出版社,出版日期:200706編輯(4) 視頻處理例程(在 <opencv-root>/samples/c/):· 顏色跟蹤: camshiftdemo· 點跟蹤: lkdemo· 動作分割: motempl&

19、#183; 邊緣檢測: laplace編輯(5) 圖像處理例程 (在 <opencv-root>/samples/c/):· 邊緣檢測: edge· 圖像分割: pyramid_segmentation· 形態(tài)學: morphology· 直方圖: demhist· 距離變換: distrans· 橢圓擬合: fitellipse編輯3、OpenCV 命名規(guī)則編輯(1) 函數(shù)名: cvActionTargetMod(.) Action = 核心功能(core functionality) (e.g. set, create

20、) Target = 目標圖像區(qū)域(target image area) (e.g. contour, polygon) Mod = (可選的)調整語(optional modifiers) (e.g. argument type)編輯(2) 矩陣數(shù)據(jù)類型: CV_<bit_depth>(S|U|F)C<number_of_channels> S = 符號整型 U = 無符號整型 F = 浮點型 E.g.: CV_8UC1 是指一個8位無符號整型單通道矩陣, CV_32FC2是指一個32位浮點型雙通道矩陣.編輯(3) 圖像數(shù)據(jù)類型: IPL_DEPTH_<bit_

21、depth>(S|U|F) E.g.: IPL_DEPTH_8U 圖像像素數(shù)據(jù)是8位無符號整型. IPL_DEPTH_32F圖像像素數(shù)據(jù)是32位浮點型.編輯(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的選項和項目中設置好OpenCV相關文件的路徑。編輯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/ 相當于 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)建和定位一個新窗口: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é)型/浮點型圖像。字節(jié)型圖像像素值范圍為0-255;浮點型圖像像素值范圍為0-1。彩色圖像的三色元素按BGR(藍-綠-紅)順序存儲。編輯(4) 關閉窗口:cvDestroyWindow("win1");編輯(5) 改變窗口大小:cvResizeWindow("win1",100,100);/ new width/heigh in pixels編輯2、輸入處理編

28、輯(1) 處理鼠標事件:· 定義一個鼠標處理程序: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、: 相對于左上角的像素坐標 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· 注冊該事件處理程序:mouseParam=5; cvSetMouseCallback("win1",mouseHandler,&mouseParam);/第三個參數(shù)可以設置為NULL編輯(2) 處理鍵盤事件:· 實際上對于鍵盤輸入并沒有專門的事件處理程序.· 按一定間隔檢測鍵盤輸入(適用于循環(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) 處理滑動條事件:· 定義一個滑動條處理程序:void trackbarHandler(int pos)printf("Trackbar position:

32、%dn",pos);· 注冊該事件處理程序:int trackbarVal=25;int maxVal=100; cvCreateTrackbar("bar1","win1",&trackbarVal ,maxVal , trackbarHandler);· 獲取當前的滑動條位置:int pos = cvGetTrackbarPos("bar1","win1");· 設置滑動條位置:cvSetTrackbarPos("bar1","win

33、1",25);編輯三、OpenCV的基本數(shù)據(jù)結構(譯注:OpenCV 1.1、1.2或2.0版本中各數(shù)據(jù)結構的結構體元素有所調整,以下僅作參考)編輯1、圖像數(shù)據(jù)結構編輯(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順序存儲數(shù)據(jù)|-int dataOrder;/ 0 - 將像素點不同通道的值交錯排在一起,形成單一像素平面|/ 1 - 把所有像素同通道值排在一起,形成若干個通道平面,再把平面排列起來|/ cvCreateImage 只能創(chuàng)建像素交錯排列式的圖像|-int origin;/ 0 像素原點為左上角,|/ 1 像素原點為左下角 (Windows bitmaps style)|-int widthStep;/ 相鄰行的同列點之間的字節(jié)數(shù)|-int imageSize;/ 圖像的大?。ㄗ止?jié)為單位)

35、 = height*widthStep|-struct _IplROI *roi;/ 圖像的感興趣區(qū)域(ROI). ROI非空時對圖像的|/ 處理僅限于ROI區(qū)域.|-char*imageDataOrigin;/ 圖像數(shù)據(jù)未對齊時的數(shù)據(jù)原點指針|/ (需要正確地重新分配圖像內(nèi)存 )|/ (needed for correct image deallocation)|-int align;/ 圖像數(shù)據(jù)的行對齊: 4 or 8 byte alignment|/ OpenCV 中無此項,采用widthStep代替|-char colorModel4;/ 顏色模型 OpenCV中忽略此項編輯2、矩陣與

36、向量編輯(1) 矩陣:CvMat / 2D 矩陣|-int type;/ 元素類型 (uchar,short,int,float,double) 與標志|-int step;/ 整行長度字節(jié)數(shù)|-int rows, cols;/ 行、列數(shù)|-int height, width;/ 矩陣高度、寬度,與rows、cols對應|-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) 與標志|-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;/ 元素數(shù)目|- step;/ 元素間距(字節(jié)為單位)CvSparseMat / N-維稀疏矩陣編輯(2) 一般矩陣:CvArr*/ 僅作為函數(shù)定義的參數(shù)使用,/ 表明函數(shù)可以接受不同類型的矩陣作為參數(shù),/ 例如:IplImage*, CvMat* 甚至是 CvS

39、eq*./ 矩陣的類型通過矩陣頭的前4個字節(jié)信息來確定編輯(3) 標量: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ù)名與對應的結構體名稱幾乎同名,差別僅在于函數(shù)名第一個字母是小寫的,而結構體名第一個字母是大寫的。它并不是一個 C+ 構造函數(shù)。(譯注:類似的還有 cvMat 與 CvMat、cvPoi

40、nt 與 CvPoint 等等)編輯3、其它結構類型編輯(1) 點: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. 各通道是交錯排列的. 一幅彩色圖像的數(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) 復制圖像:IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);IplImage* img2;img2=cvCloneImage(img1);/ 注意通過cvCloneImage得到的圖像/ 也要用 cvReleaseImage 釋放,否則容易產(chǎn)生內(nèi)存泄漏編輯(4) 設置/獲取感興趣區(qū)域ROI:void cvSetImageROI(IplIm

44、age* image, CvRect rect);void cvResetImageROI(IplImage* image);CvRect cvGetImageROI(const IplImage* image);大多數(shù)OpenCV函數(shù)都支持 ROI.編輯(5) 設置/獲取感興趣通道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默認將讀入的圖像強制轉換為一幅三通道彩色圖像. 不過可以按以下方法修改讀入方式:img=cvLoadImage(fileName,flag); flag: >0 將讀入的圖像強制轉換為一幅三通道彩色圖像 =0 將讀入的圖像強制轉換為一幅單通道灰度圖像

46、<0 讀入的圖像通道數(shù)與所讀入的文件相同.編輯(2) 保存圖像:if(!cvSaveImage(outFileName,img)printf("Could not save: %sn", outFileName);保存的圖像格式由 outFileName 中的擴展名確定.編輯3、訪問圖像像素編輯(1) 假設你要訪問第k通道、第i行、第j列的像素。編輯(2) 間接訪問: (通用,但效率低,可訪問任意格式的圖像)· 對于單通道字節(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中坐標參數(shù)的順序與其它opencv函數(shù)坐標參數(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· 對于多通道字節(jié)型/浮點型圖像: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) 直接訪問: (效率高,但容易出錯)· 對于單通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_

49、DEPTH_8U,1);(uchar *)(img->imageData + i*img->widthStep)j=111;· 對于多通道字節(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· 對于多通道浮點型圖像: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) 基于指針的直接訪問: (簡單高效)· 對于單通道字節(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;· 對于多通道字節(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;· 對于多通道浮點型圖像(假設圖像數(shù)據(jù)采用4字節(jié)(32位)行對齊方式):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 的直接訪問: (更簡單高效)· 首先定義一個 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;· 對于單通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);BwImage imgA(img);imgAij=111;· 對于多通道字節(jié)型圖像:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);RgbImage imgA(img);imgAij.b=111;imgAij.g=111;imgAij.r=111;· 對于多通道浮點型圖像:IplImage* img=cvCreateImage

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論