HighGUI图像用户界面初步(滑动条、鼠标操作)

这篇博客介绍了OpenCV的HighGUI模块,讲解了Mat类、图像载入、显示、输出函数的使用,以及如何创建窗口。重点讲述了滑动条的创建与使用,包括createTrackbar()函数和getTrackbarPos()函数,还讨论了鼠标操作,如何设置鼠标回调函数SetMouseCallback进行交互。示例中通过滑动条控制图像混合,展示了OpenCV中动态参数调整的实用性。
摘要由CSDN通过智能技术生成

1.Mat类简析

  Mat类是用于保存图像以及其他矩阵数据的数据结构,默认尺寸为 0 ,我们也可以指定其初始尺寸,比如定义一个Mat类对象,就要写:

	cv::Mat pic(320,640,cv::Scalar(100));

2.图像的载入:imread()函数

  其用于读取图片到OpenCV中。其原型如下:

	Mat imread(const string& filename, int flag = 1);

  1)第一个参数:填我们需要载入的图片路径名。
  2)第二个参数:flag 为载入标识,它指定一个加载图像的颜色类型,自带默认值 1,表示载入三通道的彩色图像。这个参数可以在OpenCV中标识图像格式的枚举中取值:

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 通道的加载图像

	Mat src1 = imread("6.jpg",2|4);		//载入无损的源图像
	Mat	src2 = imread("6.jpg",0);		//载入灰度图
	Mat	src3 = imread("6.jpg",1);		//载入3通道的彩色图像

	imshow("无损图像", src1);
	imshow("灰度图", src2);
	imshow("3通道图", src3);

3.图像的显示:imshow()函数

  imshow()函数用于在指定的窗口中显示一副图像,原型如下:

	void imshow(const string& winname, InputArray mat);

  ●第一个参数:const string& 类型的 winname,填需要显示的窗口名称标识
  ●第二个参数,InputArray:InputArray 类型的 mat ,填需要显示的图像
  imshow 函数用于在指定的窗口中显示图像,如果窗口是用 CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原大小。否则,将图像进行缩放以适合窗口。而 imshow 函数缩放图像,取决于图像的深度。具体如下:
  ●如果载入的图像是8位无符号类型,就显示图像原来的样子。
  ●如果图像是16位无符号类型或32位整型,便用像素值除以256,也就是说,值的范围是[0,255 x 256] 映射到 [0,255]。
  ●如果图像是32位浮点型,像素值便要乘以255,也就是说,该值的范围是[0,1]映射到[0,255]。

4.创建窗口:namedWindow()函数

  nameWindow 函数用于创建一个窗口,若是简单地进行图片显示,可直接用 imshow 函数读入图片指定窗口名,但若要在显示窗口之前就用到窗口名时,就需要 nameWindow 函数先创建出窗口,显示的规定窗口的名称了。
  nameWindow 的函数原型如下:

	void nameWindow(const string& winname, int flags = WINDOW_AUTOSIZE)

  1)第一个参数:const string& 型的 name ,填写被用作窗口的标识符的窗口名称。
  2)第二个参数:int 类型的 flags,窗口的表示,可以填如下几种值。
  ● CV_WINDOW_NORMAL,设置这个值,用户可以改变窗口的大小(没有限制)。
  ● CV_WINDOW_AUTOSIZE,设置这个值,窗口大小会自动调整以适应现实的图像,并且用户不能手动改变窗口大小。
  ● CV_WINDOW_OPENGL,设置这个值,窗口创建的时候会支持 OpenGL。
  namedWindow 函数有默认值 CV_WINDOW_AUTOSIZE,所以一般情况下,这个函数填一个变量就行。namedWindow 函数的作用是通过指定的名字,创建一个可以作为图像和进度条的容器窗口,如果具有相同名称的窗口存在,则函数不做任何事。可调用 destoryWindow() 或者 destoryAllWindow() 函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。
  但事实上,对于代码量不大的程序,没必要手动调用函数回收空间,因为在退出时,所有的资源和应用程序的窗口就会被操作系统自动关闭。

5.输出图像到文件:imwrite()函数

  声明如下:

bool imwrite(const string& filename, InputArray img, const vector<int>& params = vector<int>() );

  1)第一个参数:const string& 类型的 filename ,填写要写入的文件名。注意要带上后缀,如 “123.jpg”。
  2)第二个参数,InputArray 类型的 img,一般填一个 Mat 类型的图像数据。
  3)第三个参数,const vector& 类型的 params,表示为特定格式保存的参数编码。它有默认的 vector() ,所以一般情况下不需要填写,若要填写的话:
  ● 对于 JPEG 格式的图片,这个参数表示从 0 到 100 的图片质量(CV_IMWRITE_HEPG_QUALITY),默认值是 95。
  ● 对于PNG 格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从 0 到 9,较高意味着更小的尺寸和更长的压缩时间,默认值是 3。
  ● 对于PPM,PGM,或 PBM 格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为 0 或 1,默认值是 1。

  imwrite 函数用于将图像保存到指定的文件。图像的格式是基于拓展名的,可保存的拓展名和 imread 中可以读取的图像拓展名一致。

  以下是一个示例--------在 OpenCV 中生成一副 png 的图片,并写入到当前工程目录下。

#include<opencv2/opencv.hpp>
#include<vector>

using namespace cv;
using namespace std;

void createAlphaMat(Mat &mat) {
   
	for (int i = 0; i < mat.rows; ++i) {
   
		for (int j = 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值