1.CvArr* :
可以認為CvArr*是一個萬能指針,,例如某個函數(shù)參數(shù)是CvArr*,該函數(shù)內(nèi)部會強制轉(zhuǎn)換回該函數(shù)需要的數(shù)據(jù)類型,,所以在調(diào)用該函數(shù)時,,傳入的參數(shù)類型就必須與該函數(shù)要求的類型一致,否則就會出錯,。
2.cv::Mat:
我們可以認為cv::Mat類型把向量,、矩陣、圖像等都統(tǒng)一了操作,。cv::Mat有更強大的矩陣運算能力,,支持常見的矩陣運算。對于圖像數(shù)據(jù)的運算,,將IplImage和CvMat類型轉(zhuǎn)換成cv::Mat類型可大大提高運算效率(后面會將cv::Mat與IplImage和CvMat類型之間的轉(zhuǎn)換),。
2.1 cv::Mat的一些操作
- cv::Mat mat = imread(const string* filename); //讀取圖像
- imshow(const string Window's name, mat); //顯示圖像
- imwrite(const string&filename, mat); //將mat圖像保存到固定路徑中
3.IplImage:
現(xiàn)在OpenCV的很多處理圖像的函數(shù)中都使用IplImage* 這個數(shù)據(jù)類型,下面是它的一些重要的操作:
- IplImage* img = cvLoadImage(PathName); //從路徑中加載圖像到img
- cvShowImage("WindowName", img); //顯示圖像img
- cvWaitKey(); //按任意鍵退出窗口
4.CvMat:
因為CvMat是矩陣結(jié)構(gòu),,無法像IplImage和Mat一樣直接讀取圖像數(shù)據(jù),,而是要先創(chuàng)建Mat類的空矩陣(cvCreateMat());再利用宏CV_MAT_ELEM()存放數(shù)據(jù),或者提取數(shù)據(jù),。
注意:這個宏只針對單通道有用,,多通道就會報錯。
對于多通道的CvMat矩陣來說,,要用cvSetND()對矩陣初始化,,用cvGetND()來提取數(shù)據(jù)。
- cvSetND(CvArr* arr, int idx0, int idy0, CvScalar value);
- cvSet2D(mat, 0, 0, CvScalar(2,3,0,0)); //矩陣mat的(0,0)點的像素值為一通道2,,二通道3.
5.IplImage轉(zhuǎn)cv::Mat類型,、CvMat轉(zhuǎn)cv::Mat類型:
在VC++調(diào)用OpenCV處理圖像時,經(jīng)常用到的一些OpenCV函數(shù)的形參類型可能是cv::Mat,、也可能是IplImage或者CvMat,,那么在圖像數(shù)據(jù)傳遞的過程中就需要在IplImage和CvMat與cv::Mat之間進行轉(zhuǎn)換。
5.1.1 IplImage轉(zhuǎn)cv::Mat類型:
- Mat MatImage(IplImage* img); //直接利用Mat定義一個Mat類矩陣,,強制將括號內(nèi)的IplImage*類型圖像轉(zhuǎn)換成Mat類
5.1.2 CvMat轉(zhuǎn)cv::Mat類型:
- Mat MatImage = Mat(CvMat* img, bool = true); //當bool=true時,,會將img中的數(shù)據(jù)直接深拷貝到MatImage中,而bool=false時只創(chuàng)建與img相同的矩陣頭
5.1.3 cv::Mat轉(zhuǎn)CvMat類型:
- CvMat CvMatImage = CvMat(cv::Mat img); //直接將cv::Mat類型圖像矩陣轉(zhuǎn)換成CvMat類型
5.1.4 cv::Mat轉(zhuǎn)IplImage類型:
- IplImage IPLimage = MatImage;
5.2 IplImage類型圖像拷貝到另一個IplImage類型圖像中:
- IplImage* img1 = cvLoadImage(pathName, 2); //img1指針指向路徑中的圖像,,參數(shù)=2時加載原始的灰度圖
- IplImage* img2 = cvCloneImage(&img1); //將img1指針指向的圖像引用,,并復制到IplImage* img2,img2也是指向該圖像的指針類型
6.OpenCV中的一些常用的函數(shù)及其參數(shù)類型的總結(jié):
- GaussianBlur(cv::InputArray src, cv::outputArray dst, cv::Size, 0,0); //高斯濾波
通常導入的圖像為cv::Mat類型,輸出的高斯濾波后的圖像也是cv::Mat類型圖像,,cv::Size通常用Size(3,3),。
- HoughCircles(cv::InputArray image, cv::OutputArray circles, int method, double dp, double minDist, double param1, double param2,int minRadius, int maxRadius);
- //通常輸入圖像為cv::Mat類型,輸出的circles定義為vector<Vec3f> circles,,用于存放找到的圓的圓心x,,y坐標和圓的半徑;
- //dp =1為最小分辨率,,minDist=1為允許找到的圓的圓心之間相隔的最小距離,,param1和param2根據(jù)具體圖像灰度來確定最優(yōu)值。
- CvMat* img = cvCreateMatHeader(int rows, int cols,CV_8UC1);//CvMat* cvCreateMatHeader();
- CvRect rect = cvRect(int x, int y, int width, int height); //定義矩形框的尺寸
- cvGetSubRect(IplImage* img,CvMat* submat, CvRect rect); //將原始IplImage*類型圖像按照rect尺寸截出矩形框出來,,并傳給CvMat* submat輸出,。
- GradValue_level.at<float>(0,i) = (float)CV_MAT_ELEM( *averageValue_level, float,0, i+1 ) -(float)CV_MAT_ELEM( *averageValue_level, float,0, i );
- //對于CvMat*類型矩陣通過CV_MAT_ELEM宏提取像素值或修改像素值,對于cv::Mat類圖像矩陣通過MatImage.at<type>(x,y)進行像素提取或修改像素值
- rectangle(cv::Mat &img, Rect(Point, Size(int width,int height)),cv::Scalar &color, int thickness =1,int lineType = 8, int shift = 0);
- circle(cv::Mat &img, cv::Point center, int Radius,const cv::Scalar &color, int thickness=1,int lineType =8, int shift=0);
- //在圖像cv::Mat img上畫出圓心為Point center,,半徑為Radius的圓,。
|