QT 获取视频帧Opencv获取清晰度

news2024/9/28 3:43:03

先展示结果:

1.获取摄像头的分辨率

    mResSize.clear();
    mResSize = camera_->supportedViewfinderResolutions();
    ui->comboBox_resulation->clear();
    int i=0;
    foreach (QSize msize, mResSize) {
        qDebug()<<msize;
        ui->comboBox_resulation->addItem(QString::number(msize.width(),10)+"*"+QString::number(msize.height(),10), i++);
    }  //摄像头支持分辨率打印

2. 拍照 

2.1 保存图片

void MainWindow::processCapturedImage(int request_id, const QImage &img)
{
    i++;
    isDirExist("D://capture");
    img_name = "D://capture//" +QString::number(i) +".png";
    //qDebug() << "img_name :" << QString::fromStdString(img_name);
    qDebug() << "img_name :" << img_name;

    img.save(img_name);
}

2.2 判断目录是否存在

bool MainWindow::isDirExist(QString fullPath)
{
    QDir dir(fullPath);
    if(dir.exists())
    {
      return true;
    }
    else
    {
       bool ok = dir.mkpath(fullPath);//创建多级目录
       qDebug() << "success create";
       return ok;
    }
}

 3.获取4个角上的亮度与中间亮度

    cv ::Mat image= surface_->matimage();  //从视频帧获取每一帧图片
    cvtColor(image, image, CV_RGBA2GRAY);
    cv::Mat img_1,img_2,img_3,img_4,img_center;
    //cout << " image ::" << image.size() << endl;
    int widgh = image.cols;
    int height = image.rows;
    qDebug() << "weight = " << widgh << " height = "<< height;

    cv::Rect rec_1(0,0,100,100);
    cv::Rect rec_2(0,height-100,100,100);
    cv::Rect rec_3(widgh-100,0,100,100);
    cv::Rect rec_4(height-100,height-100,100,100);
    cv::Rect rec_center(height/2-50,widgh/2-50,100,100);

    img_1 = image(rec_1);
    cv::Scalar graysca_1 = mean(img_1);
    float graylight_1 = graysca_1.val[0];
    qDebug() << "左上 == " << graylight_1 << endl;

    QString str_1 = QString::number(graylight_1,'f',2);
    str_1 = tr("%1").arg(str_1);
    //qDebug() << "str_1 == " << QString::fromStdWString(str_1) ;
    //ui->label_leftup->setText(str_1);


    img_2 = image(rec_2);
    cv::Scalar graysca_2 = mean(img_2);
    float graylight_2 = graysca_2.val[0];
    qDebug() << "左下 == " << graylight_2 << endl;

    QString str_2 = QString::number(graylight_2,'f',2);
    str_2 = tr("%1").arg(str_2);
   // qDebug() << "str_2 == " << QString::fromStdWString(str_2) ;
   // ui->label_leftdown->setText(str_2);

    img_3 = image(rec_3);
    cv::Scalar graysca_3 = mean(img_3);
    float graylight_3 = graysca_3.val[0];
    qDebug() << "右上 == " << graylight_3 << endl;

    QString str_3 = QString::number(graylight_3,'f',2);
    str_3 = tr("%1").arg(str_3);
    //qDebug() << "str_3 == " << QString::fromStdWString(str_3) ;
    //ui->label_rightup->setText(str_3);

    img_4 = image(rec_4);
    cv::Scalar graysca_4 = mean(img_4);
    float graylight_4 = graysca_4.val[0];
    qDebug() << "右下 == " << graylight_4 << endl;

    QString str_4 = QString::number(graylight_4,'f',2);
    str_4 = tr("%1").arg(str_4);
    //qDebug() << "str_4 == " << QString::fromStdWString(str_4) ;
    //ui->label_rightdown->setText(str_4);

    img_center = image(rec_center);
    cv::Scalar graysca_center = mean(img_center);
    float graylight_center = graysca_center.val[0];
    qDebug() << "中间 == " << graylight_center << endl;

    QString str_center = QString::number(graylight_center,'f',2);
    str_center = tr("%1").arg(str_center);

4. 清晰度 

        image = QImage2cvMat(img); //Qimage 转换成cv::Mat

        cvtColor(image, image, CV_BGR2RGB);
        Laplacian(image, imageSobel, CV_16U);
        //Sobel(image, imageSobel, CV_16U, 1, 1);

        //图像的平均灰度
        meanValue = cv::mean(imageSobel)[0];
        meanValue = QString::number(meanValue,'f',1).toDouble();

        //qDebug()<<"meanValue == " << meanValue ;

