Qt+opencv开发笔记(2)

第一步:opencv打开摄像头并显示到qt界面上;
关键代码:

CvCapture *m_camera;        //视频获取结构 作为视频获取函数的返回值
IplImage *m_imgFrame;       //IplImage结构指针 存放每一帧的图像
//...
m_camera = cvCreateCameraCapture(0);
//...使用qt定时器定时抓取一帧
m_imgFrame = cvQueryFrame(m_camera);// 从摄像头中抓取并返回每一帧
//...处理一帧数据
//...转为qImage数据并显示
在用cvCreateCameraCapture(0)打开摄像头的时候,如果硬件设备为**多个摄像头**时请注意。opencv库里没有提供获取摄像头设备列表的函数接口。此时cvCreateCameraCapture(0)打开的不一定是你想要的设备。
**配置摄像头**参数:函数cvSetCaptureProperty();
cvSetCaptureProperty(m_camera,CV_CAP_PROP_FPS,25);
cvSetCaptureProperty(m_camera,CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));//CV_FOURCC('M','J','P','G')
cvSetCaptureProperty(m_camera, CV_CAP_PROP_FRAME_WIDTH , size.width);
cvSetCaptureProperty(m_camera, CV_CAP_PROP_FRAME_HEIGHT , size.height);

opencv默认摄像头分辨率为640*480如果没有特别需求以上参数可不必配置。
在界面显示时用到了opencv**图像缩放算法**参照http://www.cnblogs.com/wangguchangqing/p/4011892.html,感谢这个仁兄的分享,代码亲测可用。
第二步:存储摄像头视频到本地;
关键代码:

cv::VideoWriter *writer;
if(frameFlage==0){//第一帧,设置writer参数
    QString str;
    int w,h;
    QDateTime time;
    time = QDateTime::currentDateTime();
    QString strBuffer= time.toString("yyyy-MM-dd-hh-mm");
    w=m_imgFrame->width;
    h=m_imgFrame->height;
    strBuffer.append(QString::number(w));
    strBuffer.append("#");
    strBuffer.append(QString::number(h));
    str.append("./cameraFile/");
    str.append(strBuffer);
    str.append(".avi");
    writer->open(str.toLatin1().data(),CV_FOURCC('X','V','I','D'),25,cvSize(w,h));
    frameFlage=1;
    }else{
    //cvGrabFrame(m_camera);          // 抓取帧
    //m_imgFrame1=cvRetrieveFrame(m_camera);  // 恢复图像
    // cvWriteFrame(writer,m_imgFrame);      // 将帧添加入视频文件
    writer->write(m_imgFrame);
    }
存储操作强烈建议放到单独线程,笔者亲身被虐。刚开始仅仅是显示640*480像素的视频,没有出现卡顿的情形,就没有使用分线程操作。后来录制1080p直接卡出翔。笔者中间因为卡顿还突发奇想换了ffmpeg命令行模式进行录制摄像头视频,卡倒是不卡了,但是不能和opencv显示摄像头同时用。(同一个设备,不知道能不能同时被opencv喝ffmpeg使用),至于全部换成ffmpeg操作,暂时功力不够,不得不重新回到opencv写操作优化上。新建线程类,瞬间飞起来。
我只能说,好习惯需要慢慢养成。
当使用QtOpenCV结合进行开发时,可以实现许多有趣的应用。下面是一个简单的Qt+OpenCV实例,用于打开摄像头并显示实时视频流: 1. 首先,确保已经安装了QtOpenCV,并在Qt项目中添加了OpenCV库。 2. 创建一个Qt窗口应用程序,并在主窗口中添加一个QLabel控件,用于显示视频流。 3. 在主窗口的构造函数中,初始化摄像头并设置视频流的参数: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <opencv2/opencv.hpp> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化摄像头 cv::VideoCapture cap(0); if (!cap.isOpened()) { qDebug() << "无法打开摄像头"; return; } // 设置视频流的宽度和高度 cap.set(cv::CAP_PROP_FRAME_WIDTH, 640); cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480); // 创建定时器,用于定时读取视频QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateFrame())); timer->start(30); // 每30毫秒更新一帧 } ``` 4. 在主窗口中添加一个槽函数`updateFrame()`,用于读取视频帧并在QLabel控件中显示: ```cpp void MainWindow::updateFrame() { cv::Mat frame; cap >> frame; // 读取视频帧 // 将OpenCV的Mat转换为Qt的QImage QImage qimg(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888); qimg = qimg.rgbSwapped(); // BGR转RGB // 在QLabel控件中显示图像 ui->label->setPixmap(QPixmap::fromImage(qimg)); ui->label->setScaledContents(true); } ``` 5. 编译并运行程序,即可看到实时视频流在Qt窗口中显示。 这只是一个简单的示例,你可以根据自己的需求进行更复杂的图像处理和应用开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值