文档库 最新最全的文档下载
当前位置:文档库 › 基于opencv目标跟踪与检测课程设计

基于opencv目标跟踪与检测课程设计

基于opencv目标跟踪与检测课程设计
基于opencv目标跟踪与检测课程设计

课程设计Ⅰ设计报告
题 学 姓 学
目:基于 Opencv 运动目标跟踪与检测 号: 名: 院: 信息学院 计算机软件 2 班 黄文培 2012.9.3
专业班级: 指导教师: 设计时间:
指导老师评语:
评定成绩:
签名:
日期:



本文先介绍一种开放源代码的计算机视觉类库OpenCV,主要阐述该类库的特点及 其结构,然后介绍本人学习opencv一些基本功能的实现以及结果。最后通过“检 测一个视频中的运动物体”这一实例探讨了使用OpenCV进行编程的方法。 关键词 图像处理 目标检测 OpenCV IplImage VC++

目 录
1 概述.............................................................. 4 1.1 目标跟踪与检测课程设计目的 .................................... 4 1.2 目标跟踪与检测设计任务与要求 .................................. 4 1.3 目标跟踪与检测的开发环境 ...................................... 4 2 目标跟踪与检测系统设计的基本概念与原理............................ 4 2.1 目标跟踪与检测的基本概念与知识 ................................ 4 2.2 目标跟踪与检测系统设计实现平台的搭建 ......................... 12 2.1 与目标跟踪与检测相关的一些基本功能 ........................... 18 3 基于 OPENCV 运动目标跟踪与检测系统实现的详细说明.................. 33 3.1 一般目标跟踪的实现 ........................................... 33 3.2 本文的检测算法 ............................................... 34 3.3 CAMSHIFT 算法原理及其 OPENCV 实现 ................................ 35 3.4 目标跟踪与检测系统的运行结果 ................................. 39 4 目标跟踪与检测的课程设计总结..................................... 44 参考文献

1 概述
1.1 目标跟踪与检测课程设计目的
1.通过实验了解 opencv 运动物体跟踪的数据结构、函数以及基本框架; 2.通过实验提高对于图像与视频的认识; 3.通过学习,掌握基本的 opencv 图像与视频的知识。 4.通过实验将理论和实践联系起来,提升对于理论知识的认识;
1.2 目标跟踪与检测设计任务与要求
1.通过学习做该课程设计, 掌握一些 opencv 的基本知识以及图像与视频的知识。 2.调用基于 intel 的开源视觉库 opencv,实现视频或者摄像头的监控; 3.编程实现对进入视觉范围内的运动物体实施监测;
1.3 目标跟踪与检测 Opencv 开发环境
一台 pc 机,Microsoft Visual C++ 6.0

2 系统设计的基本概念与原理
2.1 目标跟踪与检测基本概念与知识
2.1.1. OpenCV 简介
开放源代码的计算机视觉类库OpenCV (Intel Open Source Computer Vision Library)由英特尔公司开发. 它是一套可免费获得的由一些C函数和C++类所组成 的库, 用来实现一些常用的图像处理及计算机视觉算法。OpenCV主要用于对图像 进行一些高级处理,比如说特征检测与跟踪、运动分析、目标分割与识别以及3D 重建等。 它有以下特点; 开放C源码,基于Intel处理器指令集开发的优化代码,统 一的结构和功能定义,强大的图像和矩阵运算能力,方便灵活的用户接口,同时 支持WINDOWS、LINUX平台等。
(1) OpenVC的数据结构
OpenCV 提供了多种基本数据类型,虽然这些数据类型在 C 语言中不是基本 类型,但结构都很简单,可将它们作为原子类型。在运用 OpenCV 函数库进行编 程的过程中, 常常会需要用到这些结构类型,只有真正了解这些结构才能够很好 地利用 OpenCV 函数库来解决问题 基础的数据类型包括:CvPoint基于二维整形坐标轴的点.CvSize矩形框大小。 CvRect矩形框的偏移和大小,以像素为精度,CvMat多通道矩阵等。 OpenCV 提供了多种基本数据类型,虽然这些数据类型在 C 语言中不是基本 类型,但结构都很简单,可将它们作为原子类型。在运用 OpenCV 函数库进行编 程的过程中, 常常会需要用到这些结构类型,只有真正了解这些结构才能够很好 地利用 OpenCV 函数库来解决问题。 下面对几个比较常用的简单结构进行介绍。 1)CvPoint 结构 在这些数据类型中最简单的就是 CvPoint,它表示二维坐标系下的点,类型为整 型,定义如下: typedef struct CvPoint {

int x; /* x 坐标, 通常以 0 为基点 */ int y; /* y 坐标, 通常以 0 为基点 */ } CvPoint; 2)CvSize 结构 CvSize 结构用来表示矩形框大小,以像素为精度,结构体中分别定义了矩形的 宽高和高度,定义如下: typedef struct Cvsize { int width; /*矩形宽度,单位为像素*/ int height; /*矩形高度,单位为像素*/ }CvSize; 3)CvRect 结构该结构是用来表示矩形框的偏移和大小。 typedef struct CvRect { int x; int y; int width; int height; }CvRect; 4)CvScalar 结构 该结构是用来定义存放 1- 4 个数值的数组。 typedef struct Cvscalar { double val[4]; }CvScalar; //可用来表示 RGBA 的值,A=alpha 透明度 /* 方形的最左角的 x-坐标 */ /* 方形的最上或者最下角的 y-坐标 */ /* 宽 */ /* 高 */
5)IplImage 结构 OpenCV 库主要是使用“IplImage”结构体来创造和处理图像。IplImage 结构来 源于 inter 的另外一个函数库 IPL,该函数库主要是针对图像处理。定义如下: typedef struct IplImage

