cv::VideoCapture capture(const string& filename); // 输入文件名
cv::VideoCapture capture(0); // 视频捕捉设备
将视频帧读取到cv::Mat矩阵中,有两种方式:一种是read()操作;另一种是 “>>”操作。
cv::Mat frame;
cap.read(frame); //读取方式一
cap >> frame; //读取方式二
调用摄像头采集图像
#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
//从摄像头读入图像
VideoCapture capture(0);
while (1)//循环显示每一帧
{
Mat frame;//Mat变量存储每一帧图像
capture >> frame;//读取当前帧
imshow("读取视频", frame);//显示当前帧
waitKey(30);//延时30秒
}
return 0;
}
注:需要打开某个现成视频图像时,将0替换为"./xxx.avi"即可。
实时处理视频
其实就是对每一帧进行处理,frame作为图像,进行处理即可。
cv::VideoWriter out(
"my_video.avi", //视频文件名和路径
CV_FOURCC('M','J','P','G'), // MPEG-4 编码
30.0, // 帧率 (FPS)
cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
true // 只输入彩色图,如果是false,可传入灰度图像
);
向创建后的VideoWriter对象写入图像也有两种方式,即write()操作和“<<”操作
out.write(const Mat& image); // 写入图像作为下一帧
my_video_writer << my_frame;
调用相机生成视频并保存
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(){
//打开相机
VideoCapture vcap(0);
if (!vcap.isOpened()){
cout << "Error opening video stream or file" << endl;
return -1;
}
int frame_width = vcap.get(CV_CAP_PROP_FRAME_WIDTH);
int frame_height = vcap.get(CV_CAP_PROP_FRAME_HEIGHT);
//保存视频
VideoWriter video("out.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, Size(frame_width, frame_height), true);
//需要for循环可以Ctrl+C终端录制
for (;;){
Mat frame;
vcap >> frame;
video.write(frame);
imshow("Frame", frame);
char c = (char)waitKey(33);
if (c == 27) break;
}
return 0;
}
切割视频为图像序列
#include <iostream>
#include <vector>
#include "opencv2\highgui\highgui.hpp"
using namespace std;
using namespace cv;
void video2image(string video, string path)
{
VideoCapture capture(video);
long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
cout << "total frames is:" << totalFrameNumber << "." << endl;
//设置开始帧
long frameToStart = 1;
capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);
cout << "from" << frameToStart << "read" << endl;
//设置结束帧
int frameToStop = 10;
//获取帧率
double rate = capture.get(CV_CAP_PROP_FPS);
cout << "rate is:" << rate << endl;
double delay = 1000 / rate;
//定义一个用来控制读取视频循环结束的变量
bool stop = false;
long currentFrame = frameToStart;
if (!capture.isOpened())
{
cerr << "Failed to open a video" << endl;
return;
}
Mat frame;
int num = 1;
string filename;
char temp_file[15];
while (!stop)
{
capture >> frame;
if (frame.empty())
break;
_itoa_s(num, temp_file, 4, 10); //4表示字符长度,10表示十进制,_itoa_s实现整型转字符串
filename = temp_file;
filename = path + filename + ".jpg";
cout << "now is reading" << currentFrame << "." << endl;
imshow("Extractedframe", frame);
cout << "now is writing" << currentFrame << "." << endl;
imwrite(filename, frame);
int c = waitKey(delay);
//按下ESC或者到达指定的结束帧后退出读取视频
if ((char)c == 27 || currentFrame > frameToStop)
{
stop = true;
}
//按下按键后会停留在当前帧,等待下一次按键
if (c >= 0)
{
waitKey(0);
}
num++;
currentFrame++;
}
capture.release();
waitKey(0);
}
int main(int argc, char** argv)
{
string videoFromfile = ".\\out.avi"; //读取视频
string Imagespath = ".\\image\\"; // 保存图片的文件夹路径一定要有,因为OpenCV不会自动创建文件夹
video2image(videoFromfile, Imagespath);
return 0;
}
接下考虑实际使用时应该是调用摄像头直接生成图像序列,并不是先生成视频再切割为图像序列的。
下面的代码是自己修改的,只能产生了视频,并没有同时产生图像序列,有待完善
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
/*------------------采集保存视频avi--------------------*/
//开启电脑摄像头
VideoCapture cap(0);
if (!cap.isOpened()){
cout << "Error opening video stream or file" << endl;
return -1;
}
int frame_width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
int frame_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
//保存视频格式为avi, 编码为MJPG
VideoWriter video("image1.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, Size(frame_width, frame_height), true);
//需要for循环可以Ctrl+C终止录制
for (;;){
Mat frame;
cap >> frame;
video << frame;
imshow("Frame", frame);
waitKey(30);
}
/*------------------裁剪为图像序列--------------------*/
//读取视频
VideoCapture cap0("image1.avi");
if (!cap0.isOpened())
cout << "no video" << endl;
Mat frame0;
int num = 1;
string filename;
char temp_file[15];
string path = ".\\image1";
for (int i = 1;; i++)
{
cap0 >> frame0;
if (frame0.empty())
break;
_itoa_s(num, temp_file, 4, 10);//整型转字符串
filename = temp_file;
filename = path + filename + ".jpg";
num++;
imwrite(filename, frame0);
}
cap0.release();
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)