怎么用C++ OpenCV制作电子相册查看器
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"怎么用C++ OpenCV制作电子相册查看器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么用C++ OpenCV制作电子相册查看器"文章
千家信息网最后更新 2026年11月03日怎么用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安全错误
数据库的锁怎样保障安全
耶加雪菲
涨乐互联网科技
奇酷互联网科技公司
未来的互联网科技
致聘互联网科技
兼蜜互联网科技
互联网前沿科技
重庆科技学院互联网
太原新华互联网科技学校怎么样
互联网公司会议桌创意科技软装饰
银川新华互联网科技学校地址
全球顶尖互联网科技公司
互联网和黑科技的看法
昭通互联网科技选哪家
华夏互联网科技业
玉溪互联网科技怎么选
佛山市翊博互联网络科技有限公司
互联网营销推广黑科技
互联网领先科技活动
每日互联网科技新闻
咖啡
互联网科技公司电话
互联网科技公司官网
狮子座互联网科技有限公司
恒生科技互联网指数分析
如何创新互联网科技
高科技互联网发展前景如何
徐州市互联网科技有限公司
互联网科技平台产品运营
安徽九吞吴互联网科技有限公司