一.圖像讀寫與簡單處理
1. Mat cv::imread(const String& filename, int flags=IMREAD_COLOR).
imread函數加載filename圖像,讀入時,原始圖像數據不可被修改。 flags可取的值如下:IMREAD_UNCHANGED(原始圖像是什么,讀入的就是什么), IMREAD_GRAYSCALE(始終將圖像轉換為單通道灰度圖像), IMREAD_COLOR(始終將圖像轉換為三通道BGR彩色圖像), IMRAD_ANYDEPTH, IMREAD_ANYCOLOR, IMREAD_LOAD_GOAL, IMREAD_REDUCED_GRAYSCALE_2, (單通道灰度圖,尺寸變為原圖的1/2), IMREAD_REDUCED_COLOR_2(三通道BGR彩圖,尺寸變為原圖的1/2), IMREAD_REDUCED_GRAYSCALE_4(單通道灰度圖,尺寸變為原圖的1/2), IMREAD_REDUCED_COLOR_4(三通道BGR彩圖,尺寸變為原圖的1/4), IMREAD_REDUCED_GRAYSCALE_8(單通道灰度圖,尺寸變為原圖的1/8), IMREAD_REDUCED_COLOR_8(三通道BGR彩圖,尺寸變為原圖的1/8)
eum cv::ImreadModes{ cv::IMREAD_UNCHANGED=-1, cv::IMREAD_GRAYSCALE=0, cv::IMREAD_COLOR=1, cv::IMREAD_ANYDEPTH=2, cv::IMREAD_ANYCOLOR=4, cv::IMREAD_LOAD_GDAL=8, cv::IMREAD_REDUCED_GRAYSCALE_2=16, cv::IMREAD_REDUCED_COLOR_2=17, cv::IMREAD_REDUCED_GRAYSCALE_4=32, cv::IMREAD_REDUCED_GRASCALE_8=64, cv::IMREAD_REDUCED_COLOR_8=65}
2. bool cv::imwrite(const String& filename, InputArray img, const std::vector<int>& params=std::vector<int>())
將輸入矩陣img保存為名為filename的圖像,保存時,圖像名不可被修改。只有八位單通道(或者CV_16U in case of PNG, JPEG2000, and tiff)或者三通道(BGR通道順序)的圖像可以用該函數保存。也可以以4通道BGRA的格式存儲PNG圖像,全透明的像素alpha值為0,完全不透明的像素alpha值為255. vector<int> 格式的params是在圖像存儲過程中的,一系列參數。它可取:IMWRITE_JPEG_QUALITY(JPEG質量可取值為0~100,越高,質量越好,默認值是95), IMWRITE_JPEG_PROGRESSIVE(), IMWRITE_JPEG_OPTIMIZE(), IMWRITE_JPEG_RST_INTRVAL(), IMWRITE_JPEG_LUMA_QUALITY(), IMWRITE_JPEG_CHRMOMA_QUALITY(), IMWRITE_PNG_COMPRESSION(PNG的壓縮等級可取0~9, 值越高,壓縮后的尺寸越小,但壓縮時間越長,默認值是3), IMWRITE_PNG_STRATEGY(), IMWRITE_PNG_BILEVEL(), IMWRITE_PXM_BINARY(), IMWRITE_WEBP_QUALITY(), IMWRITE_PNG_STRATEGY_DEFAULT(), IMWRITE_PNG_STRTEGY_FILERED(), IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY(), IMWRITE_PNG_STRATEGY_RLE(), IMWRITE_PNG_STRATEGY_FIXED().
eum cv::ImwriteFlags{ cv::IMWRITE_JPEG_QUALITY=1, cv::IMWRITE_JPEG_PROGRESSIVE=2, cv::IMWRITE_JPEG_OPTIMIZE=3, cv::IMWRITE_JPEG_RST_INTERVAL=4, cv::IMWRITE_JPEG_LUMA_QUALITY=5, cv::IMWRITE_JPEG_CHROMA_QUALITY=6, cv::IMWRITE_PNG_COMPRESSION=16, cv::IMWRITE_PNG_STRATEGY=17, cv::IMWRITE_PNG_BILEVEL=18, cv::IMWRITE_PXM_BINARY=32, cv::IMWRITE_WEBP_QUALITY=64}
eum cv::ImwritePNGFlags{
cv::IMWRITE_PNG_STRATEGY_DEFAULT=0, cv::IMWRITE_PNG_STRATEGY_FILTERED=1, cv::IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY=2, cv::IMWRITE_PNG_STRATEGY_RLE=3, cv::IMWRITE_PNG_STRATEGY_FIXED=4}
3. Mat cv::imdecode(InputArray buf, int flags)或者 Mat cv::imdecode(InputArray buf, int flags, Mat* dst)
從內存緩沖區中讀取一個圖像
4.bool cv::imencode(const String& ext, InputArray img, std::vector<uchar>& buf, const std::vector<int> & params=std::vector<int>())
將一個圖像編碼入內存緩沖區中
########分割線###########
5. void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
將圖像從一個色彩空間轉換到另一個色彩空間。 OpenCV標准的顏色格式是BGR,即在一個標准的(24bit)彩圖中,第一個byte是一個八位的藍色部分,第二個byte是綠色部分,第三個byte是紅色部分。后面的第4,5,6個byte就是第二像素的三個通道,以此類推。R,G,B三個通道的常規取值范圍為:(1)對於CV_8U類型的圖像,范圍為0~255。(2)對於CV_16U類型的圖像,范圍為0~65535. (3) 對於CV_32F圖像,其取值范圍是0~1。所以,對於線性變換來說,取值范圍沒什么關系,例如COLOR_BGR2GRAY,都是CV_8U類型圖像之間的轉換。但是對於非線性變換,輸入的RGB圖像需要歸一化到合理的取值范圍內,以得到正確的結果。例如,如果你有一個32位浮點圖像CV_32F,它是由8位圖像CV_8U沒有任何縮放的直接轉換過來,那么它的取值變換范圍為0~255,而不是所期望的0~1.所以在調用cvtColor函數前,我們需要先進行圖像縮放。例如:
img *=1./255;
cvtColor(img ,img COLOR_BGR2Luv);
如果轉換過程增加了alpha通道,它的值會被設置為對應通道取值的最大值:255 for CV_8U, 65535 for CV_16U, 1 for CV_32F. 至於code值,太多,在此不加以枚舉。
#define CV_Assert(expr) if(!!(expr)); else cv::error(cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__)
在運行時,檢查條件expr是否成立,若不成立會拋出異常。
static _Tp cv::saturate_cast(uchar v)
模板函數,實現從一個基本類型到另一個基本類型的精確轉換。
saturate的意思就是說,當輸入值v超高了目標類型的范圍,該值會被限幅。例如:
uchar a=saturate_cast<uchar>(-100); //a=0
short b=saturate_cast<short>(33333.333);//b=32767;