OpenCV保存视频的操作

一、opencv保存视频打不开

保存的视频打不开可能是因为文件编码格式不对,或者版本不兼容等原因。

检查文件编码格式,如果视频保存为AVI格式,在保存的时候应该指定编码器,并确保选择的编码器在本地系统上可用。如果视频格式为mp4,需要检查mp4格式的插件是否已经安装好,并且扩展名保存为.mp4才能兼容。

示例代码:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

二、opencv保存视频mp4

mp4是一种常见的视频格式,OpenCV同样可以保存为mp4格式。mp4格式需要保证编码器可用,推荐使用H264编码器。

示例代码:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘a’, ‘v’, ‘c’, ‘1’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.mp4”, fourcc, fps, size, true);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

三、opencv保存视频变快

保存视频变快可以通过控制帧率调整,适当提高帧率。

示例代码:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 60;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(1) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

四、opencv保存视频每一帧

可以通过遍历每一帧,保存每一帧的方式将视频保存成一个序列帧。

示例代码:

“`
#include
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int frameCount = 0;
Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}

stringstream ss;
ss << "frame_" << frameCount << ".png";
imwrite(ss.str(), frame);
frameCount++;
imshow("frame", frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
destroyAllWindows();
return 0;
}
“`

五、Opencv保存视频常见问题

问题一:保存视频过大

可以通过调整帧率和分辨率降低视频的大小。

示例代码:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 15;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)) / 2, int(cap.get(CAP_PROP_FRAME_HEIGHT)) / 2);
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}

resize(frame, frame, size);
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

问题二:保存的视频显示是蓝色的

保存的视频显示成蓝色的场景可能是因为视频的BGR三通道颜色顺序和某些视频播放器不一致导致的,建议使用其他播放器尝试。

六、opencv保存视频只有6kb

视频只有6kb可能是保存格式不正确导致的。

示例代码:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

int frameCount = writer.get(CAP_PROP_FRAME_COUNT);
if (frameCount == 0)
{
return 0;
}
return 0;
}
“`

七、opencv保存视频python

OpenCV同样可以使用Python进行视频保存,类似的API接口,只是函数名不同。

示例代码:

“`Python
import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*’XVID’)
fps = 30
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter(‘output.avi’, fourcc, fps, size)
while True:
ret, frame = cap.read()
if ret:
out.write(frame)
cv2.imshow(‘frame’, frame)
if cv2.waitKey(1) == 27:
break

cap.release()
out.release()
cv2.destroyAllWindows()
“`

八、Opencv保存视频 buffer

为了避免保存视频时出现buffer溢出,可以设置参数,提高缓冲区大小。

示例代码:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size, true);

//需要增加的代码
int buffersize = 50;
int framesize = writer.get(CAP_PROP_FRAME_WIDTH) * writer.get(CAP_PROP_FRAME_HEIGHT);
int bufferlength = buffersize * framesize;
writer.set(CAP_PROP_BUFFERSIZE, bufferlength);
//增加代码结束

if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

九、opencv保存视频后大小只有1kb

还是因为保存格式不正确导致的,可以尝试更换编码器。

示例代码:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘M’, ‘J’, ‘P’, ‘G’); //换成MJPEG编码器
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

原创文章,作者:JELEB,如若转载,请注明出处:https://www.506064.com/n/368161.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JELEBJELEB
上一篇 2025-04-12 01:12
下一篇 2025-04-12 01:13

相关推荐

  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python栈操作用法介绍

    如果你是一位Python开发工程师,那么你必须掌握Python中的栈操作。在Python中,栈是一个容器,提供后进先出(LIFO)的原则。这篇文章将通过多个方面详细地阐述Pytho…

    编程 2025-04-29
  • Python OpenCV 直线检测

    本文将介绍在Python OpenCV中进行直线检测的方法,主要涉及到图像的边缘检测、霍夫变换和绘制直线等操作。 一、边缘检测 由于直线检测是从图像的边缘开始的,因此必须先找到图像…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • Python磁盘操作全方位解析

    本篇文章将从多个方面对Python磁盘操作进行详细阐述,包括文件读写、文件夹创建、删除、文件搜索与遍历、文件重命名、移动、复制、文件权限修改等常用操作。 一、文件读写操作 文件读写…

    编程 2025-04-29
  • Python代码实现回文数最少操作次数

    本文将介绍如何使用Python解决一道经典的回文数问题:给定一个数n,按照一定规则对它进行若干次操作,使得n成为回文数,求最少的操作次数。 一、问题分析 首先,我们需要了解回文数的…

    编程 2025-04-29
  • Python元祖操作用法介绍

    本文将从多个方面对Python元祖的操作进行详细阐述。包括:元祖定义及初始化、元祖遍历、元祖切片、元祖合并及比较、元祖解包等内容。 一、元祖定义及初始化 元祖在Python中属于序…

    编程 2025-04-29
  • 如何用Python对数据进行离散化操作

    数据离散化是指将连续的数据转化为离散的数据,一般是用于数据挖掘和数据分析中,可以帮助我们更好的理解数据,从而更好地进行决策和分析。Python作为一种高效的编程语言,在数据处理和分…

    编程 2025-04-29
  • Python列表的读写操作

    本文将针对Python列表的读取与写入操作进行详细的阐述,包括列表的基本操作、列表的增删改查、列表切片、列表排序、列表反转、列表拼接、列表复制等操作。 一、列表的基本操作 列表是P…

    编程 2025-04-29

发表回复

登录后才能评论