OpenCV 影像讀取(imread)、影像建立(Mat & create)、影像顯示(imshow)、影像儲存(imwrite)
影像屬性
首先,我們要先了解一張影像的屬性,常有的屬性如下:
1.影像長(cols)與寬(rows)
2.影像顏色,一般分成彩色(color image)與灰階(gray image),因彩色至少有三種顏色組成,所以為三通道,灰階則為一通道組成。
3.影像深度(depth),代表影像要使用多大的空間去儲存影像資料,如CV_8U,代表空間是8位元無符號。
4.影像類型(Type),除了第三點提到的深度資訊外,再額外包含通道數,看你是彩色還是單色。如果是8位元無符號的三通道影像,就是CV_8UC3。
影像讀取(imread)
Mat imread( const String& filename, int flags = IMREAD_COLOR );
const String& filename:代表讀檔的檔名
int flags = IMREAD_COLOR:代表影像讀進來的顏色模式,最常選擇彩色、灰階、原影像等模式
然後回傳矩陣。
影像建立(Mat & create)
Mat(int rows, int cols, int type, const Scalar& s);
一般我都是用這個建立影像空間
int rows:代表欲建立影像之高度
int cols:代表欲建立影像之寬度
int type:代表欲建立影像類型
const Scalar& s:代表欲建立影像亮度值
Mat::create(int rows,int
cols, int type )
主要用於重新分配影像大小、空間與通道用
int rows:代表欲建立影像之高度
int cols:代表欲建立影像之寬度
int type:代表欲建立影像類型
例如:
Mat SampleImg(50, 50, CV_32FC3, Scalar(255, 0, 0));
SampleImg.create(100, 60, CV_8UC(3));//改成100 x 60 CV_8U 三通道的影像
影像顯示(imshow)
void imshow(const String& winname, InputArray mat);
const String:代表顯示的視窗名稱
InputArray mat:代表欲顯示的影像矩陣
影像儲存(imwrite)
bool imwrite( const String& filename, InputArray img,const std::vector);
const String& filename:代表欲儲存的影像檔名(包含影像格式,常見的有bmp、png、jpg等..)
InputArray img:代表欲儲存的影像矩陣
const std::vector():代表設定的影像品質,可寫可不寫,如果想設定可參考下方寫法
vector<int> ImageQuality;
ImageQuality.push_back(CV_IMWRITE_JPEG_QUALITY);
ImageQuality.push_back(80); //自行設定壓縮品質,如果沒有額外設定,預設就是95
imwrite("MyGreenImg.bmp", GreenImg, ImageQuality);
///////------------------------------------------我是分隔線------------------
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(){
Mat GreenImg(500, 500, CV_8UC3, Scalar(0, 255, 0));//建立一張影像500 x 500 三通道 全綠色
imshow("GreenImg", GreenImg);
imwrite("MyGreenImg.bmp", GreenImg);//儲存一張影像,名字為MyGreenImg,副檔名為bmp
Mat LoadGreenImg = imread("MyGreenImg.bmp", CV_LOAD_IMAGE_COLOR);//讀取上面儲存的影像
imshow("LoadGreenImg", LoadGreenImg);
waitKey(0);
return 0;
}
///////------------------------------------------我還是分隔線--------------
跑出來的結果會有兩張影像,分別為自己建立的純綠色影像,另一個則是讀取剛剛儲存的影像並顯示~