OpenCV学习笔记基础篇(二):图像窗口创建、滑动条创建、图片的保存

前言:

笔者目前在校本科大二,有志于进行计算机视觉、计算机图形学方向的研究,准备系统性地、扎实的学习一遍OpenCV的内容,故记录学习笔记,同时,由于笔者同时学习数据结构、机器学习等知识,会尽量根据自己的理解,指出OpenCV的应用,并在加上自己理解的前提下进行叙述。
若有不当之处,希望各位批评、指正。


本篇学习内容:

1.图像窗口创建、滑动条创建
2.图片的保存


1.图像窗口创建、滑动条创建

1.1 图像窗口创建

上次提到,在调用imshow()函数的时候,如果没有在此之前创建同名的窗口,就会以WINDOW_AUTOSIZE标志创建一个窗口,显示图像的原始大小;如果创建了图像窗口,那么会缩放图像以适应窗口属性。
然而在进行多窗口的任务时,可能需要给不同的窗口适配不同的模式。所以,我们可以通过namedWindow()来创建窗口。
在本篇及以后,在提及新函数时,会将函数原型单独写在一个代码块中。

void cv::namedWindow	(	
const String & 	winname,
int 	flags = WINDOW_AUTOSIZE )

第一个参数:窗口名
第二个参数:窗口模式。OpenCV提供了多种窗口模式,下面贴一下官方文档截图。在这里插入图片描述
做一些介绍:
WINDOW_NORMAL代表可以随意缩放图像窗口。
WINDOW_AOTOSIZE是默认模式,窗口大小与输入图像一致。
WINDOW_OPENGL支持OPENGL。
WINDOW_FULLSCREEN全屏化窗口。
有个奇怪的地方,我在实际测试时,WINDOW_FULLSCREEN并没有让窗口全屏化,WINDOW_KEEPRATIO也没有限制长宽的比例。
然而这并不要紧。WINDOW_FULLSCREEN的操作可以通过setWindowProperty()函数代替。代码如下:

	namedWindow("test01",WINDOW_NORMAL);
	Mat a = imread("E:/program/x.jpg");
	imshow("test01", a);
	setWindowProperty("test01", WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN);
	waitKey(0);

注意在创建窗口时要指定WINDOW_NORMAL,不然还是无法全屏。
WINDOW_KEEPRATIO之类的奇奇怪怪的操作也可以通过resizeWindow()等来解决。所以这里暂且不管namedWindow()中发生的奇怪事件。当然,如果有知道的读者,还请在下方留言原因,多谢!

1.2 滑动条创建

利用createTrackbar()函数来创建滑动条。该函数原型如下:

int cv::createTrackbar	(
const String & 	trackbarname,
const String & 	winname,
int * 	value,
int 	count,
TrackbarCallback 	onChange = 0,
void * 	userdata = 0 )	

· 第一个参数:滑动条的名字。
· 第二个参数:窗口的名字,即代表该滑动条会依附到哪个窗口上。
· 第三个参数:表示滑块的位置。初始位置就是该变量当前的值。
· 第四个参数:滑块可以达到的最大位置的值。最小值始终为0。
第五、第六较为复杂:在这里插入图片描述
· 第五个参数:指向回调函数的指针。且这个函数原型必须为void XXXX(int,void*)。这里的void*就是用户数据。
· 第六个参数:用户传给回调函数的数据。如果value实参是全局变量,则不必管这个参数。同样,使用这个参数就不必使用全局变量。
函数回调对于我这个大二学生来说确实是比较陌生的事情。但是联系一下进程的创建,进程调用的函数也是以类似的形式创建的。不管怎么说,还是举例为好:

Mat img1, img2, dst;//准备Mat类型
double img_Alpha, img_Beta;//addWeighted中需要用到的输入值
int img_AlphaSlider;//滑动条的值
void on_Trackbar(int, void*) {
	img_Alpha = (double)img_AlphaSlider / 100;//现在的Alpha值
	img_Beta = 1.0 - img_Alpha;//现在的Beta值
	addWeighted(img1, img_Alpha, img2, img_Beta, 0.0, dst);
	//dst = src1*alpha + src2*beta + gamma;这里设置gamma=0
	imshow("test02", dst);
}
int main(){
	img1 = imread("E:/program/x.jpg");
	img2 = imread("E:/program/z.jpg");
	img_AlphaSlider = 10;//滑动条初始值
	namedWindow("test02", WINDOW_NORMAL);
	//滑动条最大值为100,第五个参数没有设置
	createTrackbar("Value", "test02", &img_AlphaSlider, 100, on_Trackbar);
	waitKey(0);
	return 0;
	}

输出结果如下:
在这里插入图片描述
在这里插入图片描述
代码块中,addWeighted()是一个图像合成的函数,这里先不过多介绍。

2.图片的保存

2.1 图片的保存

保存图片用到的函数为imwrite()。函数原型如下:

bool cv::imwrite	(	
const String & 	filename,
InputArray 	img,
const std::vector< int > & 	params = std::vector< int >() )	

· 第一个参数为保存的文件名
· 第二个参数为要保存的图片。前篇说过,InputArray可以暂且当做Mat来看。
· 第三个参数是保存图片的一个参数,用法比较奇特。要传入一个vector类型的参数。
先贴上第三个参数的某些选项:
在这里插入图片描述
在这里插入图片描述
比如说,IMWRITE_JPEG_QUALITY这个参数表示从0-100的图片质量,默认值为95。
举个例子:

	Mat a = imread("E:/program/x.jpg");
	vector<int> p;
	p.push_back(IMWRITE_JPEG_QUALITY);
	p.push_back(95);
	imwrite("E:/program/x95.jpeg",a,p);
	vector<int> q;
	q.push_back(IMWRITE_JPEG_QUALITY);
	q.push_back(5);
	imwrite("E:/program/x5.jpeg",a,q);
	return 0;

输出结果如下:
在这里插入图片描述
可以看到,右边的图像相较于左边,确实质量差很多。

参考文献:

  1. OpenCV官方文档:https://docs.opencv.org/4.x/
  2. 《OpenCV3编程入门》毛星云、冷雪飞等编著
  3. 《OpenCV4快速入门》冯振、郭延宁、吕跃勇著
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值