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;
}