Qt+OpenCV读取两个摄像头并保存

在上一篇文章中,实现了单个摄像头的摄像头读取、视频保存、摄像头关闭等功能;

这一篇实现两个摄像头的读取,在笔记本电脑上插一个USB摄像头,然后让显示两个摄像头的图像并保存

先来个效果展示

话不多说,直接上代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    OPEN = true;
    /*信号和槽*/
    connect(ui->OpenCameraBtn,SIGNAL(click()),this,SLOT(on_OpenCameraBtn_clicked()));//打开摄像头按钮
    connect(ui->TakePicBtn,SIGNAL(click()),this,SLOT(on_TakePicBtn_clicked()));//保存视频按钮
    connect(ui->CloseCameraBtn,SIGNAL(click()),this,SLOT(on_CloseCameraBtn_clicked()));//关闭摄像头按钮
    connect(ui->OpenVideoBtn,SIGNAL(click()),this,SLOT(on_OpenVideoBtn_clicked()));//打开视频按钮
    connect(timer,SIGNAL(timeout()),this,SLOT(getFrame()));
}
/******************************
 ***********打开摄像头***********
 *****************************/
void MainWindow::on_OpenCameraBtn_clicked()
{
    // 设置摄像头的拍摄属性为 分辨率640x480,帧率30fps
//    cam.set(CAP_PROP_FRAME_HEIGHT, 480);
//    cam.set(CAP_PROP_FRAME_WIDTH, 640);
//    cam.set(CAP_PROP_FPS, 30.0);
    //打开摄像头 从摄像头中获取视频
    cam0.open(0);
    cam1.open(1);
    if(cam0.isOpened()&&!cam1.isOpened())
    {
        cam1 = cam0;
    }
    if(!cam0.isOpened()&&cam1.isOpened())
    {
        cam0 = cam1;
    }
    //开启定时器,每隔0.05秒刷新一次
    timer->start(50);
}
void MainWindow::getFrame()
{
   //从摄像头中抓取并返回每一帧
    if(cam0.isOpened())
    {
        cam0 >> frame0;
        //将抓取到的帧转换成QImage格式
        //QImage img0 = QImage((const unsigned char*)frame0.data, frame0.cols, frame0.rows, QImage::Format_RGB888).rgbSwapped();
        //ui->label_2->setPixmap(QPixmap::fromImage(img0));
        namedWindow("VideoPlay0", WINDOW_NORMAL);
        imshow("VideoPlay0", frame0);
        waitKey(1000 / 30);//30帧
    }
    if(cam1.isOpened())
    {
        cam1 >> frame1;
        //将抓取到的帧转换成QImage格式
        //QImage img1 = QImage((const unsigned char*)frame1.data, frame1.cols, frame1.rows, QImage::Format_RGB888).rgbSwapped();
        //将图片显示到QLabel上
        //ui->label->setPixmap(QPixmap::fromImage(img1));
        namedWindow("VideoPlay1", WINDOW_NORMAL);
        imshow("VideoPlay1", frame1);
        waitKey(1000 / 30);//30帧
    }
}

/******************************
 ***********保存视频按钮************
 *****************************/
void MainWindow::on_TakePicBtn_clicked()
{
    if(!(cam0.isOpened() && cam1.isOpened()))
    {
        cam0.open(0);
        cam1.open(1);
    }
    write0.open("D:\\cam_0.avi",VideoWriter::fourcc('M', 'J', 'P', 'G'), 30.0, Size(640, 480), true);
    write1.open("D:\\cam_1.avi",VideoWriter::fourcc('M', 'J', 'P', 'G'), 30.0, Size(640, 480), true);
    while(OPEN)
    {
        if(cam0.isOpened())
        {
            cam0 >> frame0;
            //if(!frame0) break;
            write0.write(frame0);
            namedWindow("VideoPlay0", WINDOW_NORMAL);
            imshow("VideoPlay0", frame0);
            waitKey(1000 / 30);
        }
        if(cam1.isOpened())
        {
            cam1 >> frame1;
            //if(!frame1) break;
            write1.write(frame1);
            namedWindow("VideoPlay1", WINDOW_NORMAL);
            imshow("VideoPlay1", frame1);
            waitKey(1000 / 30);
        }
    }

}

/******************************
 ***********关闭摄像头***********
 *****************************/
void MainWindow::on_CloseCameraBtn_clicked()
{
    timer->stop();
    cam0.release();
    cam1.release();
    OPEN = false;
    write0.release();
    write1.release();
    destroyWindow("VideoPlay0");
    destroyWindow("VideoPlay1");
}
/******************************
 ***********打开视频***********
 *****************************/
void MainWindow::on_OpenVideoBtn_clicked()
{
    VideoCapture video;
    Mat frame2;
    video.open("D:\\test.avi");
    while (video.isOpened())
    {
        video >> frame2;
        imshow("video", frame2);
        if (cvWaitKey(40) == 27)  //cvWaitKey的参数相当于多少ms一帧,现在是40ms一帧,1s25帧
            break;                //按ESC就退出
    }
}

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

 

 
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要在WPF应用程序中打开多个摄像头,可以使用OpenCV库来实现。首先,需要在项目中添加对OpenCV的引用。 接下来,可以使用OpenCV的VideoCapture类来访问和控制摄像头。为了打开多个摄像头,可以创建多个VideoCapture对象,并分别指定不同的设备ID。设备ID通常以0开始递增,表示不同的摄像头。 在WPF应用程序的代码中,可以创建并初始化多个VideoCapture对象,如下所示: ```csharp using OpenCvSharp; ... // 打开第一个摄像头 VideoCapture capture1 = new VideoCapture(0); // 打开第二个摄像头 VideoCapture capture2 = new VideoCapture(1); // 打开第三个摄像头 VideoCapture capture3 = new VideoCapture(2); ``` 然后,可以使用OpenCV的函数来读取和显示每个摄像头的视频帧。例如,可以使用`Mat`类来存储图像帧,然后将其显示在WPF应用程序的图像控件中。 ```csharp while (true) { // 读取第一个摄像头的帧 Mat frame1 = new Mat(); capture1.Read(frame1); // 将帧显示在WPF的图像控件中 // 读取第二个摄像头的帧 Mat frame2 = new Mat(); capture2.Read(frame2); // 将帧显示在WPF的图像控件中 // 读取第三个摄像头的帧 Mat frame3 = new Mat(); capture3.Read(frame3); // 将帧显示在WPF的图像控件中 } ``` 最后,可以将每个摄像头的帧显示在WPF应用程序的图像控件中,以实时显示摄像头的视频。这可以通过将`Mat`对象转换为WPF的`BitmapSource`对象来实现。 以上就是在WPF应用程序中打开多个摄像头的基本步骤。通过创建多个VideoCapture对象,并读取和显示每个摄像头的帧,可以实现多摄像头的实时视频显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宗而研之

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

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

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

打赏作者

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

抵扣说明:

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

余额充值