【opencv学习之五】opencv调用摄像头用Qt的UI显示

本文介绍如何使用Qt与OpenCV结合实现摄像头图像的实时捕获及处理,并展示了完整的代码示例。通过Qt的UI展示OpenCV处理后的图像结果,实现了简单而实用的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当用到opencv与Qt结合时候,需要用Qt的UI显示opencv的结果或者效果,所以以下做了简单的Qt的UI。在这之前用Qt的capture总是找不到如何获取摄像头的帧,但是opencv的方法很简单就可以获取摄像的帧,方便实时处理图像信息。

以下是代码:

mianwindow.h代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "cv.h"
#include "highgui.h"
#include <QTime>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void cameraopen();
    //声明函数

private:
    Ui::MainWindow *ui;

     QTimer *timer;
    //QTimer 计时用;

    IplImage* pFrame;
    //申请IplImage类型指针,就是申请内存空间来存放每一帧图像

    CvCapture *cam;
    // 视频获取结构, 用来作为视频获取函数的一个参数

};

#endif // MAINWINDOW_H

 

mianwindow.cpp代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    //初始化timer

    cam = NULL;
    // 初始化cam

    connect(timer, SIGNAL(timeout()), this, SLOT(cameraopen()));
    // 时间到,读取当前摄像头信息,这个必须加,因为timer需要配合timeout()信号用
    //没有的话会出现错误;
    //另外注意自己有没有野指针,有的话常常会
    //出现Program Files (x86)\SogouInput\7.2.0.2124\程序异常终止,这样的错误

}

MainWindow::~MainWindow()
{
    delete ui;
    cvReleaseCapture(&cam);
    //释放内存;
}

void MainWindow::cameraopen()
{
    pFrame = cvQueryFrame(cam);
    // 从摄像头中抓取并返回每一帧

    QImage image((const uchar*)pFrame->imageData, pFrame->width, pFrame->height,QImage::Format_RGB888);
    // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。

    QGraphicsScene *scene = new QGraphicsScene;
    //创建图片显示方式的容器

    scene->addPixmap(QPixmap::fromImage(image));
    //装载图片

    ui->graphicsView->setScene(scene);
    //显示图片,自动添加滚动条

    ui->graphicsView->show();
    //显示图片

}

void MainWindow::on_pushButton_clicked()
{
    cam = cvCreateCameraCapture(0);
    //打开摄像头,从摄像头中获取视频

    timer->start(33);
    // 开始计时,超时则发出timeout()信号
}

void MainWindow::on_pushButton_2_clicked()
{
    timer->stop();
    // 停止读取数据。

    cvReleaseCapture(&cam);
    //释放内存;
}


显示效果:

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值