{ int nSize; int ID; int nChannels; int depth; int dataOrder; /*IplImage 大小*/ /*版本(=0)*/ /*大多数 opencv 函数支持 1~4 个信道*/ /*像素的位深度*/ /*0:交叉存取颜色信道。1:分开的颜色信道。只有
cvCreateImage 可以创建交叉存取图像*/ int origin; int width; int heighet; /*0:顶—左结构,1:底—左结构*/ /* 图像宽像素 */ /*图像高像素*/
struct_IplROI *roi; /*图像感兴趣区域*/ int imageSize; int widthStep; }IplImage; /*图像数据大小*/ /*排列的图像大小,以字节为单位*/
动态结构类型包括:内存存储,序列,集合,图,树。
(2)OpenCV的函数体系
OpenCV中每个函数的命名都已“cv”开始,然后是该函数的行为及目标。例 如用来创建图像的函数“cvCreatelmage”,载入图像的函数“cvLoadlmage”。 OpenCV是为图像处理及计算机视觉在实际工程中的应用而设计的一个类库。 其中 所有的函数都有与其在实际应用中所实现的不同功能而分属不同的类型。 主要函 数类型有: (1)基本的图像处理与分析函数 图像处理和分析的一些函数。其中大多数函数都是针对两维象素数组的,这 里我们称这些数组为“图像”,但是它们不一定非得是IplImage结构.也可以是 CvMat或者CvMatND结构。 这个类型的函数主要用于实现一些基本的图像处理与分 析功能。 例如图像平滑函数cvSmooth,Sobel算子cvSobel,Canny边缘分割函数 cvCanny。创建直方图cvCreateHist等。

(2)结构分析函数 例如用多边形曲线逼近Freeman 链函数cvApprexChains,函数cvMaxRect寻 找包含两个输入矩形的具有最小面积的矩形边界等。 (3)运动分析与对象跟踪函数 例如背景重建函数cvAcc.用光流法或动态轮廓模型来实现目标跟踪的函数 cvCalcOp tiealFlowBM 和cvSnake Image以及卡尔曼滤波函数CvKalman 等。 (4)摄像机标定和3D重建函数 例如函数cvCalibrateCamera利用目标图像模式和目标模式的象素点信息计 算相机参数.函数cvFindExtrinsieCamera_Params寻找模式的摄像机外参数矩阵 等。 (5)模式识别 例如函数cvLoadHaarClassifierCascade用于从文件中装载训练好的利用海 尔特征的级联分类器.或者从OpenCV中嵌入的分类器数据库中导入。 (6) GUI与视频处理函数 包括有高级图形用户接口highGUI用以实现对图像的载入、显示及保存等基 本操作以及用以实现视频输入输出及处理的函数。 根据上述的函数体系。 程序开发者可以根据自己所开发应用程序所要实现的 功能来方便地选择所需的库函数.从而大大减少开发时间和精力。缩短程序开发 的周期。
(3)OpenCV常用的函数
下面介绍一下 OpenCV 中常用的几个函数, 也是利用 OpenCV 进行特定目标体识别 的过程中常用到的函数,分别说明如下。 1)cvLoadImage( ):载入图像 IplImage* cvLoadImage( const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR ); filename:要被读入的文件的文件名。 iscolor:指定读入图像的颜色和深度。指定的颜色可以将输入的图片转为 3 信

道(CV_LOAD_IMAGE_COLOR), 单信道(CV_LOAD_IMAGE_GRAYSCALE),或者保持不变 (CV_LOAD_IMAGE_ANYCOLOR)。 2)cvShowImage( ):在指定窗口中显示图像 void cvShowImage( const char* name, const CvArr* image ); name:窗口的名字。 image:被显示的图像。 (3)IplImage* cvCreateImage 分配图像空间 (CvSize size, int depth, int channels); size: cvSize(width,height);
depth: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F
channels: 1, 2, 3 or 4. 注意数据为交叉存取.彩色图像的数据编排为 b0 g0 r0 b1 g1 r1 ... 举例: 分配一个单通道字节图像 IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 分配一个三通道浮点图像 IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 释放图像空间: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); 复制图像: IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage* img2;img2=cvCloneImage(img1); (4)设定/获取兴趣通道:void cvSetImageCOI(IplImage* image, int coi); //

