怎么用C++ OpenCV制作电子相册查看器
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍"怎么用C++ OpenCV制作电子相册查看器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么用C++ OpenCV制作电子相册查看器"文章
千家信息网最后更新 2025年01月19日怎么用C++ OpenCV制作电子相册查看器
这篇文章主要介绍"怎么用C++ OpenCV制作电子相册查看器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么用C++ OpenCV制作电子相册查看器"文章能帮助大家解决问题。
一、图片读取
我们想要一张张的查看文件夹下的图片,第一步就得读取将该文件夹下的所有图片。
如上图所示,为我创建的文件夹,该文件夹下有14张图片。接下来我们就编写代码读取该文件夹下的所有图片。将读取到的图片存储在images容器。
//读取文件夹下所有图片 string filename = "images"; vectorimageList; glob(filename, imageList); vector images; for (int i = 0; i < imageList.size(); i++) { Mat img = imread(imageList[i]); images.push_back(img); }
现在我们已经有了images容器,其实再使用一个for循环就能够一张张读取容器里的图片了。不过这样只能一张张往下读取,直到读取完最后一张图片程序结束。本案例的需求是使用键盘按键"->"向后读取,"<-"向前读取。
二、图片展示
我们需要一张白色的画布用来放置图片。为了将所有图片都居中在画布中显示,令画布中心为(cx,cy),当前图片宽width,高height。则该图片相对于画布起点为(x,y)。如下图所示。
//将每一张照片放置画布中心 int x = cx - (width / 2); int y = cy - (height / 2); //将照片抠图到画布上,此时照片位于画布中心位置 images[index].copyTo(bg(Rect(x, y, width, height)));
在这里,使用一个判断语句,判断当前图片尺寸是否大于画布尺寸。如果当前图片尺寸大于画布尺寸,则将图片自适应剪切。否则的话,会造成内存溢出。
//如果图片过大,则对其进行裁剪 if (width > canvas.cols || height > canvas.rows) { //进行自适应剪切,每次只在原基础上剪切百分之八十 while (true) { resize(images[index], images[index], Size(0, 0), 0.8, 0.8, INTER_LINEAR); if (images[index].cols < canvas.cols&&images[index].rows < canvas.rows) { break; } } width = images[index].cols; height = images[index].rows; }
三、键盘控制
根据上述代码我们已经可以将图片显示在画布中心了,接下来就需要使用键盘响应事件控制图片查看。
我们使用方向键"->"控制向下查看,"<-"控制向上查看。具体请看源码注释。
if (key == 2424832) { //如果按动键盘'←'键,则向前查看相片 if (index > 0)//如果图片不是图库中第一张,则允许向前查看 { cout << "←" << endl; index--; } } else if (key == 2555904) { //如果按动键盘'→'键,则向后查看相片 if (index < size-1)//如果图片不是图库中最后一张,则允许向后查看 { cout << "→" << endl; index++; } } //如果按动键盘'ESC'键,则退出程序 else if (key == 27) { break; }
四、效果显示
如上图所示,至此我们已经完成了案例所想要的效果。请参考源码,注释也比较详细了。
五、源码
#include#include using namespace std;using namespace cv;int main(){ //读取文件夹下所有图片 string filename = "images"; vector imageList; glob(filename, imageList); vector images; for (int i = 0; i < imageList.size(); i++) { Mat img = imread(imageList[i]); images.push_back(img); } //创建画布,用于放置相片 Mat canvas = Mat(Size(1400, 900), CV_8UC3, Scalar::all(255)); //画布中心 int cx = canvas.cols / 2; int cy = canvas.rows / 2; int size = images.size();//图库中相片数量 int index = 0; //当前图库中相片索引 while (true) { //waitKey无法正常捕捉方向键(上下左右),故使用waitKeyEx int key = waitKeyEx(0); if (key == 2424832) { //如果按动键盘'←'键,则向前查看相片 if (index > 0)//如果图片不是图库中第一张,则允许向前查看 { cout << "←" << endl; index--; } } else if (key == 2555904) { //如果按动键盘'→'键,则向后查看相片 if (index < size-1)//如果图片不是图库中最后一张,则允许向后查看 { cout << "→" << endl; index++; } } //如果按动键盘'ESC'键,则退出程序 else if (key == 27) { break; } //将画布拷贝一份,每经一次循环,更新一次图片。 Mat bg = canvas.clone(); //计算每一张图片的宽高 int width = images[index].cols; int height = images[index].rows; //如果图片过大,则对其进行裁剪 if (width > canvas.cols || height > canvas.rows) { //进行自适应剪切,每次只在原基础上剪切百分之八十 while (true) { resize(images[index], images[index], Size(0, 0), 0.8, 0.8, INTER_LINEAR); if (images[index].cols < canvas.cols&&images[index].rows < canvas.rows) { break; } } width = images[index].cols; height = images[index].rows; } //将每一张照片放置画布中心 int x = cx - (width / 2); int y = cy - (height / 2); //将照片抠图到画布上,此时照片位于画布中心位置 images[index].copyTo(bg(Rect(x, y, width, height))); imshow("Demo", bg); } destroyAllWindows(); system("pause"); return 0;}
关于"怎么用C++ OpenCV制作电子相册查看器"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
图片
画布
文件
文件夹
键盘
照片
剪切
图库
尺寸
控制
电子
电子相册
相册
C++
制作
容器
源码
相片
知识
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发的前端是
网络安全鸟巢技术
网络安全案例分析试题及答案
在jsp页中遍历数据库
网络安全模式播放声音
服务器格式
广州金不换网络技术有限公司
图像专用服务器
2019第六届网络安全周
定义数据库全局逻辑结构的是
网络安全管理规定个人
2019全区网络安全宣传周
简述ieee数据库的功能
数据库删除后还能查到
网络技术培训政法
网易暴雪服务器
dz数据库修改密码
数据库技术主要运用
计算机软件开发的考研与工作
网络安全与政务服务平台
适合软件开发的内存条和硬盘
信阳软件开发公司电话
软件开发薪水能达到多少钱
mysql数据库时区
电脑如何网络安全模式开机
心跳检测软件开发
武汉赛虎网络安全
公安局网络安全大练兵
苹果服务器是什么系统
要安装kali用什么云服务器