当前位置: 首页 > 编程日记 > 正文

基于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边缘检测  
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;  
}

相关文章:

flex数据绑定

2019独角兽企业重金招聘Python工程师标准>>> 1 、方法绑定 [Bindable(event"myFlagChanged")] private function isEnabled():String { if (myFlag)return true; else return ‘false; } <mx:TextArea id"myTA" text"{isEnabled()}&…

【error】error: field * has incomplete type

在编译程序是出现了如题错误&#xff0c; 类或结构体有前向声明的用法&#xff0c;编译到这里时还没有发现定义&#xff0c;不知道该类或者结构的内部成员&#xff0c;没有办法具体的构造一个对象&#xff0c;所以会报错。 两种解决方法&#xff1a; 方法一&#xff1a;将类成员…

Web前端学习笔记:Vue生命周期理解

一、感谢原创博主 示例代码出处vue2.0 探索之路——生命周期和钩子函数的一些理解 官方文档 二、生命周期简单描述 总共分为8个阶段创建前/后&#xff0c;载入前/后&#xff0c;更新前/后&#xff0c;销毁前/后。 创建前/后 在beforeCreated阶段&#xff0c;vue实例的挂载元素…

获取结构体中变量的偏移量

C/C获取结构体中变量的偏移量 1.某些特殊需求下&#xff0c;我们需要知道某个变量在其结构体中的偏移位置。 通常的做法就是定义一个宏变量&#xff0c;如下&#xff1a; #define OFFSET(structure, member) ((int64_t)&((structure*)0)->member) // 64位系统 #defin…

VS2010 CUDA 5.5 VA_X Win7 64位配置

一.安装CUDA5.5以及配置VS助手 1、安装之前必须确认自己电脑的GPU支持CUDA。在设备管理器中找到显示适配器&#xff08;Display adapters)&#xff0c;找到自己电脑的显卡型号&#xff0c;如果包含在http://www.nvidia.com/object/cuda_gpus.html的列表中&#xff0c;说明支持…

SmartRoute之大规模消息转发集群实现

为什么80%的码农都做不了架构师&#xff1f;>>> 消息转发的应用场景在现实中的应用非常普遍&#xff0c;我们常用的IM工具也是其中之一&#xff1b;现有很多云平台也提供了这种基础服务&#xff0c;可以让APP更容易集成相关功能而不必投入相应的开发成本。对于实现…

unity项目警告之 LF CRLF问题

unity中创建的脚本&#xff0c;以LF结尾。 Visual studio中创建的脚本&#xff0c;以 CRLF结尾。 当我们创建一个unity脚本后&#xff0c;再用VS打开编辑保存后&#xff0c;这个文件既有LF结尾符&#xff0c;也有CRLF结尾符。 解决办法&#xff1a;更改unity的代码生成模板&…

Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW

1.总结 对于基本数据类型和自定义类型&#xff0c;我们需要用预编译指令来保证栈内存的对齐&#xff0c;用重写operator new的方式保证堆内存对齐。对于嵌套的自定义类型&#xff0c;申请栈内存时会自动保证其内部数据类型的对齐&#xff0c;而申请堆内存时仍然需要重写operat…

c/c++文件遍历

//CBrowseDir.h#pragma once#include <stdlib.h> #include <direct.h> #include <string.h> #include <io.h> #include <stdio.h> #include <iostream> using namespace std; class CBrowseDir { protected: //存放初始目录的绝对…

优化应用启动时的体验

2019独角兽企业重金招聘Python工程师标准>>> 对于应用的启动时间&#xff0c;只能是尽量的避免一些耗时的、非必要性的操作在主线程中&#xff0c;这样相对减少一部分启动的耗时&#xff0c;同时在等待第一帧显示的时间里&#xff0c;可以加入一些配置用来增加用户体…

系列四、SpringMVC响应数据和结果视图

2019独角兽企业重金招聘Python工程师标准>>> 项目结构如下 一、返回值分类 一 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称&#xff0c;根据视图解析器为物理视图的地址&#xff0c;根据字符串最后跳转到对应jsp页面 第一步、导入依赖坐标文件、配置…

numpy数组切片:一维/二维/数组

文章目录numpy数组切片操作一维数组&#xff08;冒号&#xff1a;&#xff09;1、一个参数&#xff1a;a[i]2、两个参数&#xff1a;ba[i:j]3、三个参数&#xff1a;格式b a[i:j:s]4、例子二维数组&#xff08;逗号&#xff0c;&#xff09;取元素 X[n0,n1]切片 X[s0:e0,s1:e1…

行列式求值、矩阵求逆

#include <iostream> #include <string> #include <assert.h> #include <malloc.h> #include <iostream> #include <stdlib.h> #include <memory.h> #include <time.h>using namespace std;//动态分配大小位size的一维数组 te…

IP 地址子网划分

