Opencv学习笔记(七)视频流1

原创 2012年03月28日 11:38:45

    看了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学习笔记(十一)目标跟踪

原创文章,转载请注明:http://blog.csdn.net/crzy_sparrow/article/details/7414851     如果摄像机是固定的,那么我们可以认为场景(背...
  • crzy_sparrow
  • crzy_sparrow
  • 2012年03月31日 11:12
  • 64394

getframe

clear;clc;clf; x=0:pi/100:2*pi; y=sin(x); plot(x,y) set(gcf,'color',[1 1 1]) %设置背景色为白色 title('测...
  • u012116229
  • u012116229
  • 2015年03月26日 18:48
  • 397

MATLAB getframe用法

MATLAB getframe用法  (2010-08-22 18:00:00) 标签:  matlab   像素数   rgb   of   ...
  • u014650111
  • u014650111
  • 2014年09月03日 10:10
  • 527

OpenCV学习笔记大集锦

转载自: OpenCV学习笔记大集锦 – 视觉机器人 http://www.cvrobot.net/collect-opencv-resource-learn-study-note-chinese...
  • qq_26898461
  • qq_26898461
  • 2016年01月06日 09:49
  • 1422

opencv视频流的读取和处理

Opencv提供一个简单易用的框架以提取视频文件和USB摄像头中的图像帧,如果只是想读取某个视频,你只需要创建一个VideoCapture实例,然后在循环中提取每一帧。下面是一个简单的代码 #incl...
  • neal1991
  • neal1991
  • 2015年04月12日 13:16
  • 4823

Opencv学习笔记目标跟踪

原创文章,转载请注明:http://blog.csdn.NET/crzy_sparrow/article/details/7414851     如果摄像机是固定的,那么我们可以认为场景(背景...
  • Alisa_xf
  • Alisa_xf
  • 2017年06月02日 18:24
  • 414

opencv动态目标跟踪学习总结

用opencv实现对视频中动态目标的追踪 第一步,是要建立一个编程环境,然后加载opencv的库路径等等。具体步骤在 http://www.opencv.org.cn/ 的“安装”中 有详细介绍。 ...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月15日 11:03
  • 16338

最优化学习笔记(十七)——拟牛顿法(3)

秩1修正公式    在秩1修正公式中,修正项为αkz(k)z(k)T,αk∈R,z(k)∈Rn\alpha_k\boldsymbol{z}^{(k)}\boldsymbol{z}^{(k)T}, \a...
  • chunyun0716
  • chunyun0716
  • 2017年01月08日 14:43
  • 461

opencv学习笔记(1)-opencv安装

1.opencv版本的选择
  • q6541oijhk
  • q6541oijhk
  • 2014年10月30日 11:10
  • 600

基于opencv的简单视频处理类示例

#include "opencv2/opencv.hpp" using namespace std; using namespace cv; class VideoProcessor {...
  • Gone_HuiLin
  • Gone_HuiLin
  • 2016年11月19日 09:50
  • 782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Opencv学习笔记(七)视频流1
举报原因:
原因补充:

(最多只允许输入30个字)