1. 程式人生 > >OpenCV中:CvArr、CvMat、IplImage、cv::Mat和cv::InputArray的相關總結

OpenCV中:CvArr、CvMat、IplImage、cv::Mat和cv::InputArray的相關總結

        1.CvArr* :

    typedef void CvArr;
        可以認為CvArr*是一個萬能指標,例如某個函式引數是CvArr*,該函式內部會強制轉換回該函式需要的資料型別,所以在呼叫該函式時,傳入的引數型別就必須與該函式要求的型別一致,否則就會出錯。

        2.cv::Mat:

我們可以認為cv::Mat型別把向量、矩陣、影象等都統一了操作。cv::Mat有更強大的矩陣運算能力,支援常見的矩陣運算。對於影象資料的運算,將IplImage和CvMat型別轉換成cv::Mat型別可大大提高運算效率(後面會將cv::Mat與IplImage和CvMat型別之間的轉換)。

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:

現在OpenCV的很多處理影象的函式中都使用IplImage* 這個資料型別,下面是它的一些重要的操作:

IplImage* img = cvLoadImage(PathName);         //從路徑中載入影象到img
cvShowImage("WindowName", img);		       //顯示影象img
cvWaitKey();                                   //按任意鍵退出視窗

        4.CvMat:

 因為CvMat是矩陣結構,無法像IplImage和Mat一樣直接讀取影象資料,而是要先建立Mat類的空矩陣(cvCreateMat());再利用巨集CV_MAT_ELEM()存放資料,或者提取資料。

注意:這個巨集只針對單通道有用,多通道就會報錯。

        對於多通道的CvMat矩陣來說,要用cvSetND()對矩陣初始化,用cvGetND()來提取資料。

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轉cv::Mat型別、CvMat轉cv::Mat型別:

在VC++呼叫OpenCV處理影象時,經常用到的一些OpenCV函式的形參型別可能是cv::Mat、也可能是IplImage或者CvMat,那麼在影象資料傳遞的過程中就需要在IplImage和CvMat與cv::Mat之間進行轉換。

5.1.1  IplImage轉cv::Mat型別:

Mat MatImage(IplImage* img);   //直接利用Mat定義一個Mat類矩陣,強制將括號內的IplImage*型別影象轉換成Mat類
5.1.2  CvMat轉cv::Mat型別:
Mat MatImage = Mat(CvMat* img, bool = true); //當bool=true時,會將img中的資料直接深拷貝到MatImage中,而bool=false時只建立與img相同的矩陣頭
5.1.3  cv::Mat轉CvMat型別:
CvMat CvMatImage = CvMat(cv::Mat img);    //直接將cv::Mat型別影象矩陣轉換成CvMat型別
5.1.4  cv::Mat轉IplImage型別:
IplImage IPLimage = MatImage;  
5.2  IplImage型別影象拷貝到另一個IplImage型別影象中:
IplImage* img1 = cvLoadImage(pathName, 2);  //img1指標指向路徑中的影象,引數=2時載入原始的灰度圖
IplImage* img2 = cvCloneImage(&img1);  //將img1指標指向的影象引用,並複製到IplImage* img2,img2也是指向該影象的指標型別
        6.OpenCV中的一些常用的函式及其引數型別的總結:
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根據具體影象灰度來確定最優值。

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);
//在輸入影象cv::Mat img上畫出矩形框
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的圓。