Opencv学习笔记(七)视频流1
来源:互联网 发布:北京碧水源 知乎 编辑:程序博客网 时间:2024/05/17 21:44
看了TLD的视频,热血沸腾啊。测试了一下C++版本的,发现速度有点慢,matlab版本的还未测试,不知道速度如何,不过看作者的视频实时性真他妈够好的。过段时间研究研究,C++的速度改快一点,不过其涉及的东西甚多,任重而道远。不过感觉速度快了的话这货前景非常广啊。
言归正转,opencv cookbook看到最后一章了,传个用c++类封装的opencv视频读取处理的代码。
#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边缘检测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 ("bike.avi"); processor.displayInput ("Current Frame"); processor.displayOutput ("Output Frame"); //设置每一帧的延时 processor.setDelay (1000./processor.getFrameRate ()); //设置帧处理函数,可以任意 processor.setFrameProcess (canny ); processor.run (); return 0;}
视频处理效果贴图附上一张:
- Opencv学习笔记(七)视频流1
- OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui
- OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui
- OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui
- OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算
- opencv学习笔记(1):基于balser相机的视频流显示通过opencv实现
- OpenCV学习笔记系列(七)
- OpenCV学习笔记(七)椒盐噪声
- OpenCV学习笔记(七)Lucas-…
- openCV学习笔记(七):傅里叶变换
- 软件工程视频学习笔记(七)
- 张孝祥java视频学习笔记(七)
- Opencv学习笔记(八)视频流2
- opencv(C++)视频流读入-学习笔记3
- openCV学习笔记(3)-- 写入视频
- opencv学习笔记(二)播放视频
- OpenCV学习笔记之七
- OpenCV Python学习笔记(七)
- Android面试之----Android系统架构图及简单的系统架构介绍
- vc中socket编程步骤及实例
- Linux命令行技巧
- 系统性能优化的常见八大误区
- web.xml中--使用监听器Servlet
- Opencv学习笔记(七)视频流1
- JSON 格式详解
- 飞鱼效果
- spring应用中web.xml的设置
- 疯狂的IT人整理Apache、Tomcat集群和负载均衡
- vb两位数相乘程序
- 多继承的构造顺序
- otl通过myodbc连接mysql
- linux定时任务的设置