1. 程式人生 > >關於Mat和using namespace cv的使用理解(一)

關於Mat和using namespace cv的使用理解(一)

參考:http://blog.sina.com.cn/s/blog_74f32c400101a1ah.html

參考文件:OpenCV中Mat的詳解

之前一直再用IplImage型別,昨天接觸Mat,使用起來發現有些不一樣,函式與之前的IplImage的有一點點不一樣

經過查閱和瀏覽大神的解釋和部落格,個人理解如下:

1、cvLoadImage()與imread()等函式區別深入瞭解:

參考:http://blog.sina.com.cn/s/blog_74f32c400101a1ah.html

c++有名稱空間這一解釋,using namespace  ;

using namespace cv;的具體意思是:

例如Cvrect和Rect以及cvresize和resize都是表示同一個東西,前者都是指cvrect,後者都是指cvresize,如果在程式開始寫上 using namespace cv;則cvrect可以簡寫為rect,cvresize可以簡寫為resize,如果沒有寫上的using namespace cv;那就用cv......所有的以新風格命名的函式都在 cv 名稱空間中,如果希望不要每次都輸入 cv:: ,則可使用下面語句:using namespace cv;

2、IplImage和Mat區別

產生不同的原因:IplImage使用的是C結構,而Mat使用的是C++結構

使用IplImage時需要手動管理記憶體,例如使用cvCreateImage(),cvReleaseImage()等函式建立和釋放記憶體,而且使用不熟練的時候我們會發現IplImage經常出現記憶體異常,當使用熟練時,程式規模較小時,IplImage這是沒有問題的,可是一旦程式碼變得越來越大他就會越來越來掙扎著處理這一切而不是著眼於實際解決自己的開發目標。

Mat使用的是c++結構,c++中類的概念,在opencv2.0以上,引入例如C++介面,類的使用,使得程式碼變得更加簡潔(c++中類使用. ,c中結構使用->)。

關於使用Mat的第一件事是:不再需要手動分配其記憶體大小,當不需要使用它的時候也不再需要手動釋放它,例如如下程式的區別:

IplImage程式:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "stdio.h"


int main(void)
{
IplImage* Image;
IplImage* Image_Gray;// c語言中,宣告需要在語句之前
Image = cvLoadImage("D:\\opencv2.4.4\\lema.jpg", 1);// 載入圖片,1-彩色
Image_Gray = cvCreateImage(cvGetSize(Image), Image->depth, 1);// 建立記憶體
cvCvtColor(Image, Image_Gray, CV_BGR2GRAY);// 彩色圖->灰度圖
cvShowImage("Image", Image);
cvShowImage("Image_Gray", Image_Gray);
cvWaitKey(0);
cvReleaseImage(&Image);
cvReleaseImage(&Image_Gray);
return 0;
}

Mat程式:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace cv;


int main(void)
{
Mat Image = imread("D:\\opencv2.4.4\\lema.jpg",1);
imshow("Image", Image);
Mat Image_Gray;
cvtColor(Image, Image_Gray, CV_BGR2GRAY, 0);
imshow("Image_Gray", Image_Gray);
waitKey(0);
return 0;
}

Mat本質是由兩個資料部分組成的類:矩陣頭(包含資訊有矩陣的大小、用於儲存的方法、矩陣儲存的地址等),一個指標(指向了畫素值的矩陣,可根據選擇用於儲存的方法採用任何維度儲存資料)。矩陣頭部的大小是恆定的,然而,矩陣本身的大小因影象的不同而不同,通常是較大的數量級。因而,當你的程式中傳遞影象並在有些時候需要建立影象副本時,需要花費很大的代價生成影象矩陣本身,而不是影象的頭部。

opencv是影象處理庫,它包含大量的影象處理函式,因此,影象傳給庫中的函式是一種常見的做法。為提高大程式的速度,opencv使用引用計數系統,其思想是Mat的每個物件都具有自己的頭,讓矩陣指標指向同一地址的例項之間共享該矩陣。此外,拷貝運算子將智慧複製矩陣頭部,也將複製指向矩陣的指標,但不復制矩陣本身。

(時間原因,這次先碼這些字...下次繼續(二))