使用opencv:从视频中获取每一帧图片

使用opencv:从视频中获取每一帧图片

★ C实现

当前目录:~/test/opencv/getframe,在此目录中创建getframe.cppCMakeLists.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.html

python版的,可以参考:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值