使用opencv:从视频中获取每一帧图片
2017-12-10 23:05
399 查看
使用opencv:从视频中获取每一帧图片
getframe.cpp
CMakeLists.txt
编译:(当前目录:
生成getframe可执行程序。
运行:
在build目录中的
python版的,可以参考:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html
★ C实现
当前目录:~/test/opencv/getframe,在此目录中创建
getframe.cpp和
CMakeLists.txt
getframe.cpp
#include <stdio.h> #include <opencv2/opencv.hpp> #include <sys/stat.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> using namespace cv; int main(int argc, char** argv ) { if ( argc != 2 ) { printf("usage: ./getframe <Video_Path>\n"); return -1; } CvCapture* cvCap = cvCaptureFromFile(argv[1]);// argv[1] is video name const char *winName = "Show Frames"; cvNamedWindow(winName,CV_WINDOW_AUTOSIZE); // output directory char dirName[512] = {0}; char *p = strrchr(argv[1], '/'); strcpy(dirName, p+1); p = strchr(dirName, '.'); *p = '_'; printf("output dir: %s\n", dirName); struct stat dirInfo = {0}; int statRet = stat(dirName, &dirInfo); if (statRet == -1 && errno == ENOENT) { int ret = mkdir(dirName, 0775); if (ret == 0) { printf("mkdir success: %s\n", dirName); } else { printf("mkdir failed: %s\n", dirName); return -1; } } printf("press any key to stop.\n"); int id = 1; while(1) { IplImage* img = cvQueryFrame(cvCap); if (img == NULL) { printf("No more frames, press any key to exit.\n"); break; } cvShowImage(winName, img); char name[512] = {0}; sprintf(name, "./%s/%04d.jpg", dirName, id); cvSaveImage(name, img); id++; int key = cvWaitKey(1000/33);// 30 frame/second for displaying in window } cvReleaseCapture(&cvCap); waitKey(0); cvDestroyWindow(winName); return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project( getframe ) find_package( OpenCV REQUIRED ) add_executable( getframe getframe.cpp ) target_link_libraries( getframe ${OpenCV_LIBS} )
编译:(当前目录:
~/test/opencv/getframe)
mkdir build cd build cmake .. make
生成getframe可执行程序。
运行:
./getframe ../Megamind.avi
在build目录中的
Megamind_avi目录中是获取的视频的每一帧图片。
★ C++实现
#include <stdio.h> #include <opencv2/opencv.hpp> #include <sys/stat.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> using namespace cv; int main(int argc, char** argv ) { if ( argc != 2 ) { printf("usage: getframe <Video_Path>\n"); return -1; } VideoCapture cap(argv[1]); if(!cap.isOpened()) { printf("video is not ready\n"); return -1; } // output directory char dirName[512] = {0}; char *p = strrchr(argv[1], '/'); strcpy(dirName, p+1); p = strchr(dirName, '.'); *p = '_'; printf("output dir: %s\n", dirName); struct stat dirInfo = {0}; int statRet = stat(dirName, &dirInfo); if (statRet == -1 && errno == ENOENT) { int ret = mkdir(dirName, 0775); if (ret == 0) { printf("mkdir success: %s\n", dirName); } else { printf("mkdir failed: %s\n", dirName); return -1; } } printf("press any key to stop.\n"); const char *winName = "Show Frames"; namedWindow(winName, 1); Mat frame; int id = 1; while(1) { cap.grab(); if (!cap.retrieve(frame)) { printf("No more frames, press any key to exit.\n"); break; } char name[512] = {0}; sprintf(name, "%s/%04d.jpg", dirName, id); imshow(winName, frame); imwrite(name, frame); id++; if(waitKey(30) >= 0) break; } cap.release(); waitKey(0); cvDestroyWindow(winName); return 0; }
★ 参考
https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.htmlpython版的,可以参考:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html
相关文章推荐
- [zt]OpenCV如何获取视频当前的一帧图像
- Zedboard摄像头获取视频设计问题篇(四)-OpenCV+QT配置显示图片
- MFC中使用opencv获取海康摄像头视频
- 使用 Visual Studio 2008 和 OpenCV 在窗口显示图片或视频
- (转)OpenCV提取视频每一帧及将连续图片合成视频
- IOS获取视频每一帧的图片方法
- 三.使用OpenCv从摄像头获取视频和从文件播放视频
- 笔记:使用 opencv 获取两幅图片的相位偏移
- opencv使用笔记本摄像头获取视频问题解决
- 从视频中获取每一帧图片(包括第一帧)
- 海康网络摄像机视频数据的获取及使用opencv显示
- 通过OPENCV从视频中获取图片并保存
- OpenCV之从视频获取每一帧图像
- iOS 播放视频进行滑动获取每一帧图片并且通过UIImageView展示出来
- Opencv + Qt 获取视频中任意一帧
- python使用opencv驱动摄像头获取视频并保存
- 关于opencv从视频获取单帧图片函数cvQueryFrame
- Java中使用Opencv从视频文件中获取帧
- Qt5.3里使用OpenCV库采集摄像头图像保存为图片和视频
- Swift - 使用ALAssetsLibrary获取相簿里所有图片,视频(附样例)