0=all int cvGetImageCOI(const IplImage* image); 设定/获取兴趣区域: void void cvSetImageROI(IplImage* image, CvRect rect); cvResetImageROI(IplImage* image);
vRect cvGetImageROI(const IplImage* image);
2.1.2.目标检测
目标检测(object detection)是将运动的物体从背景中检测出来,人们希望 设计能适用于各种监控环境,不受光照、天气等外界因素影响的目标检测算法。 但这种算法难免复杂度大, 现有一些算法大多是针对某一类问题提出的,主要包 括背景减法、相邻帧差法等 。
(1) 背景减法
背景减法(background subtraction)是目前运动目标检测的主流方法 ,其 基本思想是将当前每一帧图像与事先存储或实时获取的背景图像相减, 计算出与 背景偏离超过一定阈值的区域作为运动区域。该算法实现简单,相减结果直接给 出目标的位置、大小、形状等信息,能够提供关于运动目标区域的完整描述,特 别是对于摄像机静止的情况, 背景减法是实现运动目标实时检测和提取的首选方 法。 背景减法实现的关键是背景模型的获取和更新。背景获取算法通常要求在 场景中存在运动目标的情况下获取背景图像, 更新过程使背景能够适应场景的各 种变化和干扰,如外界光线的改变,背景中对象的扰动和固定对象的移动,阴影 的影响等。 一种典型的背景建模方法是用混合高斯模型描述背景图像像素值的分布 , 目标检测过程中判断图像的当前像素值是否符合该分布,若是被判为前景点,否 则为背景点。同时根据新获取的图像,对背景图像参数进行自适应更新。该方法 能够可靠处理光照变化、 背景混乱运动的干扰以及长时间的场景变化等。在此基 础上,对背景、静止目标和运动目标三者采取不同的更新策略,以减弱背景更新

过程中运动目标对背景的影响。
(2) 相邻帧差法
相邻帧差法(temporal differencing)利用序列中连续两帧或几帧图像间 的差异进行目标的检测和提取。 由于相邻帧的时间间隔一般较短,因此算法对场 景中的动态变化不太敏感, 具有较强的自适应性。但该方法一般不能完全提取出 所有相关的特征像素点, 在运动实体内容易产生空洞现象。累积图像差分法进一 步计算一阶和二阶差分图像, 利用时间序列图像的历史积累信息,能够适应低对 比度有噪时间序列,判断复杂情况下目标运动的多种状态。 以上两种目标检测方法适用于背景固定不变的情形,对于背景发生运动的情况, 需要提前对由摄像机引起的背景移动进行补偿。 帧间差分法是一种通过对视频 图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好 地适用于存在多个运动目标和摄像机移动的情况。当监控场景中出现异常 物体运动时,帧与帧之间会出现较为明显的差别,两帧相减,得到两帧图 像亮度差的绝对值,判断它是否大于阈值来分析视频或图像序列的运动特 性,确定图像序列中有无物体运动。图像序列逐帧的差分,相当于对图像 序列进行了时域下的高通滤波。 帧间差分法的优点是:算法实现简单,程序设计复杂度低;对光线等 场景变化不太敏感,能够适应各种动态环境,稳定性较好。其缺点是: 不能提取出对象的完整区域,只能提取出边界;同时依赖于选择的帧 间时间间隔。对快速运动的物体,需要选择较小的时间间隔,如果选择不 合适,当物体在前后两帧中没有重叠时,会被检测为两个 分开的物体:而 对慢速运动的物体,应该选择较大的时间差,如果时间选择不适当,当物 体在前后两帧中几乎完全重叠时,则检测不到物体。
(2) 光流法
光流法检测运动物体的基本原理是:给图像中的每一个像素点赋予一个速 度矢量,这就形成了一个图像运动场,在运动的一个特定时刻,图像上的 点与三维物体上的点一一对应,这种对应关系可由投影关系得到,根据各 个像素点的速度矢量特征,可以对图像进行动态分析。如果图像中没有运 动物体,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体

