文档章节

OpenCV3学习笔记-HighGUI初步

Ginter
 Ginter
发布于 2016/03/23 16:41
字数 1448
阅读 228
收藏 0
  • 介绍

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

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

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



© 著作权归作者所有

Ginter
粉丝 1
博文 21
码字总数 11752
作品 0
成都
程序员
私信 提问
OpenCV/OpenCV3计算机视觉软件支持库和最新资源

OpenCV近几年随着视频设备的广泛使用,发展的非常之快。中国的大部分视频应用几乎都用了其中的代码。但是由于各种原因,OpenCV的资料却比较杂乱,本人基于学习和使用和一些经验体会,整理如下...

openthings
2015/09/23
958
0
Windows环境下编译OpenCV3.0和OpenCV_contrib

一、下载安装 OpenCV3.0下载地址:http://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.0.0/ OpenCVcontrib下载地址:https://github.com/Itseez/opencvcontrib cmake-gui下载......

moki_oschina
2016/11/24
14
0
opencv3.2.0在Mac上面编译成jar

网上查了一堆的资料,发现大家主要有三种方式在Mac上面编译opencv的jar: 使用brew编译 使用cmake手动编译 使用maven编译(类似手动) brew编译没有成功,另外两种都成功了。 brew编译 检查X...

亚林瓜子
2018/07/18
0
0
OPENCV 使用系列 JAVA入门 之搭建环境

我是一名java服务器开发者,今天我讲的是opencv 在服务器端的利用, 网上很多都是android NDK的 以及C++的 ,这些大体上是差不多,但是对初学者来说 就觉得 很难对照的学习 在java上怎么使用...

zhuyuping
2016/01/26
338
0
【OpenCV3图像处理】提取轮廓的凸包、外包矩形、最小外包矩形、最小外包圆

1、提取轮廓的凸包 convexhull()函数(点我看OpenCV3.2帮助文档) 函数调用形式: void convexhul(InputArray points,OutputArray hull,bool clockwise=false,bool returnPoints=true) 输入......

u011574296
2017/06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Feign Retryer的默认重试策略测试

1、Feign配置 @Configurationpublic class FeignConfig { @Value("${coupon_service.url:http://localhost:8081}") private String couponServiceUrl; @Bean publ......

moon888
16分钟前
1
0
关于不同域名下的session共享问题

如果登录,首页,分类,列表,产品都在不同的二级域名下,主域名不变,一定要保证里面的版本问题,不能为了更新而更新,这样哪个下面的session都访问不了。

dragon_tech
18分钟前
1
0
iOS 中文拼音互转(好东西记录一下)

PinYin4Objc

_____1____
26分钟前
1
0
fabric private data实战

Hyperledger Fabric private data是1.2版本引入的新特性,fabric private data是利用旁支数据库(SideDB)来保存若干个通道成员之间的私有数据,从而在通道之上又提供了一层更灵活的数据保护...

汇智网教程
26分钟前
1
0
es之聚合查询汇总

记录一下最近用到的es聚合查询,感觉常见的应该多遇上了,下午抽空更新

我真是小菜鸡
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部