稠密光流跟踪是将当前帧的所有像素点与前一帧比较,有变化的标记出来。对比的点比较多,不是对比变化的那几个特征点。所以速度较慢。没有稀疏光流的速度快。但有的时候效果比稀疏光流要好
代码演示如下
//光流跟踪HFvoid QGuiVideo::btnLightFlowTrackHF_clicked(){ StopGrap(); QString fileName = QFileDialog::getOpenFileName(this, "open Video", "", "Video File(*.avi *.mp4 *.mp3)"); if (m_videoGrab.open(fileName.toStdString())) { m_nGrabModel = 6; m_videoGrab.read(m_matGrab); cvtColor(m_matGrab, m_matPrevGray, COLOR_BGR2GRAY); 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); ui.graphicsViewVideo->recvShowPicSignal(grabimage); if (!m_matPrevGray.empty()) { Mat gray, flowResult, flowdata; cvtColor(m_matGrab, gray, COLOR_BGR2GRAY); calcOpticalFlowFarneback(m_matPrevGray, gray, flowdata, 0.5, 3, 15, 3, 5, 1.2, 0); cvtColor(m_matPrevGray, flowResult, COLOR_GRAY2BGR); for (int row = 0; row < flowResult.rows; row++) { for (int col = 0; col < flowResult.cols; col++) { const Point2f fxy = flowdata.at<Point2f>(row, col); if (fxy.x > 1 || fxy.y > 1) { cv::line(flowResult, Point(col, row), Point(cvRound(col + fxy.x), cvRound(row + fxy.y)), Scalar(0, 255, 0), 2, 8, 0); cv::circle(flowResult, Point(col, row), 2, Scalar(0, 0, 255), -1); } } }
QImage grabimage = QImage((uchar*)(flowResult.data), flowResult.cols, flowResult.rows, QImage::Format_RGB888); ui.graphicsViewVideoPro->recvShowPicSignal(grabimage); } }}
效果如下:


更多文章请关注《万象专栏》
转载请注明出处:https://www.wanxiangsucai.com/read/cv15328