时,目标和图像背景存在相对运动,运动物体所形成的速 度矢量必然和邻 域背景速度矢量不同,从而检测出运动物体及位置。采用光流法进行运动 物体检测的问题主要在于大多数光流法计算耗时,实时性和实用性都较差。 但是光流法的优点在于光流不仅携带了运动物体的运动信息,而且还携带 了有关景物三维结构的丰富信息,它能够在不知道场景的任何信息的情况 下,检测出运动对象。
2.1.3.关于图像与视频
1.图像的种类:计算机的图像分为两大类,即位图图像和矢量图形。
位图:采用点阵方式构成图像,可以表现丰富的图像色彩,但是文件占用存储空 间较大。 矢量图:以数学矢量方式记录图像,适合表示色彩较少的图像,但是可以表现和 保持清晰的图像曲线,缩小、放大不会失真,文件占用存储空间较小。像素:位 图图像是由许多个离散的点组成,它们是组成图像的基本单元,被称为像素。
2. 关于图像的通道(nchannels)问题:
1通道:描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单 通道,为1。 2通道:2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会 用到,一个通道为实数,一个通道为虚数,主要是编程方便;还有一种情况就是 16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道, 常见格式有RGB555或RGB565, 也就是说R占5位, G占5或6位, B占5位, 也有RGBA5551 格式。古老的格式,不用也罢。 3通道:如果一个像素点,由RGB三种颜色来描述它,就是三通道,为3。 4通道:windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,一般 叫做alpha通道,表示透明度。
3. 关于视频
视频(Video)泛指将一系列静态影像以电信号方式加以捕捉,纪录,处理,储 存,传送,与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以 上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的

视觉效果,这样连续的画面叫做视频。 帧数:帧数就是在1秒钟时间里传输的图片的量,也可以理解为图形处理器每秒 钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图 象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼 真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。 但文件大小会 变得越大。帧率:帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量 单位为每秒显示帧数(Frames per Second,简称:FPS)或“赫兹”(Hz) 。此词 多用于影视制作和电子游戏。 Frame rate中文常译为“画面更新率”或“帧 率”,是指视频格式每秒钟播放的静态画面数量。典型的画面更新率由早期的 每秒6或8张(frame per second,简称fps) ,要达成最基本的视觉暂留效果大约 需要10fps的速度。
2.2 系统设计实现平台的搭建
开发平台搭建 安装、下载 Opencv,并在 Microsoft Visual C++ 6.0 编译环境下配置 opencv。 在 vc++2006 中建立新工程以后,在工程设置里添加需要的 opencv 库,并在程序 文件中包含 opencv 的头文件。
2.2.1 安装 OpenCV
从 https://www.wendangku.net/doc/ba14946184.html, 下载 OpenCV 安装程序。假如要将 OpenCV 安装到 C:\Program Files\OpenCV。 (下面附图为 OpenCV 1.0rc1 的安装界面,OpenCV 1.0 安装界面与此基本一致。)在安装时选择"将\OpenCV\bin 加入系统变量" (Add\OpenCV\bin to the systerm PATH)。


2.2.2 配置 Windows 环境变量
检查 C:\Program Files\OpenCV\bin 是否已经被加入到环境变量 PATH,如果没 有,请加入。加入后需要注销当前 Windows 用户(或重启)后重新登陆才生效。 (可以在任务管理器里重启 explorer.exe)


2.2.3 配置 Visual C++ 6.0
全局设置 菜单 Tools->Options->Directories:先设置 lib 路径,选择 Library files, 在下方填入路径: C:\Program Files\OpenCV\lib 然后选择 include files,在下方填入路径: C:\Program C:\Program C:\Program C:\Program C:\Program C:\Program Files\OpenCV\cxcore\include Files\OpenCV\cv\include Files\OpenCV\cvaux\include Files\OpenCV\ml\include Files\OpenCV\otherlibs\highgui Files\OpenCV\otherlibs\cvcam\include
然后选择 source files,在下方填入路径: C:\Program Files\OpenCV\cv\src C:\Program Files\OpenCV\cxcore\src

C:\Program Files\OpenCV\cvaux\src C:\Program Files\OpenCV\otherlibs\highgui C:\Program Files\OpenCV\otherlibs\cvcam\src\windows 最后点击“ok”,完成设置。 项目设置 每创建一个将要使用 OpenCV 的 VC Project,都需要给它指定需要的 lib。菜单: Project->Settings,然后将 Setting for 选为 All Configurations,然后选择 右边的 link 标签,在 Object/library modules 附加上 cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib 如果你不需要这么多 lib,你可以只添加你需要的 lib。
2.2.4.在相应的程序前包含相关头文件。

2.3 一些 opencv 的基本功能
2.3.1 图片显示
利用 opencv 中自带的函数打开一张图片。
代码: #include "highgui.h" int main(int argc, char* argv[]) { //创建一个 IplImage 指针,使用 cvLoadImage 函数打开一个视频,第一个参数是视频的 路径,第二个参数是指 IplImage* src = cvLoadImage("C:\\Documents and Settings\\Administrator\\My Documents\\ 图像\\2j.jpg" , 1); //给打开的窗口命名 cvNamedWindow("show_image"); //显示这张图片 cvShowImage("show_image",src); cvWaitKey(0); return 0; }

