基于opencv的简单视频处理类示例
2016-11-19 09:50
393 查看
#include "opencv2/opencv.hpp" using namespace std; using namespace cv; class VideoProcessor { private: VideoCapture caputure; //图像处理函数指针 void (*process)(Mat &,Mat &); bool callIt; string WindowNameInput; string WindowNameOutput; //延时 int delay; long fnumber; //第frameToStop停止 long frameToStop; //暂停标志 bool stop; public: VideoProcessor() : callIt(true),delay(0),fnumber(0),stop(false),frameToStop(-1){} //设置图像处理函数 void setFrameProcess(void (*process)(Mat &,Mat &)){ this->process = process; } //打开视频 bool setInput(string filename){ fnumber = 0; //若已打开,释放重新打开 caputure.release (); return caputure.open (filename); } //设置输入视频播放窗口 void displayInput(string wn){ WindowNameInput = wn; namedWindow (WindowNameInput); } //设置输出视频播放窗口 void displayOutput(string wn){ WindowNameOutput = wn; namedWindow (WindowNameOutput); } //销毁窗口 void dontDisplay(){ destroyWindow (WindowNameInput); destroyWindow (WindowNameOutput); WindowNameInput.clear (); WindowNameOutput.clear (); } //启动 void run() { Mat frame; Mat output; if(!isOpened()) return; stop = false; while(!isStopped()) { //读取下一帧 if(!readNextFrame(frame)) break; if(WindowNameInput.length ()!=0) imshow (WindowNameInput,frame); //处理该帧 if(callIt){ process(frame,output); } else{ output = frame; } if(WindowNameOutput.length ()!=0) imshow (WindowNameOutput,output); //按键暂停,继续按键继续 if(delay>=0&&waitKey (delay)>=0) waitKey(0); //到达指定暂停键,退出 if(frameToStop>=0&&getFrameNumber()==frameToStop) stopIt(); } } //暂停键置位 void stopIt(){ stop = true; } //查询暂停标志位 bool isStopped(){ return stop; } //返回视频打开标志 bool isOpened(){ return caputure.isOpened (); } //设置延时 void setDelay(int d){ delay = d; } //读取下一帧 bool readNextFrame(Mat &frame){ return caputure.read (frame); } void CallProcess(){ callIt = true; } void dontCallProcess(){ callIt = false; } //设置停止帧 void stopAtFrameNo(long frame){ frameToStop = frame; } // 获得当前帧的位置 long getFrameNumber(){ long fnumber = static_cast<long>(caputure.get ((CV_CAP_PROP_POS_FRAMES))); return fnumber; } //获取帧率 double getFrameRate(){ return caputure.get(CV_CAP_PROP_FPS); } }; //帧处理函数:canny边缘检测 static void canny(cv::Mat& img, cv::Mat& out) { //灰度变换 if (img.channels()==3) cvtColor(img,out,CV_BGR2GRAY); // canny算子求边缘 Canny(out,out,100,200); //颜色反转,看起来更舒服些 threshold(out,out,128,255,cv::THRESH_BINARY_INV); } int main(int argc, char *argv[]) { VideoProcessor processor; //打开输入视频 processor.setInput ("MAH00054.MP4"); processor.displayInput ("Current Frame"); processor.displayOutput ("Output Frame"); //设置每一帧的延时 processor.setDelay (1000./processor.getFrameRate ()); //设置帧处理函数,可以任意 processor.setFrameProcess (canny ); processor.run (); return 0; }
相关文章推荐
- [openCV]视频的读入与一些简单的图像处理
- 【OpenCV图像处理入门学习教程五】基于背景差分法的视频目标运动侦测
- 基于OpenCV之视频读取,处理和显示框架的搭建(一)
- OpenCV-Python learning-2.视频、相机简单处理
- 基于OpenCV之视频读取,处理和显示框架的搭建(一)
- 基于qml创建最简单的图像处理程序(3)-使用opencv&qml进行图像处理
- 基于Qt与OpenCV的图片读取、保存,并利用Canny进行简单的边缘处理结果显示
- 基于boost的bind与function的一个简单示例消息处理框架
- 基于OPENCV的视频图像处理算法和应用
- opencv 视频处理框架,面向对象,简单实用,可扩展
- avi视频的提取与处理(opencv)
- OpenCv视频处理函数
- 基于wince的网络音视频通信(简单易明版)
- 视频运动目标跟踪,基于opencv , vc++
- 推荐一款基于Java的音视频处理开源项目--JAVE
- OpenCV学习笔记(8)VS2008 MFC下使用OpenCV2.0进行简单图像处理
- HTML5简单示例-播放视频
- 一个简单的Opencv视频程序
- 基于wince的网络音视频通信(简单易明版)