• GOQTTemplate简单介绍


    集合OpenCV的视频功能和QCamera的摄像头接口,开发出易于理解的、结构简单的摄像头控制和采集框架。

     
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        timer   = new QTimer(this);
        imag    = new QImage();         // 初始化
        connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
        bMethod = false;//是否使用算法
        //填充界面控件
        const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras();
        for (const QCameraInfo &cameraInfo : availableCameras)
        {
              ui->comboCamera->addItem(cameraInfo.description());
        }
        ui->comboCamera->setCurrentIndex(0);
        bCameraOpen = false;
        //显示的图像自动缩放
        ui->label->setScaledContents(true);
        ui->label_2->setScaledContents(true);
    }
    在界面初始化的时候,就直接填充界面。注意这里setScaledContents的设置使得图像能够填充满整个窗体。
     
    另一个非常关键的一句就是

    connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
     
    相当于ontimer,非常直观吧。
    // 从摄像头中抓取并返回每一帧
    void MainWindow::readFarme()
    {   
        videocapture->read(matFrame);
        //是否图像处理
        Mat tmp;

        if(bMethod)//这里只是简单地实现一个Canny算法
        {
            cvtColor(matFrame,tmp,COLOR_BGR2GRAY);
            cv::Canny(tmp,tmp,100,255,3);
            cvtColor(tmp,matDst,COLOR_GRAY2BGR);
        }
        else
        {
            matDst = matFrame.clone();
        }
        // 格式转换
        QPixmap qpixmap = Mat2QImage(matDst);
        // 将图片显示到label上
        ui->label->setPixmap(qpixmap);
    }
     
    这里使用了Mat2QImage函数,将图像转换为qpixmap,并且显示在label上
     

    //打开磁盘上的图片
    void MainWindow::on_pushButton_clicked()
    {
         //第3个参数表示查找文件时从哪个目录开始,如果为"."的话,表示从该工程目录开始查找,最后那个参数的过滤器的名字之间
         //要用空格,否则识别不出来
         QString img_name = QFileDialog::getOpenFileName( this, tr("Open Image"), ".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
         if(img_name == "")
             return;
         //toAscii()返回8位描述的string,为QByteArray,data()表示返回QByteArray的指针,QByteArray为字节指针
         //现在已改为toLatinl函数
         Mat src = imread(img_name.toLatin1().data());
         cvtColor( src, src, CV_BGR2RGB );
         QImage img = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
         ui->label->setPixmap( QPixmap::fromImage(img) );
         img_name.clear();
    }
     
    可以直接使用函数,打开磁盘上的图片。
     
    //打开摄像头
    void MainWindow::on_pushButton_OpenCam_clicked()
    {
        int i = ui->comboCamera->currentIndex();
        //打开摄像头,从摄像头中获取视频
        if(bCameraOpen)
        {
             videocapture->release();//kill camera first
        }
        videocapture  = new VideoCapture(i);
        bCameraOpen = true;
        //这里给出了一个非常大的分辨率,如果摄像头没有这么大的分辨率,则会默认打开其支持的最大分辨率
        videocapture->set(CV_CAP_PROP_FRAME_WIDTH, 2592);
        videocapture->set(CV_CAP_PROP_FRAME_HEIGHT, 1944);
        // 开始计时,超时则发出timeout()信号
        timer->start(0);
    }
    摄像头的打开也非常直接。
     
     

    添加了一些修改,使用QT来做,真的是非常方便:

    项目地址:

     https://github.com/jsxyhelu/GOQTTemplate3

    欢迎提出宝贵意见。



  • 相关阅读:
    设计模式的原则和法则
    GoF的23种设计模式分类和功能
    2020年智慧电力解决方案
    【转载】「黑科技」智能防疫消毒机器人 技术方案介绍-disinfection robot
    【转载】如何让电力巡检机器人项目落地
    30多张图来了解Keil5的使用
    [数学学习与代码]最小二乘法--多元线性方程求解
    MTK-LCM 屏幕使用fbconfig/PanelMaster来调试LCM驱动
    MTK 使用iptable 命令来完成网络路由(android WIFI/4G分享网络)
    MTK(android init.rc) 写一个开机启动的服务
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/10316989.html
Copyright © 2020-2023  润新知