2.3.2 加载一个视频。
(1)有关代码:
#include"highgui.h" int main(int argc, char* argv[]) { cvNamedWindow("avi"); // CvCapture CvCapture* capture = cvCreateFileCapture("E:\\学习\opencv\\学习 opencv 代码\\读取一个视频\\绝望的主妇第七季 01.avi"); IplImage* frame; while(1) { frame = cvQueryFrame(capture);

图像处理opencv代码

#include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

图像管理方案计划opencv代码

/. #include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

opencv摄像机标定代码

// cvCalib.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include void InitCorners3D(CvMat *Corners3D, CvSize ChessBoardSize, int Nimages, float SquareSize); int image_width = 768; int image_height = 576;//待标定图片的大小 const int ChessBoardSize_w = 7; const int ChessBoardSize_h = 7;//图片中可标定的角数 const CvSize ChessBoardSize = cvSize(ChessBoardSize_w,ChessBoardSize_h); const int NPoints = ChessBoardSize_w*ChessBoardSize_h;//角点个数 const int NImages=6;//待标定的图片数 int corner_count[NImages] = {0}; float SquareWidth = 10; //棋盘格子的边长,可任意设定,不影响内参数 CvMat *intrinsics; CvMat *distortion_coeff; CvMat *rotation_vectors; CvMat *translation_vectors; CvMat *object_points; CvMat *point_counts; CvMat *image_points; void main() { IplImage *current_frame_rgb; IplImage *current_frame_gray; IplImage *chessBoard_Img; CvPoint2D32f corners[NPoints*NImages]; chessBoard_Img =cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); current_frame_gray = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 1); current_frame_rgb = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); int captured_frames=0;

基于opencv2.0的车牌检测与字符分割的代码

本程序主要实现的是车牌的定位与检测 主要是利用申继龙论文里面的方法 1、采集得到的图像 2、把RGB图像转换成HSI彩色图像 3、利用设定的H、S阈值得到二值图像 4、对二值图像水平投影获得候选区域 5、对候选区域的HSI图像边缘检测 */ #include "stdafx.h" #include "opencv2/opencv.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/imgproc/imgproc_c.h" #include "opencv2/legacy/legacy.hpp" #include "opencv2/legacy/compat.hpp" #include #include #include #include #include #include #include #include #include using namespace std; using namespace cv; #define pi 3.14159265 IplImage* srcImage=NULL;//存储原图片 IplImage*srcImage1=NULL;//存储原始图片的副本 IplImage* HSI=NULL; static IplImage* grayImage=NULL;//存储原图片灰度图 static double posdouble=0.0; IplImage* channelOneImage=NULL; IplImage* channelTwoImage=NULL; IplImage* channelThreeImage=NULL; IplImage* plateImage=NULL;//存储车牌图像 IplImage* grayPlateImage=NULL;//存储车牌灰度图像 vectorcharacterImageList;//存储7个车牌字符图像的容器vectorxList;//存储7个车牌字符的起始和结束位置

基于opencv的人脸识别程序-代码详解

#include "cv.h" #include "highgui.h" #include #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw( IplImage* image ); const char* cascade_name = "haarcascade_frontalface_alt.xml";//人脸检测分类器 int main( int argc, char** argv ) { CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; int optlen = strlen("--cascade="); const char* input_name; if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ) { cascade_name = argv[1] + optlen; input_name = argc > 2 ? argv[2] : 0; } else { cascade_name = "E:\毕业设计\智能机器人动态人脸识别系统\陈建州程序.xml";//分类器路径 input_name = argc > 1 ? argv[1] : 0; } cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); if( !cascade )//如果没有找到分类器,输出以下 { fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); fprintf( stderr, "Usage: facedetect --cascade=\"\" [filename|camera_index]\n" ); return -1;

opencv,模板匹配源码

竭诚为您提供优质文档/双击可除opencv,模板匹配源码 篇一:opencv模板匹配 opencv模板匹配 V1.0 zhbrain 1、2、1)2)3、1)2) opencv模板匹配原理--没有金字塔................................................. ..........................4模板匹配—使用金字塔................................................. ...............................................5主要函数简介................................................. ................................................... ........5程序流程................................................. ................................................... ................5验证和结

果................................................. ................................................... ...............5实验环境................................................. ................................................... ................5实验结果................................................. ................................................... . (5) opencv模板匹配 1、opencv模板匹配原理--没有金字塔 函数: cvmatchtemplate(source,target,result,method);说明:source:源图像,一般我们使用灰度图像;如果source 为Rgb图像,使用函数cvcvtcolor(source,dst,cV_Rgb2gRay)这里,dst为转换后的灰度图像。target:模板图像。 Result:匹配后的矩阵,width=s_width–t_taget+1,height=s_height–t_height+1使用函数 iplimage*result=cvcreateimage(resultsize,ipl_depth_ 32F,1)获得。method:cV_tm_sqdiFF: cV_tm_sqdiFF_noRmed cV_tm_ccoRR

