1. 程式人生 > >【opencv學習筆記】002之載入影象imread、修改影象cvtColor、顯示影象imshow及儲存影象imwrite

【opencv學習筆記】002之載入影象imread、修改影象cvtColor、顯示影象imshow及儲存影象imwrite

目錄

一、前言

二、影象基本操作

1、載入影象CV :: imread

2、建立視窗cv::namedWindow

3、顯示影象CV :: imshow

4、修改影象 (cv::cvtColor)

5、儲存影象 (cv::imwrite)

三、全部程式碼及結果展示

1、程式碼

2、執行效果圖


一、前言

從今天開始,我會逐步把自己系列型別的部落格進行完善,有很多人催我抓緊寫資料結構的,寫Opencv的,是啊,欠了挺多了,是該給大家繼續完善啦。

今天主要給大家分享關於計算機視覺的開源庫 OpenCV 的內容,現在人工智慧比較火,所以帶火了Python,但是程式語言畢竟是程式語言,想要真正從事人工智慧,那就要開始想想從哪裡入手,計算機視覺事一個不錯的選擇。

第一個學習筆記是教大家怎麼配置:OpenCV配置。今天的就是基礎操作了,即影象的操作。我們知道計算機視覺是用攝像頭代替人眼睛進行識別,所以計算機視覺最重要的就是操作影象。如果大家想深入瞭解影象處理,有一本經典之作叫《數字影象處理》,很全面。如果只是希望使用一個OpenCV庫,瞭解一些原理,直接看OpenCV就可以啦。

二、影象基本操作

影象基本操作包括載入,修改,顯示,儲存。

1、載入影象CV :: imread

1.載入影象是什麼?

載入圖象就是將影象進行讀取,獲取影象的資訊,並存到一個Mat物件中,方便後續操作。

2.API

載入影象的API是imread,函式原型是:

Mat imread(const String& filename,int flags = IMREAD_COLOR);

函式引數含義如下:

//第一個引數表示影象檔名稱,包括影象檔名及路徑(相對路徑或絕對路徑)
//第二個引數,表示載入的影象是什麼型別,支援常見的三個引數值:
//    1.IMREAD_UNCHANGED (<0) 表示載入原圖,不做任何改變
//    2.IMREAD_GRAYSCALE ( 0)表示把原圖作為灰度影象載入進來
//    3.IMREAD_COLOR (>0) 表示把原圖作為RGB影象載入進來。

注:一般情況下,我們都預設呼叫一個引數,後面他預設呼叫一個引數,即原圖載入。

如下面這個例子:

Mat src = imread("E:/image/circle.bmp");

 

2、建立視窗cv::namedWindow

1.建立視窗是什麼?

在顯示之前,我們首先需要建立一個視窗,用以顯示影象,我們使用的是 namedWindow 這個 API,功能是建立一個OpenCV視窗,它是由OpenCV自動建立與釋放,你無需取銷燬它。

2.API

建立視窗的API是namedWindow,函式原型是:

namedWindow("Window Title", WINDOW_AUTOSIZE)

函式引數含義如下:

//第一個引數是視窗名稱
//第二引數是Mat物件,常見有兩種:
//    1.WINDOW_AUTOSIZE:會自動根據影象大小,顯示視窗大小,不能人為改變視窗大小 
//    2.WINDOW_NORMAL:跟QT整合的時候會使用,允許修改視窗大小。

注:一般情況下,我們都預設呼叫一個引數,後面他預設呼叫一個引數,即原圖載入。

如下面這個例子:

namedWindow("input image", CV_WINDOW_AUTOSIZE);

或者這樣:

#define INPUT_TITLE "input image"          // 巨集定義,原始圖片
namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);

目前這個函式也支援,直接用一來代替後面的引數,我們看一個示例吧!

namedWindow("src1", 1);

 

3、顯示影象CV :: imshow

1.顯示影象是什麼?

顯示影象就是將影象在黑窗體展現出來,讓我們能夠更加直觀的看到我們讀取到的影象及其處理後的效果。

2.API

顯示影象的API是imshow,函式原型是:

imshow 	( const String & winname, InputArray mat ) 	

函式引數含義如下:

//第一個引數表示視窗的名稱
//第二個引數,表示要顯示的影象

如下面這個例子:

imshow("src1", src1);

 

4、修改影象 (cv::cvtColor)

1.修改影象是什麼?

修改影象就是對影象進行一系列畫素操作,把影象從一個彩色空間轉換到另外一個色彩空間

2.API

修改影象的API是cvtColor,函式原型是:

void cv::cvtColor (InputArray src,OutputArray dst,int code,int dstCn = 0 ) 	

函式引數含義如下:

//第一個引數,表示輸入影象:8位無符號的16位無符號(CV_16uc。…),或者單精確度浮點數。
//第二個引數,表示要輸出影象,與輸入影象有相同的尺寸和深度。
//第三個引數,表示影象轉碼方式,比如從三通道的彩圖轉向單通道的灰度圖。
//第四個引數,通道數量的目標影象;如果該引數為0時,通道數程式碼和從SRC中自動得到。

如下面這個例子:

cvtColor(src1, src2, CV_RGB2GRAY);

 

5、儲存影象 (cv::imwrite)

1.儲存影象是什麼?

儲存影象檔案到指定目錄路徑,但是有要求,只有8位、16位的PNG、JPG、Tiff檔案格式而且是單通道或者三通道的BGR的影象才可以通過這種方式儲存。而且,儲存PNG格式的時候可以儲存透明通道的圖片。

2.API

儲存影象的API是imwrite,函式原型是:

bool cv::imwrite(const String & filename,InputArray img,const std::vector<int> & params = td::vector< int >()) 	

函式引數含義如下:

//第一個引數,表示儲存時檔案的名稱。
//第二個引數,表示要要被儲存的影象
//第三個引數,表示特定格式的影象編碼。

如下面這個例子:

imwrite("src2.jpg", src2);

這會預設儲存到與cpp相同的路徑下,如果想指定路徑,可以在第一個引數中加上路徑,比如儲存到D盤中的某個資料夾下:

imwrite("D:/image/src2.jpg", src2);

三、全部程式碼及結果展示

1、程式碼

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

using namespace std;
using namespace cv;

void main()
{
	Mat src1, src2;
	src1 = imread("E:/image/hand.jpg");

	namedWindow("src1", 1);
	
	cvtColor(src1, src2, CV_RGB2GRAY);
	
	imshow("src1", src1);
	imshow("src2", src2);
	imwrite("E:/image/src2.jpg", src2);
	waitKey(0);
}

2、執行效果圖

原圖src1
利用cvtColor處理後的圖

 

今天的內容就講到這裡啦,有什麼問題,大家可以在下面留言哦!