OpenCV3学习笔记-HighGUI初步

  • 介绍

     本模块包含媒体的输入输出,视频捕捉,图像和视频的编码解码,图形交互界面的接口等内容

  • 图像的载入,显示和输出到文件

     注意: 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;
}

OpenCV3学习笔记-HighGUI初步_第1张图片OpenCV3学习笔记-HighGUI初步_第2张图片OpenCV3学习笔记-HighGUI初步_第3张图片

展示的是两张图片通过不同的透明度放在一块区域! 

获取当前滑动条的位置

  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是用户定义传递到回调函数的调用的参数



你可能感兴趣的:(OpenCV3学习笔记-HighGUI初步)