OpenCV下肤色检测代码

1.void cvSkinSegment(IplImage* img, IplImage* mask){ 2. CvSize imageSize = cvSize(img->width, img->height); 3. IplImage *imgY = cvCreateImage(imageSize, IPL_DEPTH_8U, 1); 4. IplImage *imgCr = cvCreateImage(imageSize, IPL_DEPTH_8U, 1); 5. IplImage *imgCb = cvCreateImage(imageSize, IPL_DEPTH_8U, 1); 6. 7. 8. IplImage *imgYCrCb = cvCreateImage(imageSize, img->depth, img->nChannels ); 9. cvCvtColor(img,imgYCrCb,CV_BGR2YCrCb); 10. cvSplit(imgYCrCb, imgY, imgCr, imgCb, 0); 11.int y, cr, cb, l, x1, y1, value; 12. unsigned char *pY, *pCr, *pCb, *pMask; 13. 14. pY = (unsigned char *)imgY->imageData; 15. pCr = (unsigned char *)imgCr->imageData; 16. pCb = (unsigned char *)imgCb->imageData; 17. pMask = (unsigned char *)mask->imageData; 18. cvSetZero(mask); 19. l = img->height * img->width; 20.for (int i = 0; i < l; i++){ 21. y = *pY; 22. cr = *pCr; 23. cb = *pCb; 24. cb -= 109; 25. cr -= 152 26. ; 27. x1 = (819*cr-614*cb)/32 + 51; 28. y1 = (819*cr+614*cb)/32 + 77; 29. x1 = x1*41/1024; 30. y1 = y1*73/1024; 31. value = x1*x1+y1*y1; 32.if(y<100) (*pMask)=(value<700) ? 255:0; 33.else (*pMask)=(value<850)? 255:0; 34. pY++; 35. pCr++; 36. pCb++; 37. pMask++; 38. } 39. cvReleaseImage(&imgY); 40. cvReleaseImage(&imgCr); 41. cvReleaseImage(&imgCb); 42. cvReleaseImage(&imgYCrCb);

基于Opencv的视频人脸检测程序源代码(可运行)

1.打开Microsoft Visual Studio 2008,新建一个Win32控制台项目; 2.配置好项目的包含文件和库文件; 3.将……\OpenCV\data\haarcascades中的haarcascade_frontalface_alt.xml拷贝到所建项目的文件夹中; 4.然后添加代码: #include"stdafx.h" #include"cv.h" #include"highgui.h" #include int_tmain(int argc, _TCHAR* argv[]) { CvCapture* capture=0; /*初始化一个视频捕获操作。告诉底层的捕获api我想从Capture1.avi中捕获图片,底层api将检测并选择相应的解码器并做好准备工作*/ capture = cvCaptureFromFile( "F:\\1.avi"); //设置要读的视频(avi格式) static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml",0,0,0); if( !cascade || !capture ) return -1; storage = cvCreateMemStorage(0); /*创建一个窗口,用“Video”作为窗口的标识符*/ cvNamedWindow( "Video",1); /*如果初始化失败,那么capture为空指针,程序停止,否则进入捕获循环*/ if( capture ) { for(;;) { IplImage* frame = cvQueryFrame( capture ); IplImage* img = NULL; CvSeq* faces; if( !frame ) break; img = cvCloneImage(frame);

opencv简单代码

(1)分配内存给一幅新图像 IplImage* cvCreateImage(CvSizesize, int depth, int channels); size: cvSize(width,height); depth: 像素深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, channels: 像素通道数. Can be 1, 2, 3 or 4. 示例: // Allocate a1-channel byte image IplImage* img1=cvCreateIm age(cvSize(640,480),IPL_DEPTH_8U,1); (2)释放图像 IplImage* img=cvCreateIma ge(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); (3)复制图像 IplImage* img1=cvCreateIm age(cvSize(640,480),IPL_DEPTH_8U,1); IplImage* img2;

img2=cvCloneImage(img1); (4)从文件中读入图像 IplImage* img=0; img=cvLoadImage (fileName); if(!img) printf("Couldnot load imagefile:%s\n",fileName); (5)头文件: #include #include #include #include // 不必要- 该头文件已在cv.h 文件中包含(6)响应键盘事件: 直接获取键盘操作: int key; key=cvWaitKey(10); // 输入等待10ms 等待按键并获取键盘操作: int key; key=cvWaitKey(0); // 无限等待键盘输入 键盘输入循环: while(1){key=cvWaitKey(10);if(key==27) break;

OpenCv矩阵操作函数源代码

/* //////////////////////////////////////////////////////////////////// // // CvMat, CvMatND, CvSparceMat and IplImage support functions // (creation, deletion, copying, retrieving and setting elements etc.) // // */ #include "_cxcore.h" static struct { Cv_iplCreateImageHeader createHeader; Cv_iplAllocateImageData allocateData; Cv_iplDeallocate deallocate; Cv_iplCreateROI createROI; Cv_iplCloneImage cloneImage; } CvIPL; // Makes the library use native IPL image allocators CV_IMPL void cvSetIPLAllocators( Cv_iplCreateImageHeader createHeader, Cv_iplAllocateImageData allocateData, Cv_iplDeallocate deallocate, Cv_iplCreateROI createROI, Cv_iplCloneImage cloneImage ) { CV_FUNCNAME( "cvSetIPLAllocators" ); __BEGIN__; if( !createHeader || !allocateData || !deallocate || !createROI || !cloneImage ) { if( createHeader || allocateData || deallocate || createROI || cloneImage ) CV_ERROR( CV_StsBadArg, "Either all the pointers should be null or " "they all should be non-null" ); } CvIPL.createHeader = createHeader; CvIPL.allocateData = allocateData; CvIPL.deallocate = deallocate; CvIPL.createROI = createROI; CvIPL.cloneImage = cloneImage;

CMake编译Opencv自带源码及程序形成工程并运行教程

CMake编译Opencv自带源码及程序形成工程并运行教程 本教程基于https://www.wendangku.net/doc/ba14946184.html,/2014/09/66490.html,感谢网友的贡献,本教程首先回顾一下网友的教程,重点在于解决网友没有提到的各种问题(第5章),因此前四章,大家也可以看原网址上提供的内容。 声明:纯粹经验之谈,重点是解决问题,若有理解错误,请多包涵~~ 一直很想直接打开运行opencv自带的示例程序,或者看看里面一些函数的源码,奈何opencv库里面给出的都是源文件,直接打开不能运行,没有编译形成VS中的工程方案,所以要看时,只得自己新建工程,然后复制过去,先不说麻烦,就算真弄过去了,还不一定能运行,因为它还可能有依赖项什么的问题(猜的),总之不一定能够顺利运行。后来听说可以用CMake对其进行编译,可以形成VS中的工程方案,然后直接就可以打开运行了,这当然方便多了,于是就有了下面的东西~~~ 1下载及安装CMake 在写本教程的时候,CMake最新版本为CMake3.4.1,下载网址为:https://https://www.wendangku.net/doc/ba14946184.html,/download/,CMake有很多的发行版本,具体有哪些,作为一个小白,也不懂什么,只是知道其中有分source和binary两种版本,前面的那个版本貌似是对应源码版本,也就是给的是CMake的源码,如果我们要用它去编译其他如opencv的源码,那得先编译CMake的source文件,然后还要写CMakeList.txt(相当于是通过编程来实现编译其他文件,本人这么理解,若有误,莫怪~),这么复杂,对我来说,肯定不想要;因此,我选择了binary版本(直接是二进制文件,已经编译好了,并形成了可执行程序),下载之后是一个.exe文件,这个就好办多了,下载下来,点击运行一顿安装就可以了~~~ 开始进入正题~~~ 下面摘录一段关于CMake的介绍(摘自教程开头的网址): CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C 特性,类似UNIX下的automake。只是CMake的组态档取名为CmakeLists.txt。Cmake并不直接建构出最终的软件,而是产生标准的建构档(如Unix 的Makefile或Windows Visual C 的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake

opencv 小波变换代码

提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换。输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的倍数;2层变换:w,h必须是4的倍数;3层变换:w,h必须是8的倍数......),变换后的结果直接保存在输入图像中。 1、函数参数简单,图像指针pImage和变换层数nLayer。 2、一个函数直接完成多层次二维小波变换,尽量减少下标运算,避免不必要的函数调用,以提高执行效率。 3、变换过程中,使用了一个指针数组pData用于保存每行数据的起始位置,pRow和pColumn 用于保存一行和一列临时数据,用于奇偶分离或合并,内存消耗较少 // 二维离散小波变换(单通道浮点图像) void DWT(IplImage *pImage, int nLayer) { // 执行条件 if (pImage) { if (pImage->nChannels == 1 && pImage->depth == IPL_DEPTH_32F && ((pImage->width >> nLayer) << nLayer) == pImage->width && ((pImage->height >> nLayer) << nLayer) == pImage->height) { int i, x, y, n; float fValue = 0; float fRadius = sqrt(2.0f); int nWidth = pImage->width; int nHeight = pImage->height; int nHalfW = nWidth / 2; int nHalfH = nHeight / 2; float **pData = new float*[pImage->height]; float *pRow = new float[pImage->width]; float *pColumn = new float[pImage->height]; for (i = 0; i < pImage->height; i++) { pData[i] = (float*) (pImage->imageData + pImage->widthStep * i); } // 多层小波变换 for (n = 0; n < nLayer; n++, nWidth /= 2, nHeight /= 2, nHalfW /= 2, nHalfH /= 2) { // 水平变换 for (y = 0; y < nHeight; y++) { // 奇偶分离 memcpy(pRow, pData[y], sizeof(float) * nWidth);

