1. 程式人生 > >OpenCV-影象處理(01、影象的載入、修改與儲存)

OpenCV-影象處理(01、影象的載入、修改與儲存)

1. 載入影象(用cv::imread)

Mat imread(const string& filename,int flags=1)

  • 函式介紹:函式imread返回的值Mat物件,如果讀取檔案失敗,函式會返回一個空矩陣,那麼 srcImage.data 的值是 NULL,因此正常讀取完檔案後,我們可以利用 srcIamge.data 或 srcImage.enpty() 函式進行返回值檢查,以確保檔案正常載入。
  • 引數介紹:imread 功能是載入影象檔案成為一個 Mat 物件,其中第一個引數表示 影象檔名稱 。第二個引數表示 讀取影象的顏色型別(預設引數是1) ,返回3通道影象,支援常見的三個引數值:

IMREAD_UNCHANGED :表示載入原圖,不做任何改變
IMREAD_GRAYSCALE :表示把原圖作為灰度影象載入進來
IMREAD_COLOR :表示函式返回為單色影象

另外,flags可設定為0、大於0、小於0

0:該函式返回單通道影象
大於0:函式強制返回3通道影象
小於0:函式不對影象進行通道轉化

OpenCV支援JPG、PNG、TIFF等常見格式影象檔案載入

  • 案例程式碼:
#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
int main(){ Mat src=imread("E:/Experiment/OpenCV/Pictures/boy1.jpg");//載入圖片,第二個引數預設是1 //CV_LOAD_IMAGE_ANYDEPTH:表示返回16bit或32bit影象(當輸入時相同深度時),否則返回8bit影象 src=imread("E:/Experiment/OpenCV/Pictures/boy1.jpg",CV_LOAD_IMAGE_ANYDEPTH); //CV_LOAD_IMAGE_COLOR:表示函式返回為單色影象 src=imread("E:/Experiment/OpenCV/Pictures/boy1.jpg"
,CV_LOAD_IMAGE_COLOR); //CV_LOAD_IMAGE_GRAYSCALE:表示函式返回為通道影象 src=imread("E:/Experiment/OpenCV/Pictures/boy1.jpg",CV_LOAD_IMAGE_GRAYSCALE); if(src.empty()){//檢測圖片 printf("could not load image..."); return -1; } namedWindow("output windows",CV_WINDOW_AUTOSIZE); imshow("output windows",src);//顯示圖片 waitKey(0); return 0; }

2. 顯示影象(cv::namedWindows 與cv::imshow)

  • namedWindos功能是建立一個OpenCV視窗,它是由OpenCV自動建立與釋放,你無需取銷燬它。常見用法: namedWindow(“Window Title”, WINDOW_AUTOSIZE)

  • WINDOW_AUTOSIZE會自動根據影象大小,顯示視窗大小,不能人為改變視窗大小

  • WINDOW_NORMAL,跟QT整合的時候會使用,允許修改視窗大小。

  • void imshow(const string& winname, InputArray mat); imshow根據視窗名稱顯示影象到指定的視窗上去,第一個引數是視窗名稱,第二引數是Mat物件。

  • 案例程式碼(見上)

3. 修改影象 (cv::cvtColor)

cvtColor( image, gray_image, COLOR_BGR2GRAY );

  • cvtColor的功能是把影象從一個彩色空間轉換到另外一個色彩空間,有三個引數,
    第一個引數表示源影象、
    第二引數表示色彩空間轉換之後的影象、
    第三個引數表示源和目標色彩空間如:COLOR_BGR2HLS 、COLOR_BGR2GRAY 等

  • 案例程式碼:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;

int main(){
	
	Mat src=imread("E:/Experiment/OpenCV/Pictures/boy1.jpg");//載入圖片,第二個引數預設是1

	if(src.empty()){//檢測圖片
		printf("could not load image...");
		return -1;
	}

	//namedWindow("output windows",CV_WINDOW_AUTOSIZE);
	//imshow("output windows",src);//顯示圖片

	Mat img1,img2;
	cvtColor(src,img1,COLOR_RGB2BGR);
	cvtColor(src,img2,COLOR_RGB2HLS);

	namedWindow("output1",CV_WINDOW_AUTOSIZE);
	namedWindow("output2",CV_WINDOW_AUTOSIZE);
	imshow("output1",img1);
	imshow("output2",img2);

	waitKey(0);

	return 0;
}
  • 執行結果:
    在這裡插入圖片描述

4. 儲存影象(cv::imwrite)

bool imwrite( const string& filename, InputArray img, const vector& params=vector() )

  • 儲存影象檔案到指定目錄路徑
  • 只有8位、16位的PNG、JPG、Tiff檔案格式而且是單通道或者三通道的BGR的影象才可以通過這種方式儲存
  • 儲存PNG格式的時候可以儲存透明通道的圖片
  • 可以指定壓縮引數
#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;

int main(){
	
	Mat src=imread("E:/Experiment/OpenCV/Pictures/boy1.jpg");//載入圖片,第二個引數預設是1

	if(src.empty()){//檢測圖片
		printf("could not load image...");
		return -1;
	}
	namedWindow("output windows",CV_WINDOW_AUTOSIZE);
	imshow("output windows",src);//顯示圖片

	imwrite("E:/abc.jpg",src);//儲存圖片

	waitKey(0);
	return 0;
}