OpenCV学习 - 图片集合成视频
阅读原文时间:2023年07月11日阅读:3

  这个很简单,没什么好说的。。。这里给出学习手册:

  1.官方教程:https://docs.opencv.org

  2.这个是一些video相关的API参考:https://docs.opencv.org/trunk/dd/d9e/classcv_1_1VideoWriter.html

  3.一个简单的例子实现将图片集合成视频:https://docs.opencv.org/trunk/d5/d57/videowriter_basic_8cpp-example.html#a5

  谈一下一些小细节,其实官方文档中有提示,注意仔细看应该没问题:

    1.注意图像尺寸,要合成的每一张图片规格必须一致。

    2.注意图像RGB值,如果是jpg/png这样的,则默认打开3个通道(RGB),imread()中有一个省缺参数isColor默认为true,如果图片是灰度图像,应将isColor设置为false。参考:https://blog.csdn.net/yang_xian521/article/details/7440190(看评论)、https://docs.opencv.org/master/d5/d98/tutorial_mat_operations.html

    3.fps(Frames per Second)表示帧率,单位Hz,即每秒播放的帧数,一般25~30的帧率在视频看起来会很流畅,在游戏中60~75fps就非常流畅了,太高了并不好,显示屏刷新频率会跟不上而浪费GPU的处理能力,太低了游戏体验会很糟糕…

    4.opencv貌似只支持avi格式的视频。

———— ps:简单的封装了一下VideoWriter ————

  头文件:img2video.hpp:

#ifndef _IMG_TO_VIDEO_H_
#define _IMG_TO_VIDEO_H_

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include
#include

#ifndef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
}
#endif // __cplusplus

using namespace cv;

#define BUF_SIZE (32 << 1)

int ImageOverlay(char*src,
const char*format, const char*dst,
int width, int height,
size_t start_name, size_t end_name,
int fps, int isColor)
{
char img_name[BUF_SIZE];
char psrc[BUF_SIZE];
strcpy(psrc, src);
Mat r;

VideoWriter writer(dst, VideoWriter::fourcc('M', 'J', 'P', 'G'), fps,  
                    Size(width, height), isColor);  
if (!writer.isOpened()) { printf("Error at line %d :function VideoWriter\\n", \_\_LINE\_\_); return -1; }  
for (size\_t i = start\_name; i <= end\_name; i++)  
{  

#ifdef _WIN64
if (sprintf(img_name, "/%I64d.", i) < 0)
#else
if (sprintf(img_name, "/%lld.", i) < 0)
#endif
{
printf("Error at line %d :function sprintf()\n", __LINE__);
return -3;
}

    strcat(img\_name, format);  
    strcat(src, img\_name);  
    printf("%s\\n", src);  
    r = imread(src);  
    strcpy(src, psrc);  
    if(r.empty()) { printf("Error at line %d :function imread()\\n", \_\_LINE\_\_); return -4; }  
    waitKey(5);  
    writer.write(r);  
}  
printf("加载完成!\\n");  
return 0;  

}

#endif // _IMG_TO_VIDEO_H_

  测试:

#include "img2video.hpp"
#include

int main()
{
char src[] = "/home/darkchii/图片";
char format[] = "png";

ImageOverlay(src, format, "/home/darkchii/视频/sg0.avi", 1920, 1080, 2, 6, 6, 1);  
return 0;  

}