5. 重新开启摄像头

void MainWindow::on_pushButton_open_clicked()
{
    camera_ = new QCamera;
    surface_ = new MyVideoSurface(this);
    camera_->setViewfinder(surface_);

    image_capture = new QCameraImageCapture(camera_);
    connect(image_capture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(processCapturedImage(int, QImage)));

    connect(surface_,&MyVideoSurface::sendsharpness,this,&MainWindow::updatesharpness);

    connect(ui->pushButton_pic,&QPushButton::clicked,this,&MainWindow::pushButton_pic_click);

    //connect(ui->pushButton_getlight,&QPushButton::clicked,this,&MainWindow::pushButton_pic_click);
    connect(ui->pushButton_getlight,&QPushButton::clicked,this,&MainWindow::pushButton_getlight_clicked);
    camera_->start();
    SetFrameResolution();
}

6. 获取某一点的RGB值 

        QColor clrCurrent( img.pixelColor( 50, 175 ) );

        qDebug()  << "00 red == " << clrCurrent.red() << "green == "
        << clrCurrent.green() << " blue  == " << clrCurrent.blue();

 7. 每一帧的摄像头数据

bool MyVideoSurface::present(const QVideoFrame &frame) //每一帧摄像头的数据,都会经过这里
{
    if (surfaceFormat().pixelFormat() != frame.pixelFormat() || surfaceFormat().frameSize() != frame.size()) {
        setError(IncorrectFormatError);
        stop();
        return false;
    }
    currentFrame_ = frame;  //获取每一帧数据
    widget_->repaint(targetRect_);
    return true;
}

源码:QT摄像头获取每一帧图像数据以及opencv获取清晰度资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.27作业

顺序表 SeqList.h #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> #include<memory.h> #include<stdlib.h> #include<string.h> using namespace std;//封装一个顺序表 template <typename T> class SeqList { private:T *ptr; …

如何高效精准地管理商标官文?

商标官文涵盖了商标从申请注册到后续维护的各个阶段所涉及的官方文件&#xff0c;如受理通知书、审查意见通知书、商标注册证等。这些官文不仅是商标权利的重要凭证&#xff0c;更是企业了解商标状态、应对各种情况的重要依据。有效的商标官文管理能够确保企业及时掌握商标动态…

Redis的数据类型和编码方式

目录 数据类型&#xff1a;编码方式String&#xff1a;hash&#xff1a;list&#xff1a;set&#xff1a;zset&#xff1a; 通过这个指令可以看到底层实现 数据类型&#xff1a; Redis底层实现上述数据结构的时候&#xff0c;会在源码层面&#xff0c;针对上述实现进行优化&am…

【Java】—— 多线程:随堂复习

目录 1. 几个概念 2. 如何创建多线程&#xff08;重点&#xff09; 3. Thread类的常用方法、线程的生命周期 4. 如何解决线程安全问题(重点、难点) 5. 同步机制相关的问题 6. 线程间的通信 1. 几个概念 程序(program)&#xff1a;为完成特定任务&#xff0c;用某种语言编…

NSSCTF [HUBUCTF 2022 新生赛]simple_RE(变种base64编码)

文件无壳 拖入IDA中 shiftF12查看可疑字符串 发现两串字符串 一看这两个等于号就猜测是base64编码 进入主函数看看 这段代码是一个简单的 C 语言程序&#xff0c;主要功能是接受用户输入的字符串作为“flag”&#xff0c;然后通过对输入的字符串进行一些处理和比较来验证是否输…

双十一购物节:五大必买爆款科技好物,让你省钱又省心

双十一购物节&#xff0c;作为中国最大的在线购物狂欢节&#xff0c;每年都吸引着无数消费者的眼球。在这个购物盛宴中&#xff0c;科技产品因其创新性、实用性和高性价比而成为消费者关注的焦点。随着科技的飞速发展&#xff0c;越来越多的智能设备走进了我们的生活&#xff0…

SOCKS5代理和HTTP代理哪个快?深度解析两者的速度差异

在现代互联网环境中&#xff0c;使用代理IP已经成为了许多人日常生活和工作的必备工具。无论是为了保护隐私&#xff0c;还是为了访问某些特定资源&#xff0c;代理IP都扮演着重要的角色。今天&#xff0c;我们就来聊聊SOCKS5代理和HTTP代理&#xff0c;看看这两者到底哪个更快…