opencv代码注释例子1

源代码: #include"highgui.h" int main( int argc, char** argv ) //主函数至少有两个参数:argc和argv,argc是程序的运行参数个数(程序接受参数的个数),argv是运行参数的字符串数组(每个char* 表示程序路径名和参数){ IplImage* img = cvLoadImage( "1.jpg");//加载图像至内存,执行完返回一个指针,IplImage是一个指针,cvloadimage可以读取大多数格式的图像文件 cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE ); //创建一个标题为“Example1”窗口,“Example1”类似句柄,其参数为“CV_WINDOW_AUTOSIZE” cvShowImage("Example1", img ); //显示图像在“Example1”窗口中显示img指针所指的图像cvWaitKey(0);//等待(暂停)函数,“正数n”—暂停n毫秒,“0或负数”—等待用户触发按键 cvReleaseImage( &img );//释放内存,释放img所指向的内存块,执行完后,img被设置成NULL //关闭/销毁窗口 }运行结果:

源代码: #include"highgui.h" int main( int argc, char** argv ) { cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE ); //创建窗口 CvCapture* capture = cvCreateFileCapture("2.mp4");//生成一个指向视频文件的结构体指针 IplImage* frame; //声明一个图像结构体指针 while(1) {//装载下一帧视频文件至内存,返回对应当前帧的指针 frame = cvQueryFrame( capture ); if( !frame ) break; cvShowImage( "Example2", frame ); //无触发——返回 -1,按键触发——返回该按键的ASCII码,ESC键的ASCII码是 27 char c = cvWaitKey(33); if( c == 27 ) break; } cvReleaseCapture( &capture ); //释放CvCapture结构体的内存空间 cvDestroyWindow( "Example2" ); //关闭/销毁窗口 }运行结果:

