OpenCV VideoCapture 类

OpenCV VideoCapture 类
OpenCV 0630学习笔记学习内容imread() 读取图片namedWindow() 创建窗口imshow() 显示图片imwrite() 保存图片destroyAllWindows() 销毁窗口waitKey() 等待Mat 图像属性1)empty() 判断文件读取是否为空2)rows 获取图像行数高度3)cols 获取图像列数长度4)chanels() 获取图像通道数5)depth() 获取图像位深度OpenCV VideoCapture 类1)open() 打开视频或摄像头2)isOpened() 判断读取视频文件是否正确正确返回true3)release() 关闭视频流文件4)get() 返回指定视频类的相关参数信息为了方便期间我采用了类的头文件在类中编写方法体主函数中进行不同功能的调用。1.创建新项目并配置OpenCV开发环境配置包含目录配置库目录Debug带dRelease 不带d2.案例 ① 读取摄像头/视频案例①读取摄像头指定按键escascii码值为27退出浏览1.创建并编辑QuickDemo.h#pragma once #includeopencv2/opencv.hpp #includeiostream using namespace cv; using namespace std; class QuickDemo { public:void OpenCamera1(); };2.创建并编辑QuickDemo.cpp#include QuickDemo.h /// summary /// 案例①读取摄像头指定按键escascii码值为27退出浏览 /// /summary void QuickDemo::OpenCamera1() { //1.创建视频捕获对象 VideoCapture cap; //打开默认摄像头参数0代表本机摄像头 cap.open(0); //2.判断是否打开成功 isOpened() if (!cap.isOpened()) { cout 摄像头打开失败! endl; return; } cout 打开本地摄像头 endl; //3.创建图片数据对象 Mat frame; while (true) { //读取一帧画面 cap.read(frame); //读到空帧就退出 if (frame.empty()) break; namedWindow(本地摄像头,WINDOW_FREERATIO);//方便调节大小 imshow(本地摄像头,frame); //等待Esc按键ESC键退出 int key waitKey(20); if (key 27) { cout 按下Esc退出 endl; break; } } //4.realese()释放摄像头资源 cap.release(); destroyAllWindows(); return; }3.创建主程序并编辑main.cpp#include QuickDemo.h #include iostream #include opencv2/opencv.hpp using namespace std; using namespace cv; int main() { QuickDemo qd; //案例①读取摄像头指定按键escascii码值为27退出浏览 qd.OpenCamera1(); }3.案例②③ 读取摄像头/视频截取保存图片案例②③读取摄像头指定按键qascii码值为113按序号保存图片并指定按键escascii码值为27退出浏览案例②③读取摄像头指定按键wascii码值为119按时间保存图片指定按键escascii码值为27退出浏览在QuickDemo.h中添加void SavePic(); void SavePicByOrder(Mat iamge,int order); void SavePicByTime(Mat iamge);在QuickDemo.cpp中编写函数主体/// summary /// 案例②③读取摄像头指定按键qascii码值为113按序号保存图片指定按键wascii码值为119按时间保存图片并指定按键escascii码值为27退出浏览 /// /summary void QuickDemo::SavePic() { //1.创建视频捕获对象 VideoCapture cap; //打开默认摄像头参数0代表本机摄像头 cap.open(0); //2.判断是否打开成功 isOpened() if (!cap.isOpened()) { cout 摄像头打开失败 endl; return; } //3.创建图片数据对象 Mat frame; while (true) { //读取一帧画面 cap.read(frame); //读到空帧就退出 if (frame.empty()) break; namedWindow(本地摄像头, WINDOW_FREERATIO);//方便调节大小 imshow(本地摄像头,frame); //等待Esc按键ESC键退出 int key waitKey(20); switch (key) { case 113: //按键q,按序号保存 { cout 按键q, 按序号保存 endl; SavePicByOrder(frame,order);break; } case 119: //按键w,按时间保存 { cout 按键w, 按时间保存 endl; SavePicByTime(frame);break; } case 27: { cout 按键Esc,退出 endl; return; } } } //4.release()释放摄像头资源 cap.release(); destroyAllWindows(); } /// summary /// 按顺序保存图片 /// /summary void QuickDemo::SavePicByOrder(Mat image,int order) { cout 按序号保存图片 endl; string path D:\\img\\outImage\\num\\outto_string(order)Image.jpg; imwrite(path, image); cout 保存成功 path endl; } /// summary /// 获取当前时间 /// /summary /// returns时间字符串/returns static string GetNowTime() { auto now chrono::system_clock::now(); time_t t chrono::system_clock::to_time_t(now); tm local_tm; localtime_s(local_tm, t);//安全版本 char buf[64]; strftime(buf, sizeof(buf), %Y%m%d_%H%M%S, local_tm); return string(buf); } /// summary /// 按时间保存图片 /// /summary void QuickDemo::SavePicByTime(Matimage) { cout 按时间保存 endl; cout 当前时间为 GetNowTime(); string path D:\\img\\outImage\\time\\out GetNowTime() Image.jpg; imwrite(path, image); cout 保存成功 path endl; }在主程序main.cpp中调用#include QuickDemo.h #include iostream #include opencv2/opencv.hpp using namespace std; using namespace cv; int main() { QuickDemo qd; //案例②③读取摄像头 // 指定按键qascii码值为113按序号保存图片 // 指定按键wascii码值为119按时间保存图片并指定按键escascii码值为27退出浏览 qd.SavePic(); }4.案例④⑤ 读取视频/摄像头截取保存视频案例④读取摄像头指定按键escascii码值为27退出浏览并保存视频案例⑤读取摄像头指定按键aascii码值为97开始录制视频指定按键sascii码值为115停止录制并保存视频指定按键escascii码值为27退出浏览在QuickDemo.h添加void OpenAndSaveVideo();在QuickDemo.cpp编写函数主体/// summary ///案例④⑤读取摄像头指定按键aascii码值为97开始录制视频指定按键sascii码值为115停止录制并保存视频指定按键escascii码值为27退出浏览 /// /summary void QuickDemo::OpenAndSaveVideo() { //创建视频流对象 VideoCapture vcp; vcp.open(D:\\img\\video\\test.avi); if (!vcp.isOpened()) { cout 视频打开失败; return; } cout 视频打开成功 endl; int vcFps vcp.get(CAP_PROP_FPS);//获取帧率 int vcWidth vcp.get(CAP_PROP_FRAME_WIDTH);//获取宽度 int vcHeight vcp.get(CAP_PROP_FRAME_HEIGHT);//获取高度 //创建视频读取流对象 VideoWriter vw; bool IsStart false;//是否开始录制 int frameCount 0; string path; int order 1; while (true) { Mat frame;//创建图片数据对象 vcp.read(frame);//从视频流读取图片 if (frame.empty()) { break; }//读取为空则结束 namedWindow(显示视频,WINDOW_FREERATIO);//方便调节大小 imshow(显示视频, frame); int key waitKey(20); switch (key) { case 97: //按下a开始录制 { IsStart true; cout 开始录制: endl; path D:\\img\\outvideo\\out to_string(order) .mp4; vw.open(path, CAP_PROP_FOURCC, vcFps, Size(vcWidth, vcHeight)); break; } case 115: { IsStart false; cout 停止录制 endl; cout path 保存成功; vw.release(); break; } case 27: { cout 退出程序 endl; vw.release(); vcp.release(); destroyAllWindows(); return; } } if (IsStart) { frameCount; cout 当前帧数:frameCount endl; vw.write(frame); } } }在主程序mainn.cpp中调用qd.OpenAndSaveVideo();5.案例⑥ 设置文件格式的三种方式案例⑥批量读取图片有序的图片,多种字符串拼接的方法在QuickDemo.h中添加方法void ReadPicByOrder();在QuickDemo.cpp中添加函数主体/// summary /// 读取图片文件名采用多种字符串拼接的方式 /// /summary void QuickDemo::ReadPicByOrder() { //第一种字符串拼接方法使用 string str1 D:\\img\\image\\00; string str2; string str3 .png; string fileName, windowName; //第二种字符串拼接方法使用字符数组 char fileNameArray[50]; char windowNameArray[20]; //第三种字符串拼接方式使用format()进行格式化 string fName, wName; for (int index 1;index 9;index) { fileName str1 to_string(index) str3; //windowName 图像显示 to_string(index); //当窗口的名称随着index变化而变化的时候会连续打开不同的窗口 windowName 图像显示; //当窗口的名称不发生改变的时候图片会在同一个窗口内依次展示 Mat img imread(fileName); namedWindow(windowName, WINDOW_FREERATIO); imshow(windowName, img); waitKey(1000); //每隔开1000ms,循环播放图片 } //第二种字符串拼接方法使用字符数组格式化字符串 for (int index 1;index 9;index) { sprintf_s(fileNameArray, D:\\img\\image\\00%d.png, index); sprintf_s(windowNameArray, 图像显示%d, index); Mat img imread(fileNameArray); namedWindow(windowNameArray, WINDOW_FREERATIO); imshow(windowNameArray, img); waitKey(1000); //每隔开1000ms,循环播放图片 } //第三种字符串拼接方法使用format()格式化字符串 for (int index 1;index 9;index) { fName format(D:\\img\\image\\00%d.png, index); wName format(图像显示%d, index); Mat img imread(fName); namedWindow(wName, WINDOW_FREERATIO); imshow(wName, img); waitKey(1000); //每隔开1000ms,循环播放图片 } destroyAllWindows(); }在主程序main.cpp中调用qd.ReadPicByOrder();6.案例⑦⑧视频的分解与合成案例⑦视频分解,读取视频并分解为一张一张的图片保存案例⑧图片合成视频:将一张一张的图片合成为视频保存在头文件QuickDemo.h 中添加方法void VideoToPics(); void PicsToVideo();在QuickDemo.cpp中添加函数主体/// summary /// 把视频分割为图片 /// /summary void QuickDemo::VideoToPics() { VideoCapture vcp;//创建视频捕获对象 vcp.open(D:\\img\\video\\test.mp4);//读取本地文件 if (!vcp.isOpened()) { cout 视频打开失败endl; return; } int frameCount 0; while (true) { Mat frame;//创建图片数据对象 vcp.read(frame);//从视频流读取图片 if (frame.empty()) { return; };//读取为空则结束 cout 当前帧数 frameCount endl; imshow(显示视频,frame); imwrite(D:\\img\\outImage\\num\\to_string(frameCount).jpg, frame); waitKey(20); frame.release();//释放图片对象 } vcp.release();//关闭视频流 } /// summary /// 把图片合成视频 /// /summary void QuickDemo::PicsToVideo() { VideoWriter vw;//创建视频写入器 int fourcc VideoWriter::fourcc(m, p, 4, v); double fps 25; Size imgSize(720, 1280);//图片实际宽×高 vw.open(D:\\img\\outvideo\\out.mp4,fourcc,fps,imgSize); if (!vw.isOpened()) { return; }//写入器打开失败默认返回 string fileName; int frameCount 0; while (true) { fileName format(D:\\img\\outImage\\num\\%d.jpg,frameCount); Mat frame imread(fileName); cout 正在读取: fileName endl; if (frame.empty()) { break; }//读取为空结束 imshow(显示视频,frame); vw.write(frame); waitKey(20); frame.release();//释放图片资源 } cout 成功合成 endl; vw.release();//释放写入器 destroyAllWindows(); }在主程序main.cpp调用//案例⑦视频分解,读取视频并分解为一张一张的图片保存 //qd.VideoToPics(); //案例⑧图片合成视频:将一张一张的图片合成为视频保存 qd.PicsToVideo();所需素材下载下载后把原来文件名0630img改为img放在D盘下通过网盘分享的文件0630img.zip 链接: 百度网盘 请输入提取码 提取码: nnrk链接失效请给我留言。如果不足请业界大佬批评指正。