Linux下qt5调用opencv播放摄像头

1,在.pro文件中添加opencv的安装头文件路径和.so路径,如下opencvCap.pro所示:

#-------------------------------------------------
#
# Project created by QtCreator 
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = opencvCap
TEMPLATE = app


INCLUDEPATH += /usr/local/include
INCLUDEPATH += /usr/local/include/opencv
INCLUDEPATH += /usr/local/include/opencv2
INCLUDEPATH += /usr/local/include/opencv2/core
INCLUDEPATH += /usr/local/include/opencv2/highgui
INCLUDEPATH += /usr/local/include/opencv2/imgproc
INCLUDEPATH += /usr/local/include/opencv2/flann
INCLUDEPATH += /usr/local/include/opencv2/photo
INCLUDEPATH += /usr/local/include/opencv2/video
INCLUDEPATH += /usr/local/include/opencv2/features2d
INCLUDEPATH += /usr/local/include/opencv2/objdetect
INCLUDEPATH += /usr/local/include/opencv2/calib3d
INCLUDEPATH += /usr/local/include/opencv2/ml
INCLUDEPATH += /usr/local/include/opencv2/contrib

LIBS += `pkg-config opencv --cflags --libs`



SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

widget.ui建立如下:

widget.h代码:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QWidget>
#include <QImage>
#include <QTimer>     // 设置采集数据的间隔时间

#include <highgui.h>  //包含opencv库头文件
#include <cv.h>

namespace Ui {
class Widget;
}

using namespace cv;

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();   // 打开摄像头

    void on_pushButton_2_clicked();  // 关闭摄像头。

    void on_pushButton_3_clicked();  // 拍照

    void readFarme();       // 读取当前帧信息

private:
    Ui::Widget *ui;
    QTimer    *timer;
    QImage    *imag;
    CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
    IplImage  *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
};

#endif // WIDGET_H

widget.cpp代码如下:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    cam     = NULL;
    timer   = new QTimer(this);
    imag    = new QImage();         // 初始化

        /*信号和槽*/
    connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
}

Widget::~Widget()
{
    delete ui;
}

/******************************
********* 打开摄像头 ***********
*******************************/

void Widget::on_pushButton_clicked()
{
    cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
    timer->start(33);              // 开始计时,超时则发出timeout()信号
}

/*******************************
***关闭摄像头,释放资源,必须释放***
********************************/

void Widget::on_pushButton_2_clicked()
{
    timer->stop();         // 停止读取数据。
    cvReleaseCapture(&cam);//释放内存;
}

/*************************
********* 拍照 ***********
**************************/
void Widget::on_pushButton_3_clicked()
{
    frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧

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

    ui->label_2->setPixmap(QPixmap::fromImage(image));  // 将图片显示到label上
}

/*********************************
********* 读取摄像头信息 ***********
**********************************/

void Widget::readFarme()
{
    frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
        // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
    QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(image));  // 将图片显示到label上
}

实现结果如下:

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
你可以使用Qt和OpenCV调用摄像头。以下是一个简单的示例代码,演示如何使用Qt和OpenCV进行摄像头捕捉: ```cpp #include <QApplication> #include <QMainWindow> #include <QVBoxLayout> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp> using namespace cv; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建布局和标签 QVBoxLayout *layout = new QVBoxLayout(); QLabel *label = new QLabel(this); layout->addWidget(label); // 设置布局为主窗口的心部分 QWidget *centralWidget = new QWidget(this); centralWidget->setLayout(layout); setCentralWidget(centralWidget); // 创建定时器,用于定时更新摄像头帧 QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MainWindow::updateFrame); timer->start(30); // 设置时间间隔 // 打开摄像头 capture.open(0); if (!capture.isOpened()) { label->setText("无法打开摄像头"); return; } } ~MainWindow() { // 关闭摄像头 capture.release(); } private slots: void updateFrame() { Mat frame; capture >> frame; // 从摄像头获取一帧图像 // 将图像转换为Qt显示的格式 QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_BGR888); // 调整图像大小以适应标签的大小 image = image.scaled(label->size(), Qt::KeepAspectRatio); // 在标签上显示图像 label->setPixmap(QPixmap::fromImage(image)); } private: VideoCapture capture; QLabel *label; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } ``` 这个示例代码创建了一个基于Qt的主窗口,该窗口使用OpenCV捕捉并显示摄像头的帧。注意,需要在项目添加OpenCV和Qt的头文件和库。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开缓缓归以

你的鼓励将是我创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值