威海网站优化推广,企业网站建设入账,html5手机资讯网站模板,注册一个设计公司需要多少钱文章目录 opencv视频文件的读取#xff0c;处理与保存一、视频文件的读取#xff1a;1、cv::VideoCapture是OpenCV库中用于处理视频输入的类#xff0c;它提供了一种简单的方法来从摄像头#xff0c;视频文件、或图像序列中读取帧#xff1b;#xff08;1#xff09;打开… 文章目录 opencv视频文件的读取处理与保存一、视频文件的读取1、cv::VideoCapture是OpenCV库中用于处理视频输入的类它提供了一种简单的方法来从摄像头视频文件、或图像序列中读取帧1打开摄像头2打开视频文件3打开网络摄像头4打开图像序列 2、cv::VideoCapture类的常用方法1capture.get()用于获取视频的属性比如帧数、帧率等2capture.set(int propId, double value)用于设置视频的属性比如设置视频的帧率、帧大小等属性3capture.read(cv::Mat frame)用于读取视频的一帧将其存储在 cv::Mat 对象中4capture.release()用于释放 VideoCapture 对象所占用的资源一般在你已经完成了对视频流的操作后调用它 二、对视频帧进行处理三、保存处理后的视频1、cv::VideoWriter 是opencv中用于将图像帧序列保存为视频文件的类它可以将处理过的帧写入一个视频文件也可以将视频流输出到摄像头或网络1创建一个 cv::VideoWriter 对象 2、cv::VideoWriter类的常用方法1cv::VideoWriter::open()用于打开一个视频文件或设备以便写入视频帧2cv::VideoWriter::write()用于将一帧图像写入视频文件3cv::VideoWriter::isOpened()用于检查VideoWriter对象是否成功打开如果成功打开了视频文件或者设备该方法将返回true否则返回false4cv::VideoWriter::release()用于释放VideoWriter对象所占用的资源一般在你已经完成了对视频的写入操作后调用它 opencv视频文件的读取处理与保存
一、视频文件的读取
1、cv::VideoCapture是OpenCV库中用于处理视频输入的类它提供了一种简单的方法来从摄像头视频文件、或图像序列中读取帧
1打开摄像头
cv::VideoCapture capture(int index)参数解释
index打开指定编号的摄像头编号0表示默认摄像头如果你的计算机连接了多个摄像头你可以使用不同的编号来选择不同的摄像头
2打开视频文件
cv::VideoCapture capture(const std::string filename)参数解释
filename打开指定的视频文件你需要提供视频文件的路径和名称作为参数
3打开网络摄像头
cv::VideoCapture capture(const std::string apiKey, const std::string deviceId)参数解释
用于打开网络摄像头需要提供相应的API密钥和设备ID
4打开图像序列
cv::VideoCapture capture(const std::string pattern, int api)参数解释
用于打开图像序列需要提供文件名模式(通配符)和相应的API
2、cv::VideoCapture类的常用方法
1capture.get()用于获取视频的属性比如帧数、帧率等
capture.get(int propId)参数解释
propId是一个整数参数用于指定你想获取的属性类型cv::CAP_PROP_FRAME_COUNT获取视频的帧数cv::CAP_PROP_FPS获取视频的帧率每秒帧数cv::CAP_PROP_FRAME_WIDTH视频帧的宽度cv::CAP_PROP_FRAME_HEIGHT视频帧的高度
)
示例
#include opencv2\opencv.hpp
#include iostream
#include demo.husing namespace cv;
using namespace std;int main() {// 初始化一个cv::VideoCapture对象打开视频文件VideoCapture capture(C:\\cpp\\image\\cayenne.mp4);if (!capture.isOpened()) {std::cerr Error: 无法打开视频文件. std::endl;return -1;}// 调用cv::VideoCapture类的get()方法获取视频宽度高度帧数帧率int frameWidth capture.get(cv::CAP_PROP_FRAME_WIDTH);int frameHeight capture.get(cv::CAP_PROP_FRAME_HEIGHT);int frameCount capture.get(cv::CAP_PROP_FRAME_COUNT);double fps capture.get(cv::CAP_PROP_FPS);std::cout frame width: frameWidth std::endl;std::cout frame height: frameHeight std::endl;std::cout Number of Frames: frameCount std::endl;std::cout FPS: fps std::endl;capture.release(); // 释放VideoCapture对象
}
2capture.set(int propId, double value)用于设置视频的属性比如设置视频的帧率、帧大小等属性
capture.set(int propId, double value)参数解释
propId指定了你想设置的属性类型
value要设置的值
示例
cv::VideoCapture capture(0); // 打开默认摄像头if (!capture.isOpened()) {std::cerr Error: 无法打开摄像头. std::endl;return -1;
}capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
capture.set(cv::CAP_PROP_FRAME_HEIGHT, 720);
capture.set(cv::CAP_PROP_FPS, 30);capture.release(); // 释放VideoCapture对象
3capture.read(cv::Mat frame)用于读取视频的一帧将其存储在 cv::Mat 对象中
示例
cv::VideoCapture capture(video_file.mp4);if (!capture.isOpened()) {std::cerr Error: 无法打开视频文件. std::endl;return -1;
}cv::Mat frame;
capture.read(frame);// 在这里可以对 frame 进行处理capture.release(); // 释放VideoCapture对象
4capture.release()用于释放 VideoCapture 对象所占用的资源一般在你已经完成了对视频流的操作后调用它
二、对视频帧进行处理 循环遍历视频的每一帧可以在循环内部对每一帧进行处理在这里我注释掉了处理部分你可以根据需要添加各种图像处理操作比如滤波、边缘检测等 代码示例
#include opencv2\opencv.hpp
#include iostream
#include demo.husing namespace cv;
using namespace std;int main() {// 打开视频文件VideoCapture capture(C:\\cpp\\image\\cayenne.mp4);// 检查视频是否成功打开if (!capture.isOpened()) {std::cerr Error: 无法打开视频文件. std::endl;return -1;}// 获取视频的帧数和帧率int frameCount capture.get(cv::CAP_PROP_FRAME_COUNT);double fps capture.get(cv::CAP_PROP_FPS);// 创建一个VideoWriter对象来保存处理后的视频cv::VideoWriter outVideo(outVideo.mp4, capture.get(CAP_PROP_FOURCC), fps, cv::Size(capture.get(cv::CAP_PROP_FRAME_WIDTH), capture.get(cv::CAP_PROP_FRAME_HEIGHT)));// 循环处理视频的每一帧for (int i 0; i frameCount; i) {cv::Mat frame;capture frame; // 读取一帧if (frame.empty()) {break;}// 在这里可以对frame进行处理比如进行滤波、边缘检测等// 例如cv::cvtColor(frame, frame, cv::COLOR_BGR2GRAY);// 将处理后的帧写入输出视频文件outVideo frame;}// 释放VideoCapture和VideoWriter对象capture.release();outVideo.release();std::cout 视频处理完成. std::endl;
}
三、保存处理后的视频
1、cv::VideoWriter 是opencv中用于将图像帧序列保存为视频文件的类它可以将处理过的帧写入一个视频文件也可以将视频流输出到摄像头或网络
1创建一个 cv::VideoWriter 对象
函数原型
cv::VideoWriter writer(const String filename, int fourcc, double fps, Size frameSize, bool isColor true)参数解释
filename要保存的视频文件名或者设备地址
fourccFourCC编码指定视频编解码器的类型(cv::VideoWriter::fourcc(X,V,I,D)Xvid编解码器cv::VideoWriter::fourcc(M,J,P,G)MJPEG编解码器cv::VideoWriter::fourcc(M,P,4,V)MPEG-4编解码器cv::VideoWriter::fourcc(H,2,6,4)H.264编解码器
)
fps帧率即每秒显示的帧数
frameSize帧的大小可以通过cv::Size类指定
isColor指定保存的视频是否为彩色默认为true
2、cv::VideoWriter类的常用方法
1cv::VideoWriter::open()用于打开一个视频文件或设备以便写入视频帧
cv::VideoWriter::open(const String filename, int fourcc, double fps, Size frameSize, bool isColor true)参数解释参数和构造函数类似
filename要保存的视频文件名或者设备地址
fourccFourCC编码指定视频编解码器的类型(cv::VideoWriter::fourcc(X,V,I,D)Xvid编解码器cv::VideoWriter::fourcc(M,J,P,G)MJPEG编解码器cv::VideoWriter::fourcc(M,P,4,V)MPEG-4编解码器cv::VideoWriter::fourcc(H,2,6,4)H.264编解码器
)
fps帧率即每秒显示的帧数
frameSize帧的大小可以通过cv::Size类指定
isColor指定保存的视频是否为彩色默认为true
2cv::VideoWriter::write()用于将一帧图像写入视频文件
cv::VideoWriter::write(const Mat image)参数解释
image要写入视频的帧通常是一个cv::Mat对象
3cv::VideoWriter::isOpened()用于检查VideoWriter对象是否成功打开如果成功打开了视频文件或者设备该方法将返回true否则返回false
4cv::VideoWriter::release()用于释放VideoWriter对象所占用的资源一般在你已经完成了对视频的写入操作后调用它
示例 我们首先创建了一个 VideoWriter 对象指定了视频文件的名称、FourCC编码、帧率和帧大小。接着我们检查是否成功打开了文件。然后我们创建了一个红色的帧640x480 大小的纯红色图像并将其写入视频文件10次。最后我们释放了 VideoWriter 对象。 #include opencv2\opencv.hpp
#include iostream
#include demo.husing namespace cv;
using namespace std;int main() {Demo demo;// 初始化一个cv::VideoCapture对象打开视频文件VideoCapture capture(C:\\cpp\\image\\cayenne.mp4);// 调用cv::VideoCapture类的get()方法获取视频宽度高度帧数帧率int frame_width capture.get(CAP_PROP_FRAME_WIDTH);int frame_height capture.get(CAP_PROP_FRAME_HEIGHT);int count capture.get(CAP_PROP_FRAME_COUNT);double fps capture.get(CAP_PROP_FPS);std::cout frame width: frame_width std::endl;std::cout frame height: frame_height std::endl;std::cout FPS: fps std::endl;std::cout Number of Frames: count std::endl;// 初始化一个cv::VideoWriter 对象保存处理后的视频文件// capture.get(CAP_PROP_FOURCC)获取原视频的编解码器// Size(frame_width, frame_height)原视频的宽高VideoWriter writer(C:\\cpp\\image\\test.mp4, capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);Mat frame;while (true) {// 读取视频的一帧将其存储在frame对象中capture.read(frame);// TODO: do something...// 对读取到的这帧图像做flip()翻转处理flip(frame, frame, 1);if (frame.empty()) {break;}// 显示这帧图像imshow(frame, frame);// 对这帧图像做色彩空间转换demo.colorSpace(frame);// 将这帧图像写入视频文件writer.write(frame);int c waitKey(1);if (c 27) { // 退出break;}}// releasecapture.release();writer.release();
}
做色彩空间转换 demo.colorSpace()函数如下
void Demo::colorSpace(Mat image) {Mat gray, hsv;// 转hsvcvtColor(image, hsv, COLOR_BGR2HSV);// 转灰度cvtColor(image, gray, COLOR_BGR2GRAY);// 显示这两张图imshow(HSV,hsv);imshow(GARY, gray);// 保存这两张图imwrite(C:\\cpp\\vs\\opencv\\hsv.png, hsv);imwrite(C:\\cpp\\vs\\opencv\\gray.png, gray);}