介绍
本模块包含媒体的输入输出,视频捕捉,图像和视频的编码解码,图形交互界面的接口等内容
图像的载入,显示和输出到文件
注意: opencv 1.0中图像的存储数据结构为 Ip1Image(需要在退出时release),在opencv2后采用了Mat类作为数据结构进行图像的存取,使其类似于 Matlab
命名空间
写简单的openCV程序时 ,以下3句成了标配
#include <opencv2/core/core.hpp> #include <opencv2/highui/highgui.hpp> using namespace cv; //命名空间
Mat类
Mat类是有用于保存图像以及以及其他数据的数据结构,默认情况下其尺寸为0,可以指定其初始大小,如cv :: Mat pic(320,640,cv::Scalar)
eg: 读入一张图片
Mat srcImage = imread("photo1.jpg"); //imread函数用于将图片读入Mat 类型中
imread 函数原型:
Mat imread(const string& filename, int flags=1) //第一个参数是读入的文件的路径, //第二个参数为载入标识,指定一个加载图像的颜色类型,默认值为1(载入三通道彩色图像) //这个标识值可以从higui_c.h中枚举中定义了
eg:图像显示
Mat image ; image = imread(argv[1]); namedWindow("w1"); //解释在后面 imshow("w1",image); //把读入的image 图像显示出来
imshow函数原型
void inshow(const string& winname, InputArray mat); //第一个参数为需要显示的窗口名称 //第二个位InputArray 类型的mat,填显示的图像 /*注意点:如果窗口是通过CV_WINDOW_AUTOSIZE(默认值)标志创建的,会显示原图,否则会将图像缩放以适合窗口 imshow函数缩放图像取决于图像的深度,具体如下 如果在的是8位无符号类型,就显示图像本来的样子, 16位无符号或32位整形,便用像素值除以256,也就是说值得范围[0,255*256]映射到[0,255], 32位浮点型,像素值编乘以255,即值得范围[0,1]映射到[0,255] */
InputArray 类型
一般遇到InputArray/OutputArray 类型当成Mat类型就可以
namedWindow函数
用于创建一个窗口,若是简单的显示图片,即先调用imread,然后imshow就可以直接指定窗口名,无需这一步(也就是前面的例子中的可以省略),但是在显示之前用到窗口名,就需要此函数了。
namedWindow函数原型
void namedWindow(const string& winname, int flag=WINDOW_AUTOSIZE); //第一个参数为窗口名字 //第二个参数为窗口标识有以下几类 /* WINDOW_NORMAL 用户可以改变窗口大小,OpenCV2中可写为CV_WINDOW_NORMAL WINDOW_AUTOSIZE (默认值)窗口自动调整以适应图像,用户不能改变大小,OpenCV2中可写为CV_WINDOW_AUTOSIZE WINDOW_OPENGL 窗口创建的时候会支持OpenGL,OpenCV2中可写为CV_WINDOW_OPENGL */ //注意点 :若存在相同名称窗口,创建不会做任何事,可调用destroyWindow或 destroyAllWindow函数来关闭窗口
imwrite函数
作用为输出图像到文件
函数原型稍微有点复杂
imwrite(const string& filename,InputArray img,const vector <int>& params=vector <int>()); //这里只说一下第3个参数 是 const vector<int>&类型,表示为特定格式保存的参数编码,默认为 vector <int>() //一般不用,若用到则,JPEG 格式这个参数表示0~100的图片质量,(CV_IMWRITE_JPEG_QUALITY)默认值是95 //PNF格式表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)0~9,较高的值意味着尺寸更小和更长压缩时间,默认为3 //对于PPM,PGM或PBM格式,表示2进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,默认值为1 //第3个参数的格式,由第一个参数填的值为基准
滑动条
是依附于窗口的存在,
创建滑动条
int createTrackbar(const string& trackname,const string& winname,int *value,int count TrackbarCallback onChange=0,void * userdata=0); //第一个参数为滑动条名字 //第三个参数表示滑块的位置,第四个参数为滑块最大值 /*第五个参数是回调函数(每次滑块动时调用)函数原型为void xxx(int,void*);第一个参数为轨迹条位置。第二个为用户数据(第6个值),若为NULL,表示没有函数,*/ //第六个参数为用户传给回调函数的值,用来处理轨迹函数,如果第三个参数value使用的是全局变量的话,这值忽略
看个很简单的例子;
#include <opencv/cv.hpp> #include <opencv2/highgui.hpp> #include <iostream> using namespace cv; using namespace std; int trackbar_value; const int trackbar_max=100; double alpha_value,beta_value; Mat imgsrc1,imgsrc2,dstimg; void trackbar_cb(int, void* ){ alpha_value=(double) trackbar_value/trackbar_max; beta_value=(1.0-alpha_value); //根据alpha和beata的值进行线性融合 addWeighted(imgsrc1,alpha_value,imgsrc2,beta_value,0.0,dstimg); imshow("Test_TRACKBAR",dstimg); } int main(int argc,char ** argv){ imgsrc1=imread(argv[1]); imgsrc2=imread(argv[2]); trackbar_value =40; namedWindow("Test_TRACKBAR",1); char trackbarname[50]; sprintf(trackbarname,"透明值 "); //创建滑动条 createTrackbar(trackbarname,"Test_TRACKBAR", &trackbar_value, trackbar_max, trackbar_cb); trackbar_cb(trackbar_value,0); waitKey(0); return 0; }
展示的是两张图片通过不同的透明度放在一块区域!
获取当前滑动条的位置
int getTrackbarPos(const string& trackbarname,const string& winname);
鼠标操作
鼠标操作跟滑动条的消息映射方式很类似,都是通过一个回调函数实现动作相应
而指定鼠标操作的回调函数为
void setMouseCallback(const string & winname,MouseCallbacka onMouse,void * userdata); //第二个参数MouseCallback类型,指定窗口里每次鼠标事件发生时被调用的函数指正,函数原型为 void Foo(int event ,int x, int y,int flags,void param) //其中envent可以理解为鼠标操作的类型,x,y为坐标值,flags是EVENT_FALG的组合, //param是用户定义传递到回调函数的调用的参数