1. 程式人生 > >opencv--基本常用函式【1】

opencv--基本常用函式【1】

載入影象

  • 函式原型

    imread()
    Mat cv :: imread(const String& 	檔名,   //要載入的檔案的名稱
    					INT flags =IMREAD_COLOR   //可以採用cv :: ImreadModes值的標誌
  • 功能
    從檔案載入影象。
    函式imread從指定檔案載入影象並返回它。如果無法讀取影象(由於檔案丟失,許可權不正確,格式不受支援或無效),該函式返回一個空矩陣(Mat :: data == NULL)。

  • 目前,支援以下檔案格式:

    1. Windows點陣圖 - * .bmp,* .dib(始終支援)
    2. JPEG檔案 - * .jpeg,* .jpg,*。jpe(參見“ 註釋”部分)
    3. JPEG 2000檔案 - * .jp2(參見注釋部分)
    4. 行動式網路圖形 - * .png(參見“ 註釋”部分)
    5. WebP - * .webp(參見Notes部分)
    6. 行動式影象格式 - * .pbm,* .pgm,* .ppm * .pxm,* .pnm(始終支援)
    7. 太陽柵格 - * .sr,* .ras(始終支援)
    8. TIFF檔案 - * .tiff,* .tif(參見注釋部分)
    9. OpenEXR影象檔案 - * .exr(參見注釋部分)
    10. Radiance HDR - * .hdr,* .pic(始終支援)
    11. Gdal支援的柵格和向量地理空間資料
  • 注意

    1. 該函式通過內容而不是副檔名確定影象的型別
    2. 在彩色影象的情況下,解碼影象將具有以BGR順序儲存的通道。
    3. 在Microsoft Windows * OS和MacOSX *上,預設使用隨OpenCV映像(libjpeg,libpng,libtiff和libjasper)附帶的編解碼器。因此,OpenCV始終可以讀取JPEG,PNG和TIFF。在MacOSX上,還可以選擇使用本機MacOSX影象閱讀器。但請注意,由於MacOSX中嵌入了色彩管理,目前這些原生影象載入器會為影象提供不同的畫素值。
    4. 在Linux ,BSD風格和其他類似Unix的開源作業系統上,OpenCV尋找隨作業系統映像提供的編解碼器。安裝相關軟體包(不要忘記開發檔案,例如,“Debian *和Ubuntu *中的”libjpeg-dev“)以獲得編解碼器支援或開啟CMake中的OPENCV_BUILD_3RDPARTY_LIBS標誌。
    5. 如果您在CMake和IMREAD_LOAD_GDAL中將WITH_GDAL標誌設定為true 以載入影象,則將使用GDAL驅動程式以通過支援以下格式來解碼影象:Raster,Vector。
    6. 如果EXIF資訊嵌入在影象檔案中,則將考慮EXIF方向,因此除非傳遞IMREAD_IGNORE_ORIENTATION標誌,否則影象將相應地旋轉。

建立一個命名的OpenCV視窗

  • 函式原型
    namedWindow()
    void cv :: namedWindow(const String& 	winname,//視窗標題中視窗的名稱,可用作視窗識別符號
    						INT flags =WINDOW_AUTOSIZE //窗戶的標誌。支援的標誌是;(cv :: WindowFlags)
  • 功能
    建立一個視窗。
  1. 名為Window的函式建立了一個視窗,可用作影象和軌跡欄的佔位符。建立的視窗由其名稱引用。
  2. 如果已存在具有相同名稱的視窗,則該函式不執行任何操作。
  3. 您可以呼叫cv :: destroyWindow或cv :: destroyAllWindows來關閉視窗並取消分配任何相關的記憶體使用情況。對於一個簡單的程式,您實際上不必呼叫這些函式,因為退出時作業系統會自動關閉應用程式的所有資源和視窗。

在OpenCV視窗中顯示影象

  • 函式原型

    imshow()
    void cv :: imshow(const String& 	winname, //視窗名稱
    					InputArray 	mat           //要顯示的影象
  • 功能
    在指定的視窗中顯示影象。

    1. 如果視窗是使用cv :: WINDOW_AUTOSIZE標誌建立的,則影象將以原始大小顯示,但仍然受到螢幕解析度的限制。
    2. 否則,縮放影象以適合視窗。

    該功能可能會縮放影象,具體取決於其深度:

    1. 如果影象是8位無符號,則按原樣顯示。
    2. 如果影象是16位無符號或32位整數,則畫素除以256.即值範圍[0,255 * 256]被對映到[0,255]。
    3. 如果影象是32位或64位浮點,則畫素值乘以255.即值範圍[0,1]對映到[0,255]。
    4. 如果視窗是使用OpenGL支援建立的,cv :: imshow也支援ogl :: Buffer,ogl::Texture2D和cuda :: GpuMat作為輸入。
  • 注意
    如果在此函式之前未建立視窗,則假定使用cv :: WINDOW_AUTOSIZE建立視窗
    如果需要顯示大於螢幕解析度的影象,則需要在imshow之前呼叫namedWindow(“”,WINDOW_NORMAL)。

    此函式後面應跟有cv :: waitKey函式,該函式顯示指定毫秒的影象。否則,它將不顯示影象。

    1. waitKey(0)將無限顯示視窗,直到任何按鍵(適用於影象顯示)
    2. waitKey(25)將顯示一個25毫秒的幀,之後顯示將自動關閉。(如果你把它放在一個迴圈中來閱讀視訊,它將逐幀顯示視訊)

將影象從BGR轉換為灰度格式

  • 函式原型

    cvtColor()
    void cv :: cvtColor	(	InputArray 	src,    //輸入影象:8位無符號,16位無符號(CV_16UC ...)或單精度浮點
    						OutputArray 	dst,//	輸出與src相同大小和深度的影象
    						INT 	code,       //顏色空間轉換程式碼
    						INT 	dstCn =0    //目標影象中的通道數; 如果引數為0,則從src和程式碼自動匯出通道數
  • 功能
    將影象從一個顏色空間轉換為另一個顏色空間。

    該函式將輸入影象從一個顏色空間轉換為另一個顏色空間。在從RGB顏色空間轉換到的情況下,應明確指定通道的順序(RGB或BGR)。請注意,OpenCV中的預設顏色格式通常稱為RGB,但它實際上是BGR(位元組相反)。因此,標準(24位)彩色影象中的第一個位元組將是8位藍色分量,第二個位元組將為綠色,第三個位元組將為紅色。然後第四個,第五個和第六個位元組將是第二個畫素(藍色,然後是綠色,然後是紅色),依此類推。

  • R,G和B通道值的常規範圍是:
    CV_8U影象為0到255
    CV_16U影象為0到65535
    CV_32F影象為0到1

    線上性變換的情況下,範圍無關緊要。
    但是在非線性變換的情況下,應將輸入RGB影象歸一化到適當的值範圍以獲得正確的結果,例如,對於RGB L * u * v *變換。
    例如,如果您有一個32位浮點影象直接從8點陣圖像轉換而沒有任何縮放,那麼它將具有0…255值範圍而不是函式假定的0…1。因此,在呼叫cvtColor之前,首先需要縮小影象:
    img * = 1./255;
    cvtColor(img,img,COLOR_BGR2Luv);

  • 注意
    如果將cvtColor與8點陣圖像一起使用,轉換將丟失一些資訊。對於許多應用程式,這不會引人注意,但建議在需要全範圍顏色的應用程式中使用32點陣圖像,或者在操作之前轉換影象然後轉換回來。

    如果轉換添加了alpha通道,則其值將設定為相應通道範圍的最大值:CV_8U為255,CV_16U為65535,CV_32F為1。

將轉換後的影象儲存在磁碟上的檔案中

  • 函式原型

    imwrite()
    bool cv :: imwrite(const String&  filename,  //檔名。
    					InputArray 	img, //要儲存的圖片
    					const std :: vector <int>&params =std::vector< int >()  //特定格式的引數編碼
  • 功能
    將影象儲存到指定的檔案。
    函式imwrite將影象儲存到指定的檔案。基於副檔名選擇影象格式(有關副檔名列表,請參閱cv :: imread)
    使用此功能時,只能儲存8位(或PNG,JPEG 2000和TIFF情況下的16位無符號(CV_16U))單通道或3通道(帶’BGR’通道順序)影象。

    如果格式,深度或通道順序不同,請使用Mat :: convertTo和cv :: cvtColor在儲存之前進行轉換。或者,使用通用FileStorage I / O函式將影象儲存為XML或YAML格式。

    使用此功能可以使用Alpha通道儲存PNG影象。為此,建立8位(或16位)4通道影象BGRA,其中alpha通道最後。完全透明的畫素應將alpha設定為0,完全不透明的畫素應將alpha設定為255/65535。

例項:

#include"opencv2/opencv.hpp"
using namespace cv;
int main() {
	Mat pic1,pic2;
	pic1 = imread("D:/2.jpg", IMREAD_GRAYSCALE);//載入灰度圖片
	pic2 = imread("D:/2.jpg", IMREAD_COLOR);    //載入彩色圖片
	
	namedWindow("pic1", WINDOW_AUTOSIZE);//不可以手動更改視窗的大小
	imshow("pic1", pic1);
	
    namedWindow("pic2",WINDOW_NORMAL);   //可以手動更改視窗的大小
	//imshow("pic2", pic2);

	Mat pic11,pic111, pic22;
	
	cvtColor(pic2, pic11, CV_BGR2GRAY);//轉化成灰色圖片
	imwrite("D:/test/pic11.png", pic11);
	//imshow("pic2", pic11);

	//HSL 表示 hue(色相)、lightness(亮度)、saturation(飽和度)
	cvtColor(pic2, pic111, CV_BGR2HLS);
	//imshow("pic2", pic111);
	imwrite("D:/test/pic111.jpg", pic111);
	
	//HSV 表示 hue(色相)、saturation(飽和度)、value(色調) 
	cvtColor(pic2, pic22, CV_BGR2HSV);//原圖不可以是灰色影象
	imshow("pic2", pic22);
	imwrite("D:/test/pic2.jpg", pic22);
	
	waitKey(0);
    return 0;
}

在這裡插入圖片描述