点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达
共同学习共同进步
相机的连续采集,简单的来说,就是连续获取相机中获取到的图像数据再显示出来,所以,在这里的基本思路就是,在一个地方触发相机启动,再利用一个定时器来捕捉相机中图像的数据,接下来就是每一次捕捉到的图像显示到界面上来
所以就有以下代码
头文件中声明以下两个变量和两个槽函数
QTimer* m_timerGrabImage;//实时采集的定时器 cv::Mat m_matGrab;//实时采集的图片 private slots: void updateGrabImage();//实时采集图片 void btnGrabContinu_clicked();//连续采集
源文件中,构造函数指定定时器以及信号与槽的对接
m_timerGrabImage = new QTimer(this); connect(m_timerGrabImage, SIGNAL(timeout()), this, SLOT(updateGrabImage())); connect(ui.btnGrabContinu, SIGNAL(clicked()), this, SLOT(btnGrabContinu_clicked())); //实时采集void QGuiVideo::btnGrabContinu_clicked(){ StopGrap(); //从摄像头捕获视频 if (m_videoGrab.open(0)) { m_videoPut.open("videotest.mp4", 0, m_videoGrab.get(CAP_PROP_FPS), Size(m_videoGrab.get(CAP_PROP_FRAME_WIDTH), m_videoGrab.get(CAP_PROP_FRAME_HEIGHT))); m_matGrab = Mat::zeros(m_videoGrab.get(CAP_PROP_FRAME_HEIGHT), m_videoGrab.get(CAP_PROP_FRAME_WIDTH), CV_8UC3); QString szText = QString("大小:%1X%2 帧率:%3 格式:%4") .arg(m_videoGrab.get(CAP_PROP_FRAME_HEIGHT)) .arg(m_videoGrab.get(CAP_PROP_FRAME_WIDTH)) .arg(m_videoGrab.get(CAP_PROP_FPS)) .arg(m_videoGrab.get(CAP_PROP_FORMAT)); ui.labelVideoInfo->clear(); ui.labelVideoInfo->setText(szText); m_nGrabModel = 0;//正常采图模式 m_timerGrabImage->start(10); }}//实时更新采集到的图片void QGuiVideo::updateGrabImage(){ if (!m_videoGrab.isOpened()) { return; } if (m_videoGrab.read(m_matGrab)) { if (m_matGrab.data) { Mat grab; cvtColor(m_matGrab, grab, COLOR_BGR2RGB);//Qt中支持的是RGB图像, OpenCV中支持的是BGR QImage grabimage = QImage((uchar*)(grab.data), grab.cols, grab.rows, QImage::Format_RGB888); recvShowPicSignal(grabimage, 0); } } }}//显示图片void QGuiVideo::recvShowPicSignal(QImage image, int nShowIndex){ QPixmap ConvertPixmap = QPixmap::fromImage(image); //要用QGraphicsView就必须要有QGraphicsScene搭配着用 QGraphicsScene* qgraphicsScene = new QGraphicsScene; //实例化类ImageWidget的对象m_Image,该类继承自QGraphicsItem,是自己写的类 QImageWidgetItem* pImage = new QImageWidgetItem(&ConvertPixmap); if (0 == nShowIndex) { //获取界面控件Graphics View的宽度和高度 int nwith = ui.graphicsViewVideo->width(); int nheight = ui.graphicsViewVideo->height(); //将界面控件Graphics View的width和height传进类m_Image中 pImage->setQGraphicsViewWH(nwith, nheight); //将QGraphicsItem类对象放进QGraphicsScene中 qgraphicsScene->addItem(pImage); //使视窗的大小固定在原始大小,不会随图片的放大而放大(默认状态下图片放大的时候视窗两边会自动出现滚动条,并且视窗内的视野会变大),防止图片放大后重新缩小的时候视窗太大而不方便观察图片 ui.graphicsViewVideo->setSceneRect(QRectF(-(nwith / 2), -(nheight / 2), nwith, nheight)); ui.graphicsViewVideo->setScene(qgraphicsScene); } else if (1 == nShowIndex) { int nwith = ui.graphicsViewVideoPro->width(); int nheight = ui.graphicsViewVideoPro->height(); pImage->setQGraphicsViewWH(nwith, nheight); qgraphicsScene->addItem(pImage); ui.graphicsViewVideoPro->setSceneRect(QRectF(-(nwith / 2), -(nheight / 2), nwith, nheight)); ui.graphicsViewVideoPro->setScene(qgraphicsScene); }}
以上就是逻辑的实现
效果如下