Qt+opencv入门之 读取文件夹内图片并显示_qt 打开文件夹选择图片_爱飞的功夫熊猫的博客-程序员秘密

技术标签: qt  opencv  

Qt+opencv入门之 读取文件夹内图片并显示

做一个简单的Demo,用Qt实现读取文件夹内所有图片并显示

读取文件夹

1.在界面文件中放入push button

在这里插入图片描述在这里插入图片描述

在button上点击右键,转到槽,在mainWindow.cpp中生成相应的clicked函数
输入QString fileName=QFileDialog::getExistingDirectory(this,tr(“Open Image”),QDir::currentPath());
完成点击按钮选择文件夹,并将文件夹名称输入出的功能
输入cout<<fileName.toStdString()<<endl;将选择的文件夹名称打印到后台
在这里插入图片描述

QImage、Mat与QPixmap

图像的本质也是一种数据结构,例如彩色的图片,本质是一个三通道的二维数组,每个元素里放置的rgb三个通道的颜色分量的大小,在opencv中图像可以用Mat表示,在Qt中,图像用QImage和QPixmap表示,Mat可以与QImage相互转换,如
QImage qtImage(cvSrcImage.data,cvSrcImage.cols,cvSrcImage.rows,cvSrcImage.step,QImage::Format_RGB888);
当然,QImage也可以直接读取图片,如
string tempDir=":/images/f1.png";
QImage qtImage(tempDir.c_str());

QImage Image;
Image.load(":/images/f1.png");
将QImage转成QPixmap即可显示出图像
如QPixmap pixmap =QPixmap::fromImage(qtImage.rgbSwapped());
ui->label->setPixmap(fitpixmap);

下面是整体的代码流程

void MainWindow::on_fisheyeInn_clicked()
{
    
    QString fileName = QFileDialog::getExistingDirectory(this,
                                                         tr("Open Image"), QDir::currentPath()
                                                         );


    if (fileName.isEmpty())
    {
    
        cout << "Filepath is null" << endl;
    }
    else
    {
    
        vector<Mat> cvSrcImageArray;
        vector<QImage> qtSrcImageArray;
        cout<<Imagedir<<endl;
        Imagedir = fileName.toStdString();
        cout<<Imagedir<<endl;
       
        vector<cv::String> ImageName = getImageName(Imagedir);
        for(int i=0;i<ImageName.size();i++)
        {
    
            std::cout << "read image:" << ImageName[i] << std::endl;
            Mat cvSrcImage= imread(ImageName[i],1);
            cvSrcImageArray.push_back(cvSrcImage);
            //cvtColor(cvSrcImage,cvSrcImage,CV_BGR2RGB);//opencv定义的是BGR形式的,但Qt定义的是RGB形式的,要转一下
            //opencv的Mat与Qt的QImage转换
            //QImage qtImage(cvSrcImage.data,cvSrcImage.cols,cvSrcImage.rows,cvSrcImage.step,QImage::Format_RGB888);
            std::string tempDir=ImageName[i];
            cout<<tempDir<<endl;
            
            showImageQt(tempDir);
            waitKey(1000);
        }
        std::cout << "end read........\n" << std::endl;
    }
}


void MainWindow::showImageQt(string tempDir)
{
    
    QImage qtImage(tempDir.c_str());
    QPixmap pixmap   =QPixmap::fromImage(qtImage.rgbSwapped());
    int width = ui->label->width ();//要显示的宽度
    int height =ui->label->height();
    //QPixmap fitpixmap = pixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);  // 饱满填充
    QPixmap fitpixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    ui->label->setPixmap(fitpixmap);
    this->repaint();
    //getchar();
}

vector<String> getImageName(std::string ImageDir)
{
    
//用的opencv的方式去遍历文件夹中所有文件名字,这里也可以自己用stl写一下
    vector<String> Imagename;
    glob(ImageDir,Imagename);
    for(int i=0;i<Imagename.size();i++)
    {
    
        cout<<Imagename[i]<<endl;
    }

    return Imagename;
}

效果如下:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42229275/article/details/108532715

智能推荐

yolov5 6.0版本->onnx->ncnn +安卓部署 附加ncnn环境配置 保姆级详细教程_ncnn yolov5_xrh_的博客-程序员秘密

Windows下 yolov5 6.0版本转onnx转ncnn +安卓部署 附加ncnn环境配置 保姆级详细教程,踩了很多坑,基本是手把手将教你完成模型部署

电点国际化翻译系统,助力你开启海外项目之旅_roll圈圈的博客-程序员秘密

