基于背景差分法的物体识别_毕业设计论文(编辑修改稿)内容摘要:

景图像的获取 [ 9]。 但是获取背景图像的时时获取与更新 仅仅是理想实验条件下的理论 ,并不能很好地适应实际使用 , 但 由于背景图像 具有时变性 , 所以 需要 进 行背景重建,即通过视频 流 中的 帧间信息估计 与 恢复背景, 故需 选择性地进行背景更新 [ 10]。 帧间差分法( Frame difference method) , 一种 运动目标检测方法 ,通过检测视频流中的相邻两帧 作差分实现目标 [ 11]。 这种方法很好的解决了 同一背景内多个 物体 运动 和摄像头移动造成的检测准确率波动 问题 [ 12]。 帧间差可以很好的反映出监控场景内的 每一个变化 , 包括被测目标和背景内任何物体 的细小抖动。 把两帧之间差的绝对值与动态阈值相比较 ,根据其大小关系确定有无物体运动[ 13]。 以此类推 , 可获得整个过程内的物体运动状 态。 这 相当于对图像序列进行了时域下的高通滤波。 差分法流程图如下图所示 : 图 差分法流程图 背景保存 拍摄一组含有被测物体的视频流 大于阈值 小于阈值 物体运动 物体静止 相邻两帧作差 8 第三章 Opencv 的介绍与使用 计算机视觉领域 是当今的一门前沿科学 ,它 不仅可以用于 图像中的物体分析, 还能用于 安全和入侵检测系统,自动监视和安全系统,制造业中的产品质量检测系统,摄像机标定,军事应用,无人飞行器,无人汽车和无人水下机器人 , 非常有发展潜力 , 但 由于当今技术停留在对三维图像的二维化之后作为计算机识别的基本依据 上 , 记录下的数据庞大而精确,很容易被 噪声干扰, 对于被测物体的识别并不能有效实施 , 为了能够 利用计算机 进行高级物体识别运算 ,opencv 应运而生 ,本章主要介绍了 opencv 的来源、发展与优势。 第 一 节 opencv 简介 Opencv,全称 Open Source Computer Vision Library。 1999 年由 intel 发起建立,现在由 Willow Garage 提供支持。 是一个开源发行的跨 linux, windows 和Mac OS 平台计算机视觉库。 Opencv 是一个轻量级而且高效的视觉库 —— 它由一系列的 C 函数和少量 C++ 类构成, Ruby、 Python 以及 MATLAB 等语言的接口也同时被包含其中,基本实现了图像处理和计算机视觉方面通用算法。 目前最新的 opencv 版本是。 OpenCV 的 C 函数,包括 300 多个跨平台,高层次的 API。 它不依赖于外部库,尽管这些外部库也可以被使用。 OpenCV为用户提供一个透明的接口英特尔 174。 集成性能基元( IPP)。 如果检测到特定的处理器优化的 IPP 库存在, OpenCV 可以自动运行加载这些库。 OpenCV 拥有包括 500 多个 C,c++函数的跨平台的中、高层 API。 它不依赖于其它的外部库 —— 尽管也可以使用某些外部库。 在计算机视觉市场潜力飞速增长的当今,却很少有一款兼容性高,平台广泛的视觉函数库,已有的大多数函数库或者正在研究,或者商业化明显,价格昂贵,亦或者使用方向明显,不具有普遍性。 OpenCV 的出现很有效的解决了这一问题。 高性能的 C 代码编程极大地提高了运行速度,还可以通过购买 intel的 IPP 高性能多媒体函数库 (Integrated Performance Primitives)进一步得到更高的处理速度,相比其他函数库优势非常明显,在很多国家都有广泛应用。 近几年来随着移动设备 android 系统的兴起 ,基于 android 系统的 OpenCV 发展肯定会上升到一个新阶段。 OpenCV 的 应用领域 也非常广泛 除了物体识别、运动分析、动作识别和运动跟踪这几个传统的使用领域以外 [ 14] ,还被越来越多的投入于人机互动、图像分割、人脸识别、机器人运动分析、机器视觉和结构分析等新兴技术之中。 OpenCV 历史发展 9 1999 年 1 月, Intel 主导下 CVL 项目启动。 其主要研究目标面对人机界面,和能被 UI 调用的实时计算机视觉库,其目的是为了自己旗下的 Intel 处理器做了特定优化。 2020 年 6 月,首个开源版本 OpenCV alpha 3 发布。 2020 年 12 月,首个基于 linux 平台的 OpenCV beta 1 发布。 之间相隔 6 年时间,开发商对 opencv 移植 Mac OS 平台做了深层研究 2020 年,基于 Mac OS 的 OpenCV 版本发布。 2020 年 9 月, OpenCV ( )版本发布。 2020 年 10 月 1 日, OpenCV 版本发布。 2020 年 12 月 6 日, OpenCV 版本发布。 2020 年 8 月, OpenCV 发布。 2020 年 4 月 2 日,发布 OpenCV 版本。 第 二 节 有关图像识别的 opencv 函数 (1) CvSize 矩形框大小,以像素为精度 typedef struct CvSize { int width。 // 矩形宽 int height。 // 矩形高 } CvSize。 // 构造函数 inline CvSize cvSize( int width, int height )。 (2) IplImage IPL 图像头 typedef struct _IplImage { int nSize。 // 将 IplImage 的 尺寸定义 int ID。 // 版本 (=0) int nChannels。 // 定义 通道 ( 很多 OpenCV 函数支持 4 个以内的通道 ) int alphaChannel。 // 定义 alphaChannel, OpenCV 的函数库会 忽略 这个通道 int depth。 // 定义 深度 ,其 可支持 : IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U 和 IPL_DEPTH_16S 还有 IPL_DEPTH_32S, IPL_DEPTH_32F 和 IPL_DEPTH_64F char colorModel[4]。 // 定义 colorModel[4],其亦被忽略 10 char channelSeq[4]。 // 定义 channelSeq[4],其亦被忽略 int dataOrder。 // 定义颜色通道,其中 0 被称为 交叉存取 , 1 被称为 分开存取 , 交叉存取只有 cvCreateImage 可实现 int origin。 // 定义结构 , 其中 0 为 顶 — 左 ,1 为 底 — 左 int align。 // 图像行 , (取值为 4 或者 8). OpenCV 不 会 调用 这个值 , 在它的位置 出现的是widthStep int width。 //定义 图像 的宽度值 int height。 // 定义 图像 高度值 struct _IplROI *roi。 // 图像 集中观察 区域。 当这个数值不是 0 的时候程序只对这个被定义的区域进行运算 struct _IplImage *maskROI。 // 这个值是一个 OpenCV 一直将其设定为空的值 void *imageId。 //这个值是一个 OpenCV 一直将其设定为空的值 struct _IplTileInfo *tileInfo。 // 这个值是一个 OpenCV 必 定 将其设定为空的值 int imageSize。 // 定义 所用 图像 的 数据 尺寸 ( 在交叉存取 格式下imageSize=imageheight*imagewidthStep), 以 字节 为单位 char *imageData。 // 定义 图像数据 int widthStep。 //定义 图像 宽度 , 单位 是字节 int BorderMode[4]。 // 定义 边界 结束 的 模式 , OpenCV 不会调用 int BorderConst[4]。 // 定义边界 结束 的 模式 , OpenCV 不会调用 char *imageDataOrigin。 // 指针指向 另一个 图像数据结构 ( 不一定要定义的 ), 它的目的是把错误的图像的内存改正过来 } IplImage: IplImage 源于 Intel Image Processing Library( 自带 )。 OpenCV 仅仅调用某个 一个子集 : • alpha 通道在 OpenCV 中 不会被调用。 • colorModel 与 channelSeq 两个 定义 不会被 OpenCV 调用。 OpenCV 中仅有的 颜色转换函数 是 cvCvtColor,它 把 初始 图像的颜色空间 里边的 目标 物体的颜色空间 一同 对待 ,一并 看 作 cvCvtColor 的 一个参数。 • 数据顺序 必须是 IPL_DATA_ORDER_PIXEL (颜色通道 存取方式 为 交叉存取 ), 但是 平面图像的被选择通道可被处理, 好像 COI( 集中观察 通道)被设定 过。 • 当 widthStep 被用于去接近图像行序列,排列是被 OpenCV 忽略的 . • 不支持 maskROI。 处理 MASK 的函数把 它 看 成一个 分离参数 . 它 在 11 OpenCV 中有 8 位 , 但 在 IPL 它只有 1 位。 • 命名 信息不 被 支持。 • 边界 模式和 边界 常量是不 被 支持 . 每个 OpenCV 函数处理像素的邻近的像素,通常 不会采用 多种 固定代码 边界 模式。 以上所说 限制 之外 , OpenCV 对于 ROI 的处理方面还提出了 其他 要求。 包括 要求 ROI的 大小 或者 原图像和目标图像的 大小 ( 依操作而异 ,比 如 cvPyrDown 目标图像的宽 或者 高 一定要 与 原图像的宽 或者高 除 2 177。 1 相等 )必精确匹配 ,并且 由 IPL 处理 的 交叉区域 则 有可能完全独立 , 例如 图像 尺寸 或 者 ROI 尺寸。 (3)CreateImage 创建头并分配数据 IplImage* cvCreateImage( CvSize size, int depth, int channels )。 size 图像宽、高。 depth 图像元素的位深度,可以是下面的其中之一 : IPL_DEPTH_8U 无符号 8 位整型 IPL_DEPTH_8S 有符号 8 位整型 IPL_DEPTH_16U 无符号 16 位整型 IPL_DEPTH_16S 有符号 16 位整型 IPL_DEPTH_32S 有符号 32 位整型 IPL_DEPTH_32F 单精度浮点数 IPL_DEPTH_64F 双精度浮点数 channels:每个元素(像素)通道号。 可以是 1, 2, 3 或 的,例如通常的彩色图像数据排列是: b0 g0 r0 b1 g1 r1... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些 OpenCV 也能处理他 , 但是这个函数只能创建交叉存取图像。 函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式。 header= cvCreateImageHeader(size,depth,channels)。 cvCreateData(header)。 (4) Or:计算两个数组每个元素的按位或 void cvOr( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL )。 src1:第一个原数组。 src2:第二个原数组。 dst:输出数组。 12 mask:操作覆盖面( 8bit 单通道数组)。 只有覆盖面指定的输出数组被修改。 函数 cvOr 计算两个数组每个元素的按位或 dst(I)=src1(I)|src2(I):对浮点数组按位表示操作是很有利的。 除覆盖面,所有数组都必须有相同的类型,相同的大小(或 ROI 大小 )。 ( 5) GetErrStatus:返回当前错误状态 int cvGetErrStatus( void )。 函数 cvGetErrStatus 返回当前错误状态 , 这个状态是被上一步调用的 cvSetErrStatus 设置的。 注意 , 在 Leaf 模式下错误一旦发生程序立即被终止 ,因此对于总是需要调用函数后蔡获得控制的应用,可以调用 cvSetErrMode 函数将错误模式设置为 Parent 或 Silent。 ( 6) Error: 产生一个错误。 int cvError( int sta。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。