1.你所选择的子网掩码将会产生多少个子网2的x次方-2(x代表网络位借用主机的位数&#xff0c;即2进制为1的部分&#xff0c;现在的网络中&#xff0c;已经不需要-2&#xff0c;已经可以全部使用&#xff0c;不过需要加上相应的配置命令&#xff0c;例如CISCO路由器需要加上ip su…

git rebase 和 git merger

& git merge 在上图中&#xff0c;每一个绿框均代表一个commit。除了c1&#xff0c;每一个commit都有一条有向边指向它在当前branch当中的上一个commit。 图中的项目&#xff0c;在c2之后就开了另外一个branch&#xff0c;名为experiment。在此之后&#xff0c;master下的修…

matplotlib绘制三维轨迹图

1. 绘制基本三维曲线 # import necessary module from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt import numpy as np# load data from file # you can replace this using with open data1 np.loadtxt("./pos.txt") # print (data1) n…

求一个矩阵的最大子矩阵

#include <iostream> #include <string> #include <assert.h> #include <malloc.h> #include <iostream> #include <stdlib.h> #include <memory.h> #include <time.h> #include <limits.h>using namespace std;//动态分…

tcpdump抓包文件提取http附加资源

2019独角兽企业重金招聘Python工程师标准>>> 前面几篇文章铺垫了一大批的协议讲解&#xff0c;主要是为了提取pcap文件中http协议附加的资源。 1、解析pcap文件&#xff0c;分为文件格式头&#xff0c;后面就是数据包头和包数据了 2、分析每个包数据&#xff0c;数据…

smobiler介绍(二)

类似开发WinForm的方式&#xff0c;使用C#开发Android和IOS的移动应用&#xff1f;听起来感觉不可思议&#xff0c;那么Smobiler平台到底是如何实现的呢&#xff0c;这里给大家介绍一下。客户端Smobiler分为两种客户端&#xff0c;一种是开发版&#xff0c;一种是打包版开发版&…

Matplotlib基本用法

Matplotlib Matplotlib 是Python中类似 MATLAB 的绘图工具&#xff0c;熟悉 MATLAB 也可以很快的上手 Matplotlib。 1. 认识Matploblib 1.1 Figure 在任何绘图之前&#xff0c;我们需要一个Figure对象&#xff0c;可以理解成我们需要一张画板才能开始绘图。 import matplot…

HDU1201 18岁生日【日期计算】

18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 32851 Accepted Submission(s): 10649Problem DescriptionGardon的18岁生日就要到了&#xff0c;他当然很开心&#xff0c;可是他突然想到一个问题&am…

TypeScript 从听说到入门(上篇)

我为什么会这样念念又不忘 / 你用什么牌的箭刺穿我心脏 我也久经沙场 / 戎马生涯 / 依然 / 被一箭刺伤 ——李荣浩《念念又不忘》 接下来我会分上、下两篇文章介绍 TypeScript。 我也是 TypeScript 初学者&#xff0c;这两篇文章是我的学习笔记&#xff0c;来源于一个系列的免费…

SLAM前端中的视觉里程计和回环检测

1. 通常的惯例是把 VSLAM 分为前端和后端。前端为视觉里程计和回环检测&#xff0c;相当于是对图像数据进行关联&#xff1b;后端是对前端输出的结果进行优化&#xff0c;利用滤波或非线性优化理论&#xff0c;得到最优的位姿估计和全局一致性地图。 1 前端&#xff1a;图像数…

粗心导致的bug

不管是调试程序还是直接看输出i都为2&#xff0c;下面是运行时输出的&#xff1a; 用vs2010以前遇到更奇葩的事&#xff0c;这次用vs2013也是遇到奇葩&#xff0c;taskNumber值为2一定&#xff0c;下面两个循环体&#xff0c;每个循环体各执行一次&#xff0c;程序输出i 2真是…

gearman中任务的优先级和返回状态

gearman中任务的优先级和返回状态 一、任务的优先级 同步阻塞调用&#xff0c;等待返回结果 doLow:最低优先 doNomal:正常优先级 doHigh:最优先执行 异步派发任务&#xff0c;不等待返回结果&#xff0c;返回任务句柄&#xff0c;通过该句柄可获取任务运行状态信息 doLowBackgr…

VMware学习使用笔记

本人在学习基础上&#xff0c;结合实际项目实现总结的笔记。以下内容都是基于VMware vSphere 6.7的官方文档中vSAN的规划和部署而来&#xff0c;网址https://docs.vmware.com/cn/VMware-vSphere/index.html。 对于ESXi系统 对于内存不足512G&#xff0c;可以从USB或Micro SD引导…

【原】Java学习笔记020 - 面向对象

1 package cn.temptation;2 3 public class Sample01 {4 public static void main(String[] args) {5 // 成员方法的参数列表&#xff1a;6 // 1、参数列表中的数据类型是值类型7 // 2、参数列表中的数据类型是引用类型8 // A&#xff1a;…

win32 wmi编程获取系统信息

//GetSysInfo.h#pragma once#include <afxtempl.h>class GetSysInfo { public:GetSysInfo(void);~GetSysInfo(void);public: /********获取操作系统版本&#xff0c;Service pack版本、系统类型************/ void GetOSVersion(CString &strOSVersion,CString &…

cmake 注意事项

1. add_subdirectory()调用 CMake将在每次add_subdirectory()调用时创建一个新的变量作用域,因此这个参数最好的用法是放在cmaklists的最后使用&#xff0c;这样的话创建的新的变量的作用范围与内存的变化就不会影响到后面的变量的使用。 查看并打印在cmake里面定义的宏在&am…

Jmeter 使用自定义变量

有些情况下比如发起测试时URL的主机名和端口需要在采样器中出现多次&#xff0c;这样就有个问题&#xff0c;当测试的主机更改时&#xff0c; 我们需要修改主机名称&#xff0c;这时就需要修改多个地方&#xff0c;如果多的情况会有遗漏。如果我们在配置脚本的时候&#xff0c;…