编译opencv源代码

Opencv源码编译 For Ubuntu For Android For Windows Version0.1 2013.06.06 目录 1.Ubuntu下编译opencv源代码(For linux&Android) (2) 1.1下载opencv源码 (2) 1.2下载安装Cmake (2) 1.3安装一些ubuntu下必要的库文件: (2) 1.4使用Cmake进行配置: (3) 1.5编译opencv生成linux下的opencv库文件 (3) 1.6测试linux下Opencv例程: (4) 1.7Opencv For Android的编译 (4) 1.7.1安装ndk: (4) 1.7.2安装Android SDK (5) 1.7.4开始编译opencv中关于android相关的源码 (5) 2.Ubuntu下codeblocks Opencv开发环境配置 (7) 2.1下载安装codeblocks (7) 2.2打开cldeblocks建立一个摄像头的测试程序: (8) 2.3配置工程的头文件和链接库 (8) 3.Windows7+codeblocks Opencv开发环境搭建 (11) 3.1下载opencv2.2 (11) 3.5打开CMake (12) 3.6环境变量的设置 (12) 3.7在CMake中点击configure (14) 3.8编译oepncv源码 (15) 3.8.1先进入E盘 (15) 3.8.2进入目录OpenCV-2.2.0-build (15) 3.8.3编译opencv源码 (16) 3.8.4安装opencv库文件 (16) 3.9使用codeblocks建立openv工程 (17) 3.10测试代码 (18) 3.11给工程文件添加opencv相关路径 (19) 3.12编译工程文件 (22) 附其他参考资料备忘 (23)

OPENCV特征提取代码总结

特征提取代码总结 来自https://www.wendangku.net/doc/ba14946184.html,/source/3208155#acomment 特征提取代码总结 颜色提取 颜色直方图提取: C ode: #include #include #include using namespace std; int main( int argc, char** argv ) { IplImage * src= cvLoadImage("E:\\Download\\test1.jpg",1); IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 ); IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* planes[] = { h_plane, s_plane }; /** H 分量划分为16个等级,S分量划分为8个等级*/ int h_bins = 16, s_bins = 8; int hist_size[] = {h_bins, s_bins}; /** H 分量的变化范围*/ float h_ranges[] = { 0, 180 }; /** S 分量的变化范围*/ float s_ranges[] = { 0, 255 }; float* ranges[] = { h_ranges, s_ranges }; /** 输入图像转换到HSV颜色空间*/ cvCvtColor( src, hsv, CV_BGR2HSV ); cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

相关文档