测试环境:ubuntu18.04+opencv4.2+Qt
一个基础的opencv读取视频并显示demo。
video.pro文件:
SOURCES += main.cpp INCLUDEPATH += /usr/local/opencv4/include/opencv4 \ /usr/local/opencv4/include/opencv4/opencv2 LIBS += -L/usr/local/opencv4/lib -lopencv_freetype -lopencv_highgui -lopencv_videoio -lopencv_imgproc -lopencv_core -lopencv_imgcodecs -lopencv_video
main.cpp文件:
#include <QCoreApplication> #include <QMetaType> #include <QDebug> #include <iostream> #include <opencv2/opencv.hpp> using namespace std; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qRegisterMetaType<cv::Mat>(cv::Mat&); cv::VideoCapture cap; cap.open("./data/videos/TownCentreXVID.avi"); if(!cap.isOpened()) { qDebug() << " ===> please check the video path."; return 0; } int width = cap.get(cv::CAP_PROP_FRAME_WIDTH); int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); cv::Mat frame; int nFrame = 0; cv::namedWindow(video, 0); cv::resizeWindow(video, 960, 480); cv::moveWindow(video, 200, 100); while(true) { int frame_id = cap.get(cv::CAP_PROP_POS_FRAMES); std::cout << " frame_id = " << frame_id << std::endl; double t = (double)cv::getTickCount(); cap.read(frame); if (frame.empty()) { qDebug() << "===> image empty."; continue; } nFrame += 1; t = ((double)cv::getTickCount() - t) * 1000 / cv::getTickFrequency(); cout << "nFrame = " << nFrame << ", Decode time for a frame :" << t << "ms" << endl; cv::imshow(video, frame); cv::waitKey(10); } cap.release(); return a.exec(); }
结果: