简介
在Windowns操作系统下,OpenCV的imread函数支持如下类型的图片载入:
- Windows位图:* .bmp,*.dib
- JPGEG文件:* .jpeg,* .jpg,*.jpe
- JPEG2000文件: * .jp2
- PNG图片:*.png
- 便携文件格式: * .pbm,* .pgm,*.ppm
- Sun rasters 光栅文件:* .sr,*.ras
读入模式
Mat imread(const sting& filename , int flags=1)
flags为载入标识符,指定一个载入图像的颜色类型。可以看到他自带的默认值1,所以很多时候这个可以忽略。在看了下面的讲解之后,我们就会发现,忽略表示载入三通道的彩色图像。higui_c.h中定义这样:
enum
{
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-1,
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =0,
/* ?, color */
CV_LOAD_IMAGE_COLOR =1,
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =2,
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =4
};
对常用标识符的理解:
- CV_LOAD_IMAGE_UNCHANGED —-1—在新版本已忽略
- CV_LOAD_IMAGE_GRAYSCALE—0—将图像转为灰度图像
- CV_LOAD_IMAGE_COLOR—1—将图像转为彩色图像
- CV_LOAD_IMAGE_ANYDEPTH—2—如果载入的图像深度为16位或者32位,就返回对应的深度的图像,否则转换为8位图像
需要说明的是,如果输入有冲突的标志,将采用较小的数字值,CV_LOAD_IMAGE_COLOR|CV_LOAD_IMAGE_ANYCOLOR将载入三通道图。如果载入最真实无损的源图片,可以选择CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR
因为flags是int型的变量,若不填写固定的值,可以这样进行:
- flags>0 返回一个3通道的彩色图像
- flags=0 返回一个灰色图像
- flags<0 返回一个包含Alpha通道的加载图像
例子
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main(){
Mat losslessImg = imread("D:\\Program Files\\VS2013Code\\test01_compositePicture\\test01_compositePicture\\fruits.jpg", 2 | 4);
Mat grayImg = imread("D:\\Program Files\\VS2013Code\\test01_compositePicture\\test01_compositePicture\\fruits.jpg", 0);
Mat colorfulImg = imread("D:\\Program Files\\VS2013Code\\test01_compositePicture\\test01_compositePicture\\fruits.jpg", 199);
imshow("losslessImg", losslessImg);
imshow("grayImg", grayImg);
imshow("colorfulImg", colorfulImg);
waitKey(0);
}
如果窗口是用CV_WINDOW_AUTOSIZE默认的,就会显示原始图片大小。否则缩放的图像依据深度大小:
- 8位无符号类型,就显示原图
- 16位无符号类型,或者32位整型,便用像素除以256,即【0,255X256】缩放【0,255】
- 如果是32位浮点型,则像素要乘以255,即【0,1】映射为【0,255】
窗口大小设置
窗口设置的原函数为:
namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
第一个参数为字符;
第二个参数为窗口标识符,有如下参数:
- WINDOW_NOMAL——用户可以随意改变窗口大小,在OpenCV2中为CV_WINDOW_NOMAL;
- WINDOW_AUTOSIZE——显示原图片大小,不可改动,在OpenCV2中为CV_WINDOW_AUTOSIZE;
- WINDOW_OPENGL——设置这个值,窗口建立时会支持OpenGL,imshow支持ogl:Buffer、ogl:Texture2D以及gpu:GpuMat作为输入;
输出图像到文件
bool imwrite(const string& filename,InputArray img, const vector& params=vector());
前两个不解释,vector& params=vector()对于保存图片的质量:
- JPEG参数0到100表示图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.
- 对于PNG格式图片表示压缩级别,(CV_IMWRITE_PNG_COMPRESSION)从0到9。较高值意味着更小的尺寸和更长的压缩,时间,默认3.
- 对于PPM和PGM或PBM的图片,表示二进制格式标志(CV_IMWRITE_PXM_BINARY),取值0或1,默认1
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
void creatAlphaMat(Mat &mat){
for (int i = 0; i < mat.rows; ++i)
{
for (int j = 0; j < mat.cols; ++j)
{
Vec4b&rgba = mat.at<Vec4b>(i, j);
rgba[0] = UCHAR_MAX;
rgba[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols)*UCHAR_MAX);
rgba[2] = saturate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows)*UCHAR_MAX);
rgba[3] = saturate_cast<uchar>(0.5*(rgba[1] + rgba[2]));
}
}
}
int main(){
//创建带Alpha通道的Mat
Mat mat(70, 270, CV_8UC4);
creatAlphaMat(mat);
vector<int>compression_params;
//OpenCV2为
//compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
//OpenCV3为
compression_params.push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
try{
imwrite("透明Alpha值图.png", mat, compression_params);
imshow("透明Alpha值图", mat);
fprintf(stdout, "png图片数据保存完毕\n 可以在工程目录下查看~~\n ");
waitKey(0);
}
catch(runtime_error& ex){
fprintf(stderr, "mat图像生成为成功!错误:%s\n", ex.what());
}
return 0;
}
摄像头输出图像
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main(){
VideoCapture capture;
Mat frame;
int index = 0;
capture.open(0);
if (capture.isOpened())
{
for (;;)
{
char cur_fn[255];//表示某张图片的路径
capture >> frame;
vector<int>compression_params;
compression_params.push_back(IMWRITE_JPEG_QUALITY);
compression_params.push_back(95);
if (!frame.empty())
{
imshow("avi", frame);
sprintf(cur_fn,"%08d.jpg", index);
imwrite(cur_fn, frame, compression_params);
index ++;
int c = waitKey(1);
if ((char)c == 'c') { break; }
}
else
{
printf(" --(!) No captured frame -- Break!"); break;
}
}
}
return 0;
}