对视频的处理其实很简单,就是对图像的处理,但我们要让对视频的处理看着十分清晰,不会造成混乱的感觉,就要定义一个视频处理的类VideoProcess
在这个类中,我们要定义视频,视频中的帧,处理后的结果,视频的延迟作为类的属性
定义获得视频,运行视频帧,帧处理,显示图像的方法
class VideoProcess
{
private:
double delay;
cv::Mat Frame;
cv::Mat Result;
cv::VideoCapture capture;
public:
void get_capture(std::string name);
void run();
cv::Mat process(cv::Mat &img, cv::Mat &out);
void display(cv::Mat &Frame, cv::Mat Result);
};
之后,我们就可以按照
读取视频——>运行视频帧——>处理视频帧——>显示图像进行类中每个方法的编写。
这样做的好处最明显的就是可以极大的减少主函数的代码量,使得程序更加简介清楚。
源代码:
//VideoProcess视频处理类
#pragma once
#include "stdafx.h"
#include <opencv2\opencv.hpp>
class VideoProcess
{
private:
double delay;
cv::Mat Frame;
cv::Mat Result;
cv::VideoCapture capture;
public:
void get_capture(std::string name);
void run();
cv::Mat process(cv::Mat &img, cv::Mat &out);
void display(cv::Mat &Frame, cv::Mat Result);
};
//类的方法
#include "stdafx.h"
#include "VideoProcess.h"
void VideoProcess::get_capture(std::string name)
{
capture.open(name);
if (!capture.isOpened())
{
std::cout << "打开失败" << std::endl;
}
int rate = capture.get(CV_CAP_PROP_FPS);
delay = 1000 / rate;
}
void VideoProcess::run()
{
while (capture.read(Frame))
{
Result = process(Frame, Result);
display(Frame, Result);
}
}
cv::Mat VideoProcess::process(cv::Mat &img, cv::Mat &out)
{
cv::cvtColor(img, out, cv::COLOR_RGB2GRAY);
cv::Canny(out, out, 100, 200);
return out;
}
void VideoProcess::display(cv::Mat &Frame, cv::Mat Result)
{
cv::imshow("Before", Frame);
cv::imshow("After", Result);
cv::waitKey(delay);
}
//主函数
#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include "VideoProcess.h"
int main()
{
VideoProcess process;
std::string name;
std::cin >> name;
process.get_capture(name);
process.run();
return 0;
}