【opencv學習筆記】002之載入影象imread、修改影象cvtColor、顯示影象imshow及儲存影象imwrite
目錄
一、前言
從今天開始,我會逐步把自己系列型別的部落格進行完善,有很多人催我抓緊寫資料結構的,寫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、執行效果圖
今天的內容就講到這裡啦,有什麼問題,大家可以在下面留言哦!