1、前言项目要走向国外市场,移动端Android和iOS,当然也包括后端和前端,需要进行国际化适配,但是之前的项目中是没有英文翻译文件的,所以需要将项目中所有的中文字符串进行收集交给专业的人士进行翻译,然后将翻译的英文内容分别整理到Android和iOS项目中去。无疑这是一个很繁琐且很容易出错的事情,而且后续在开发的过程中还会新增中文字符串,这个时候我们又需要重新走一遍上面的流程,哪怕只是新增了一个字符串!于是我们需要一个系统去专门处理这件事件,将功能开发和英文翻译这两件事分离开来,让专业的人士去做专业

有关Python的22个编程技巧,请收下!_python 如何对一个变量进行连续操作_Python_1_3的博客-程序员秘密

1. 原地交换两个数字Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:x,y= 10,20print(x,y)x,y= y,xprint(x,y)#1 (10, 20)#2 (20, 10)赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量 &lt;a&gt; 和 &lt;b&gt;...

zabbix5.0版本安装_Portzhu的博客-程序员秘密

zabbix5.0版本安装1:配置环境安装2:安装zabbix5.03:设置中文模式一:准备搭建系统环境centos7.6二:安装过程1:首先查看selinux是否关闭,没有关闭手动关闭# getenforce# vi /etc/selinux/conf //未关闭情况编辑关闭SELINUX=Disabled 修改为Disabled2:查看防火墙是否关闭# systemctl status firewalld# systemctl disable f

onedrive登陆以后是白板,OneDrive不能正常显示与设置_weixin_39958138的博客-程序员秘密

谢谢您的回复,很高兴您的问题看到曙光了。把所有除MS之外的程序都禁用,基本上不会影响系统的稳定性,反而可以排除一些影响系统稳定的第三方应用暂停。另外,您可以试试清除浏览器【已缓存的数据和文件】:【Internet Explorer】《在 Internet Explorer 中查看和删除浏览历史记录》https://support.microsoft.com/zh-cn/help/17438/......

随便推点

android des加密传输,android des加密和解密_Vani Town的博客-程序员秘密

加密方法:public String encryptDES(String encryptString, String encryptKey) throws Exception {IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);SecretKeySpec key = new SecretKeySpec(encryptKey.getB...

我的冒泡排序java代码+简单优化测试_FoolishBird-007的博客-程序员秘密

关于冒泡排序是什么怎么排序的我就不多赘述了,基本简单查找翻阅一下资料都可以弄明白,我这里是用冒泡排序的算法编写简单的java代码以及进行一些优化和之间的性能小评测。一、代码+讲解 (1)下面是一般的冒泡排序java代码: int arry[] = { 3, 2, 6, 8, 1, 9, 5 }; for (int i = 0; i &lt; arry.length; i++) { ...

360影视改版项目总结_养有道的博客-程序员秘密

项目简介360影视(v.360.cn)改版后,不仅在视觉上有了一个全新的体验,在频道划分及内容整合上,也做出了很大调整,希望能够成为一个具有高水准用户体验及全网资源最全的视频网站~下面就和大家分享一下在这个改版过程中的问题及收获吧.前期准备在拿到设计需求之后,作为一名设计师,前期的思考是非常重要的,远比后续的在表现形式上面的思考要重要的多.正确的思路和梳理决定了产品的方向.所以在前期和

学习Spark--(6)--高阶函数_spark高阶函数_七个馒头的博客-程序员秘密

Scala高级特性1. 高阶函数--1--概念Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数。在函数式编程语言中,函数是“头等公民”,把函数作为参数或者是返回值是函数叫高阶函数。高阶函数包含:作为值的函数、匿名函数、闭包、柯里化等等。--2-- 作为值的函数可以像任何其他数据类型一样被传递和操作的函数,每当你想要给算法传入具体动作...

深度学习系列(六):自编码网络的特征学习_on2way的博客-程序员秘密

在第三节我们已经介绍了 简单网络的自编码学习 知道了自编码学习其实就是学习到了输入数据的隐含特征,通过新的特征来表征原始数据,本节将介绍如何使用这些隐含特征进行模式分类; 还是以前面的三层自编码网络: 抽象一下如下: 其中学习到的权值系数W1与W1’是不一样的,我们把W1叫做编码权值,W1’叫做译码权值,原始数据在编码权值下的新数据Y就可以视为学习到了新维度下的数据,这在第三节也说

Ctrl+C可以复制,但是Ctrl+V不能粘贴_ctrl+c可以复制,但是ctrl+v不能粘贴__weixin_42402402的博客-程序员秘密

前两天装了Mathtype,最近才发现Ctrl+v不能复制了,原因是Mathtype插件中快捷键和这个冲突了,可以参考以下网址修改设置,就好了。link

推荐文章

热门文章

相关标签