什么是去中心化金融(DeFi)?

什么是去中心化金融&#xff08;DeFi&#xff09;? 传统金融特点是&#xff1f; 有中心化机构提供服务 银行 、 保险公司 、政权公司 、 基金管理公司 特点 保管用户的资产&#xff1a; 可冻结用户的账户&#xff0c;操作用户的资产作为交易中介&#xff1a; 审查交易制定…

Redis篇(Java操作Redis)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;Jedis Github 一、创建项目、 二、添加依赖 三、配置文件 四、Java连接Redis 五、通过Redis连接池获取连接对象并操作服务器 六、封装JedisUtil对外提供连接对象获取方法 七、Java操作Redis五种数据类型 1. 连接与释放…

IoT网关的主要功能有哪些?天拓四方

在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;技术凭借其独特的优势&#xff0c;逐渐在各个领域展现出强大的生命力。而IoT网关&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;其在物联网体系中的作用愈发凸显。 一、数据聚合与预处理…

qt 高并发编程及同步

高并发编程是指在同一时间处理多个任务的能力&#xff0c;通常用于提升应用程序的性能和响应速度。Qt提供了一系列强大的工具和类来实现高并发编程&#xff0c;包括多线程、异步编程和任务调度。 一、继承QThread #include <QThread>class Worker : public QThread {voi…

基于springcloud的药品销售系统

文未可获取一份本项目的java源码和数据库参考。 一、选题背景与意义 1. 选题背景 在日常医药管理中&#xff0c;面对众多的药品和众多不同需求的顾客&#xff0c;每天都会产生大量的数据信息。以传统的手工方式来处理这些信息&#xff0c;操作比较繁琐&#xff0c;且效率低下…

重头开始嵌入式第四十四天(硬件 ARM裸机开发)

目录 裸机开发 一、开发背景 二、开发特点 三、开发流程 四、应用领域 使用的软件硬件 软件&#xff1a;keil 硬件&#xff1a;三星S3C2440A JTAG 开发原理 ​编辑 开发步骤 ​编辑 点亮小灯 按键控制亮灭 裸机开发 ARM 裸机开发是指在没有操作系统的情况…

CUDAExample: 波纹示例

需要用到的已经封装好的辅助类&#xff1a; CPUAnimBitmap 定义个grid 和 block 的维度都是二维的 #include"cpu_anim.h" #include "cuda_runtime.h" #include <device_launch_parameters.h>#define DIM 512 static void CheckCudaErrorAux(const …

numpy is not available

在测试第一个程序的时候&#xff0c;出现Numpy is not available的错误&#xff0c;根据博客的办法知道是因为numpy与pytorch版本不一致造成的。 安装的时候&#xff0c;安装的是最新版的numpy&#xff0c;检查numpy的版本为2.1.1版。 根据pytorch与numpy版本对应表。我的pyt…

【Python报错已解决】NameError: name ‘torchvision‘ is not defined

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

AI知识库如何重塑电商行业的产品推荐系统

在数字化浪潮的推动下&#xff0c;电子商务行业正经历着前所未有的变革。其中&#xff0c;产品推荐系统作为连接消费者与商品的桥梁&#xff0c;其智能化与个性化水平直接影响着用户体验、转化率乃至整个平台的竞争力。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&a…

大豆重测序-文献精读53

Natural variation in GmSW17 controls seed size in soybean GmSW17的自然变异控制大豆种子的大小 摘要 种子大小/重量在决定作物产量中起着重要作用&#xff0c;但在大豆中&#xff0c;仅有少数控制种子大小的基因被鉴定出来。在本研究中&#xff0c;我们进行了全基因组关联…

Java项目——苍穹外卖总结

附上本人代码连接&#xff1a;xiaoming325/sky-take-out (github.com) 项目概述 此项目是一个外卖点餐项目&#xff0c;分为商家端&#xff08;管理员端&#xff09;和用户端&#xff0c;商家端是一个网站&#xff0c;用户端是一个微信小程序&#xff0c;由于微信小程序没有上…

Java ERP管理系统源码解析:微服务架构实践Spring Cloud Alibaba与Spring Boot

在当今数字化浪潮的推动下&#xff0c;企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的鸿鹄ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、S…