23
泰迪华南杯数据挖掘竞赛论文报告 1 页,共 23 基于 OpenCV 的小车压双黄线的自动检测 要:本文以小车压双黄线为例,介绍了对基于 OpenCV 的视频图像处理技术的自动识别的研 究。自动识别的主要步骤分为四步:预处理、运动检测、形态学处理以及碰撞检测。首先选择最适 合的编码,调节到最适合的分辨率,以及进行防抖动处理。在与差帧法和训练分类法进行比较后, 选用背景差分法对运动目标进行检测。然后利用形态学运算对检测出的运动目标进行形态学修剪。 最后利用碰撞检测识别出目标。本文利用 OpenCV 实现以上步骤,实验取得了不错的效果。 关键词:OpenCV 视频处理 自动检测 背景差分法 差帧法 训练分类法

基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 1 页,共 23 页

基于 OpenCV 的小车压双黄线的自动检测

摘 要:本文以小车压双黄线为例,介绍了对基于 OpenCV 的视频图像处理技术的自动识别的研

究。自动识别的主要步骤分为四步:预处理、运动检测、形态学处理以及碰撞检测。首先选择最适

合的编码,调节到最适合的分辨率,以及进行防抖动处理。在与差帧法和训练分类法进行比较后,

选用背景差分法对运动目标进行检测。然后利用形态学运算对检测出的运动目标进行形态学修剪。

最后利用碰撞检测识别出目标。本文利用 OpenCV 实现以上步骤,实验取得了不错的效果。

关键词:OpenCV 视频处理 自动检测 背景差分法 差帧法 训练分类法

Page 2: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 2 页,共 23 页

Automatic Detection of the Passing Double Yellow Lines

Cars Based on OpenCV

Abstract: This article introduces the study of the automatic detection based on the OpenCV’s video

and image processing technique and takes the passing double yellow lines cars as an example. Four steps

make up the automatic detection; they are pretreatment, motion detection, morphological processing and

collision detection. To get good results, we adjust the video to the proper status (including adjusting the

video codes, adjusting the resolution ratio and jitter prevention processing) firstly. Secondly, we use

background subtraction to detect the moving objects, compare with the frame difference and training

classification. Thirdly, in order to handle it, we adjust the detected objects’ appearance. Lastly, we detect

the object through collis ion detection. We use OpenCV to experiment and get good results.

Key words: OpenCV Video and Image Processing Automatic Detection Background Subtraction

Frame Difference Training Classification

Page 3: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 3 页,共 23 页

目录

引言 ..................................................................................................................................... 4

0.数据源 .............................................................................................................................. 4

1.挖掘目标 .......................................................................................................................... 4

2.分析方法与过程 .............................................................................................................. 4

2.0 预处理 ...................................................................................................................... 4

2.1 运动检测 .................................................................................................................. 6

2.2 形态学处理 ............................................................................................................ 11

2.3 碰撞检测 ................................................................................................................ 12

3.结果分析 ........................................................................................................................ 12

3.1 背景差分法 ............................................................................................................ 13

3.2 差帧法 .................................................................................................................... 13

3.3 训练分类法 ............................................................................................................ 13

3.4 方法对比分析 ........................................................................................................ 14

4.结论 ................................................................................................................................ 14

5.模型评价与改进期望 .................................................................................................... 14

参考文献 ........................................................................................................................... 15

附录 ................................................................................................................................... 15

Page 4: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 4 页,共 23 页

引言

现时,各大城市基本都引入了道路视频监控系统来对车辆进行实时监控。自动检测技术由于会为监

控过程带来便利而日益受到重视。本文希望通过基于 OpenCV 的视频图像处理技术,得到一个较低

错误率的自动检测方法。

0.数据源

考虑到大多道路视频监控摄像头都是在固定位置对固定路段进行拍摄,因此本文的数据来源于固定

位置的摄像设备(如监控摄像头)拍摄的车辆行驶视频。而拍摄非固定路段的视频不在本文的考虑

范围之内。

1.挖掘目标

本文利用视频处理技术,对压双黄线的小汽车进行自动检测。

2.分析方法与过程

本文研究的自动识别的总体流程图如下页图 1 所示。

2.0 预处理

在应用视频图像处理技术前,需要先对视频做预处理,以便获得预期的效果。

2.0.1 选择编码

视频编码的质量对 OpenCV 的图像处理有至关重要的影响。以混合高斯模型计算背景为例,低质量

的编码将对运动检测造成十分巨大的干扰,如图所示:

图 2 图 3

图 2 中使用的是 XVID 编码,而图 3 则为 DIVX 编码,可以看到二者效果有明显的差异。

在本文中,我们选择了 DIVX 编码,用 avi 容器封装。所用转码软件是 XMedia Recode。

Page 5: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 5 页,共 23 页

待检测视频

预处理

运动检测

背景差分法

差帧法 训练分类法

对比分析

形态学处理

高斯滤波 腐蚀、膨胀运算

碰撞检测

检测出目标

选择编码 调节分辨率 防止抖动

图 1. 自动检测的总体流程图

2.0.2 调节分辨率

分辨率对计算机的计算处理速度有比较大的影响。分辨率过高,会降低计算速度,导致难以实时进

行检测处理;但若分辨率过低,运动检测的准确率也会降低。因此要权衡好运算速度与准确率,选

择适当的分辨率。

在本文中,我们将视频源的分辨率调整为 640x360。

Page 6: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 6 页,共 23 页

2.0.3 防止抖动

假如视频在拍摄过程中存在抖动,将会对运动物体的检测产生干扰。因为一旦出现抖动,背景也会

被识别为运动物体。所以对于拍摄回来的视频,如果存在抖动的话就需要作防抖处理。

基于以上三点,我们实验发现原大赛提供的视频由于编码及分辨率有问题且无法调整,故选用其他

的视频代替检测。

2.1 运动检测

本文运用了三种方法来对运动目标进行检测。

2.1.1 背景差分法

背景差分法是利用混合高斯建模计算出视频的背景图像,再通过视频的每帧图像与背景图像作差,

从而得到前景图像(即运动目标)的方法。

2.1.1.1 总体流程:

视频文件

分帧读取

第一帧?初始化高斯模型参数,建立高斯混合模型

Y N

更新高斯混合模型

计算得到背景

依次捕捉每帧图像

获取该帧图像像素矩阵

背景减法

得到前景

图 4. 背景差分法总体流程图

2.1.1.2 具体步骤:

1 高斯混合模型计算

混合高斯模型使用 K 个(基本为 3 到 5 个)高斯模型来表征图像中各个像素点的特征,在新一

帧图像获得后更新混合高斯模型,用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判

Page 7: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 7 页,共 23 页

定该点为背景点,否则为前景点。

对于背景图像中的每一个像素点,可以用 K 个高斯分布表示,即:

1

( ) ( , , )K

t it t iti

p X w X it

其中,K 是高斯模型的个数,tX 是该像素在 t 时刻的 RGB 值,

itw 、

it 、 it 分别是第 i

个高斯模型在 t 时刻的权值、 均值和协方差矩阵。

建模开始时将itw 和

it 初始化为 0, it 初始化为一个较大的初值

0V 。在 t 时刻对视频帧的

每一个像素tX 和每一个高斯模型作匹配检验。这里将检验定义为假如

tX 与第 i 个高斯模型的均值距

离小于其标准差的 2.5 倍,则判定tX 与该高斯模型匹配。

假如像素点tX 与某个高斯模型匹配,则对混合高斯模型的参数进行更新:

, , 1(1 )

i t i t tX

, , 1 , ,(1 ) [( )( )]T

i t i t t i t t i tdiag X X

其中, , 1 , 1( | , )t i t i tX

, 为参数的学习速率。

对于那些不匹配的高斯模型,则不需要更新它们的参数。

假如不存在一个高斯模型与像素点tX 匹配,则对最不可能表示背景的高斯模型重新赋值,即:

, 1arg min

i k tj w

,t 0jw W , ,j t t

X , , 0j tV I

其中0W 是预先给定的一个较小的正数,I 为单位矩阵。

然后,再对每个高斯模型的权值 ,i tw 进行更新:

, , 1 ,(1 )

i t i t i tw w M

, , j,1

/K

i t i t tj

w w w

其中,若第 i 个高斯模型与 t 时刻的像素点tX 匹配,则 ,i t

M 取 1,否则取 0。

完成了参数更新之后,就可以对 ,i tw 进行降序排列,以便下一次匹配计算中优先取出与背景匹

配度高的高斯模型进行计算。在这里可以设定一个阈值 (0.5 1)T T ,取出满足 ,i tw T 的所

有权值,假如在下一时刻的像素点tX 与某一个所取出的权值匹配,则判定该像素点为背景点,否则

为前景点。

通过利用混合高斯模型,我们可以做到对视频背景建模,并且实时更新高斯模型的参数和背景

图像,取得了良好的效果:

Page 8: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 8 页,共 23 页

图 5 图 6

图 5 为视频图像,图 6 为混合高斯模型计算后得到的背景图像

2 背景差分法提取运动目标

通过混合高斯建模我们得到了背景图像,为了便于计算,习惯将其转化为灰度图。对于视频的

每帧图像也作灰度化处理。之后,将背景图像灰度图转化为灰度矩阵 B,视频帧灰度图转化为灰度

矩阵 P。以 B(x,y)表示背景图像在点(x,y)处的灰度值,P(x,y)同理。灰度化公式如下:

0.299 * 0.587 * 0.114 *Gray R G B , 0 , , 255R G B

其中,R、G、B 分别对应彩色图像的红、绿、蓝通道的数值。

之后再对矩阵 P 和 B 作差,我们即可得到前景图像的矩阵 F:

( , ) ( , ) ( , )F x y P x y B x y

将矩阵 F 转化为灰度图像,即可表示出前景图像,即运动物体:

图 7 图 8

图 7 为视频图像,图 8 为背景差分后得到的前景图像。

3 目标二值化处理

图像中可能包括目标物体、背景和噪声,要想从多值的数字图像中直接提取目标物体,最常用

的方法就是二值化。设定一个阈值 T,作如下处理:

255, ( , ) T( , )

0, ( , ) T

F x yF x y

F x y

经二值化处理后,整个图像就会呈现出只有黑和白的视觉效果,易于之后的判断处理,如下图:

Page 9: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 9 页,共 23 页

图 9 图 10

图 9 为前景图像,图 10 为二值化处理后的前景图像。

2.1.2 差帧法

差帧法是利用视频前后帧图像的变化关系,对它们作差分运算后得到运动物体的轮廓图像,从

而完成运动物体的检测。

2.1.2.1 总体流程:

首先将当前帧与下一帧图像灰度化,然后作差分,即可得到运动物体的轮廓。

2.1.2.2 步骤简介:

1.获取视频当前帧与下一帧图像

2.灰度化处理

3.对它们作差分运算

1 差帧

首先对视频当前帧像素矩阵nowF 和下一帧像素矩阵

nextF 作灰度化处理,详细步骤可以参考

2.1.1.2.2。之后对其作差:

( , ) ( )now next

F x y F F

得到的矩阵 F 即为运动物体的轮廓,同样达到了提取运动物体的效果。

图 11 图 12

图 11 为差帧前的视频图像,图 12 为同一图片差帧后的灰度图。

Page 10: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 10 页,共 23 页

2 目标二值化处理

具体操作同上所述,得到效果图如下:

图 13 图 14

图 13 为差帧后的灰度图,而图 14 则为该图的二值化处理图。

2.1.3 训练分类法

训练分类法利用的是 OpenCV 自带的训练分类器。它的工作原理类似于神经网络,通过正样本

(汽车图片)与负样本(非汽车图片)的输入,训练出一个可以识别出汽车的模型,从而直接识别

出汽车,而非检测运动物体。然后再加上碰撞检测,可以一步到位地达到识别汽车压线的效果,并

且不用受到非汽车物体压线的干扰。

2.1.3.1 总体流程:

收集正样本(汽车图片)与负样本(非汽车图片);导入 OpenCV 训练分类器进行训练,得到

xml 格式的文件(相当于训练得到的模型);把 xml 文件加载到程序后,可对导入的图片或视频的每

帧图像进行自动识别检测。

2.1.3.2 步骤简介:

1.收集正样本、负样本

2.创建.vec 样本文件

3.使用 opencv_haartraing.exe 进行训练,成功后得到.xml 文件

4.在程序中加载.xml 文件,导入图像开始识别

1 提供训练样本

由于训练样本需要数量庞大,才能提升识别的准确度。这里只提供几个样本供参考:

Page 11: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 11 页,共 23 页

正样本:

负样本:只要是不包含汽车的图片都可以。

2 每帧分类

有了训练得到的模型,利用 OpenCV 可对在视频的每一帧图像里自动识别出小汽车,从而达到

对视频每帧里的所有目标进行分类的效果。

2.2 形态学处理

形态学处理是针对二值图像的一种特殊处理技巧,它的基本运算有腐蚀、膨胀、开运算以及闭

运算。通过形态学处理,可以做到图像去噪、图像增强、便捷检测等效果,可以凸显二值图像的特

征。

2.2.1 高斯滤波

高斯滤波是一种线性平滑滤波,通常于消除高斯噪声,可应用于图像处理的减噪过程。简单地

说,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其

它像素值经过加权平均后得到。

2.2.2 腐蚀、膨胀运算

腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。膨胀是

将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。 可以用来填补物体中的空

洞。开运算是先腐蚀后膨胀的组合,闭运算则是先膨胀后腐蚀的组合。

效果对比:

图 15 图 16

图 15 为未经处理的前景图,图 16 为经过先腐蚀后膨胀处理的前景图。

Page 12: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 12 页,共 23 页

2.3 碰撞检测

在检测出运动物体后,判断运动物体是否压线的原理就是碰撞检测了。简单来说,当运动物体

进入我们所划定的区域后(即黄线区域)则将其判断为压线,并用红线将其圈出来,从而做到检测

车辆是否压线的效果。

2.3.1 划定碰撞检测区域

由于拍摄回来的车流视频没有黄线,我们只能自己划定一个碰撞检测的区域,实际上与判断压

线的效果一样。为方便起见,将区域划定为一个矩阵,如图 17 所示的红线间的范围:

图 17

在真实应用时,只需要修改该区域使之与双黄线重合即可。

2.3.2 标记压线目标

在运动目标检测处理过后,我们得到了已经二值化的前景图像。通过 OpenCV 自带的函数

cvFindContours,可以得到前景图像内所有团块各自的最小外接矩形。因此,我们要做的就是显示出

中心位于红线范围内的矩形,即可做到标记压线目标。

2.3.3 压线目标筛选

由于压线物体有时不只有汽车,还会有行人,还可以是一些阴影。因此对于如何在识别出压线

物体是汽车时才将其表示出来,是一项比较有难度的操作。本文采取的筛选操作只是通过判断最小

外接矩形的大小,筛选掉宽度较小的矩形(因为通常在马路上,行人或其他非车目标的外接矩形会

显得比较窄),从而排除掉大部分识别出行人或其他非车目标的可能性。至于更有技巧的识别技巧,

还有待探讨。

3.结果分析

分别用上述三种方法对视频进行自动检测,得到如下效果图:

Page 13: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 13 页,共 23 页

3.1 背景差分法

3.2 差帧法

3.3 训练分类法

Page 14: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 14 页,共 23 页

3.4 方法对比分析

通过观察结果,我们发现背景差分法的效果是最好,也是最稳定的。差帧法虽然效果也不错,

但是不太稳定。训练分类法由于需要大量的样本支持,才能得到一个较为准确的识别模型,而这样

大量的样本难以通过人工收集(通常需要几千个正样本),所以可以看出识别效果并不是很好,只识

别出了近处,即分辨率较高处的汽车,远处的汽车难以识别出来。然而我们认为训练分类法还是一

种十分具有潜力的方法,因为这种方法可以略去很多复杂的运算过程,而且鉴于小汽车的形状变化

不大,一但建立起准确的识别模型,该模型在未来一段较长的时间内都是适用的。当然,在现阶段

我们认为计算过程最复杂的背景差分法是最有效的自动检测方法。

4.结论

本文利用基于 OpenCV 的视频图像处理技术,达到了对道路监控视频中压双黄线的小汽车进行

自动识别的目的,不但基本还原了原大赛提供的视频的效果,而且在此基础上进行了一定的修正,

使得准确率得到提高,并通过对比实验得到一个准确率较高的自动识别算法模型。

5.模型评价与改进期望

1.经过实验发现,本文所研究的自动检测方法只适用于背景固定的视频,而无法对背景运动的

视频进行检测;

2.本文所研究的方法只能检测视频中的近景小汽车,对于远景目标,该方法会由于目标太小且

聚集而失效;

3.本文在对运动目标的识别的处理中略显不足,可以考虑继续添加新的判断指标,使识别率上

升;

4.本文所用的自动检测方法并没有用到目标追踪,如可用上,则上述两个问题皆能在一定程度

上得到解决;

5.由于时间关系,本文无法收集其他视频样本,一直只对一个视频进行实验,所得结果难免有

特殊性,对于其他的视频需要做一定的调整才适用;

6.对于训练分类法,因目前无法采集大量的训练样本而导致无法看出其真实效果,本文还是该

方法的潜力很大,有进一步深究的必要性。

Page 15: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 15 页,共 23 页

参考文献

[1]张小波. 数据挖掘应用 20 个案例分析[M]. 广州 太普信息技术有限公司 2012

[2]殷梦妮. 基于高斯混合模型的运动目标检测[D]. 哈尔滨工程大学硕士学位论文 2012

[3]张小波. 数据挖掘应用实战基础[M]. 广州 太普信息技术有限公司 2012

[4]王丽娟. 基于 OpenCV 与混合高斯建模的运动目标检测[B]. 电子测试 2009

[5]基于 OpenCV2.0 的训练分类器 XML 的方法.

出处:

http://wenku.baidu.com/link?url=XfYjpsd6PEnZ4eyUKGJ11T0vVEB9zCqD-AORHVGGHiSfhl-7OCx

OLeVR86X-mexy1awD-N5RL333G-75AovNU70Srby_pXzOdL1LEwjw B5W

附录

具体源文件见附件,以下给出主要过程与代码:

1. vc6.0 下安装 opencv1.0 (opencv1.0 需要与 vc6.0 搭配使用)

1.下载 OpenCV 安装程序。假定现在要将 OpenCV 安装到 C:\Program Files\OpenCV

2.安装完成后,将 C:\Program Files\OpenCV\bin 加入到环境变量。

具体步骤:右击我的电脑→属性→高级系统设置→高级→环境变量→在 administrator 的用户变量

中新建,变量名为 Path,变量值为 F:\OpenCV\bin;

3.打开 vc++6.0,在菜单 Tools->Options->Directories:先设置 lib 路径,选择 Library files,在下方

填入路径:C:\Program Files\OpenCV\lib

然后选择 include files,在下方填入路径:

C:\Program Files\OpenCV\cxcore\include

C:\Program Files\OpenCV\cv\include

C:\Program Files\OpenCV\cvaux\include

C:\Program Files\OpenCV\ml\include

C:\Program Files\OpenCV\otherlibs\highgui

C:\Program 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”,完成设置

4.每创建一个将要使用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。

Page 16: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 16 页,共 23 页

2. 背景差分法代码

#include <stdio.h>

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

#include <cvaux.h>//必须引此头文件

int main( int argc, char** argv )

{

IplImage* pFrame = NULL;

IplImage* pFrImg = NULL;

IplImage* pBkImg = NULL;

CvCapture* pCapture = NULL;

int nFrmNum = 0;

int w,h;

IplImage* motion = 0;

IplImage* a = 0;

IplImage* b = 0;

CvSize size;

cvNamedWindow("video", 1);

cvNamedWindow("background",1);

cvNamedWindow("foreground",1);

cvMoveWindow("video", 30, 0);

cvMoveWindow("background", 360, 0);

cvMoveWindow("foreground", 690, 0);

CvMemStorage *stor;

CvSeq *cont;

//打开视频文件

pCapture = cvCaptureFromFile("11.avi");

if( !pCapture )

{

fprintf(stderr, "Can not open video file %s\n", argv[1]);

return -2;

}

//初始化高斯混合模型参数

CvGaussBGModel* bg_model=NULL;

while(pFrame = cvQueryFrame( pCapture ))

{

nFrmNum++;

if(nFrmNum == 1)

{ //初始化帧

pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), pFrame->depth,

pFrame->nChannels /*IPL_DEPTH_8U,3*/);

pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);

motion = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );

a = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );

b = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );

//高斯背景建模,pFrame 可以是多通道图像也可以是单通道图像

//cvCreateGaussianBGModel 函数返回值为 CvBGStatModel*,

Page 17: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 17 页,共 23 页

//需要强制转换成 CvGaussBGModel*

bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);

}

else

{

//更新高斯模型

cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );

//pFrImg 为前景图像,只能为单通道

//pBkImg 为背景图像,可以为单通道或与 pFrame 通道数相同

cvCopy(bg_model->foreground,pFrImg,0);

cvCopy(bg_model->background,pBkImg,0);

cvThreshold(pFrImg, pFrImg, 128, 255, CV_THRESH_BINARY);

//将视频帧与背景灰度化

cvCvtColor( pFrame, a, CV_BGR2GRAY );

cvCvtColor( pBkImg, b, CV_BGR2GRAY );

//差分运算

cvAbsDiff( a, b, motion );

//二值化

cvThreshold(motion, motion, 20, 255, CV_THRESH_BINARY);

//腐蚀、膨胀运算

cvErode(motion,motion,0,1);

cvDilate( motion, motion, 0, 5 );

cvErode(motion,motion,0,1);

//高斯滤波

cvSmooth(pFrImg,pFrImg,CV_MEDIAN,3,0,0,0);

//划定矩形碰撞区域

w = pFrame->width / 2 - 8;

h = pFrame->height;

cvRectangle(pFrame,cvPoint(w+60,0),cvPoint(w+80,h),cvScalar(0,0,255),1);

stor = cvCreateMemStorage(0);

cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);

//找出所有连续区域的最小外接矩形

cvFindContours(motion, stor, &cont, sizeof(CvContour), CV_RETR_LIST,

CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

//如果中心点落入碰撞区域则将矩形显示

for(;cont;cont = cont->h_next)

{

CvRect r = ((CvContour*)cont)->rect;

if((r.x+r.x+r.width)/2>w+60 && (r.x+r.x+r.width)/2<w+80 && r.width > 50) // 筛选掉

宽度小的矩形

{

cvRectangle(pFrame, cvPoint(r.x,r.y), cvPoint(r.x + r.width, r.y + r.height),

CV_RGB(255,0,0), 1, CV_AA,0);

}

}

//把图像正过来

pBkImg->origin=1;

pFrImg->origin=1;

motion->origin=1;

Page 18: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 18 页,共 23 页

cvShowImage("video", pFrame);

cvShowImage("background", pBkImg);

cvShowImage("foreground", pFrImg);

if( cvWaitKey(50) >= 0 )

break;

}

}

//释放高斯模型参数占用内存

cvReleaseBGStatModel((CvBGStatModel**)&bg_model);

cvDestroyWindow("video");

cvDestroyWindow("background");

cvDestroyWindow("foreground");

cvReleaseImage(&pFrImg);

cvReleaseImage(&pBkImg);

cvReleaseCapture(&pCapture);

return 0;

}

3. 差帧代码_函数部分

// various tracking parameters (in seconds) //跟踪的参数(单位为秒)

const double MHI_DURATION = 0.01;//0.5s 为运动跟踪的最大持续时间

//const double MAX_TIME_DELTA = 0.5; //最大时间增量为 0.5s

//const double MIN_TIME_DELTA = 0.1; //最小时间增量 0.05s

const int N = 3;

//

const int CONTOUR_MAX_AERA = 64;

int w,h;

// ring image buffer 圈出图像缓冲

IplImage **buf = 0;//指针的指针

int last = 0;

// temporary images 临时图像

IplImage *mhi = 0; // MHI: motion history image 运动历史图像

CvConnectedComp *cur_comp, min_comp; //连接部件

CvConnectedComp comp;

CvMemStorage *storage; //内存存储器

CvPoint pt[4]; //二维坐标系下的点,类型为整型 ,通常以 0 点为原点,有 x 坐标和 y 坐标

int nCurFrameIndex = 0;

// 参数:

// img - 输入视频帧 // dst - 检测结果

void update_mhi( IplImage* img, IplImage* dst)

{

double timestamp = clock()/100.; // get current time in seconds 时间戳

CvSize size = cvSize(img->width,img->height); // get current frame size,得到当前帧的尺寸

int i, j,c, idx1, idx2;

IplImage* silh;

IplImage* pyr = cvCreateImage( cvSize((size.width & -2)/2, (size.height & -2)/2), 8, 1 );

CvMemStorage *stor;

Page 19: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 19 页,共 23 页

CvSeq *cont;

w = img->width / 2 - 8;

h = img->height;

cvRectangle(img,cvPoint(w+60,0),cvPoint(w+80,h),cvScalar(0,0,255),1); //划定矩形区域

/*先进行数据的初始化*/

if( !mhi || mhi->width != size.width || mhi->height != size.height )

{

if( buf == 0 ) //若尚没有初始化则分配内存给他

{

buf = (IplImage**)malloc(N*sizeof(buf[0]));

memset( buf, 0, N*sizeof(buf[0]));

}

for( i = 0; i < N; i++ )

{

cvReleaseImage( &buf[i] );

buf[i] = cvCreateImage( size, IPL_DEPTH_8U, 1 );

cvZero( buf[i] );// clear Buffer Frame at the beginning

}

cvReleaseImage( &mhi );

mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 );

cvZero( mhi ); // clear MHI at the beginning

} // end of if(mhi)

/*将当前要处理的帧转化为灰度放到 buffer 的最后一帧中*/

cvCvtColor( img, buf[last], CV_BGR2GRAY ); // convert frame to grayscale

/*设定帧的序号*/

idx1 = last;

idx2 = (last + 1) % N; // index of (last - (N-1))th frame

last = idx2;

// 做帧差

silh = buf[idx2];//差值的指向 idx2

cvAbsDiff( buf[idx1], buf[idx2], silh ); // get difference between frames

// 对差图像做二值化

cvThreshold( silh, silh, 50, 255, CV_THRESH_BINARY ); //threshold it,二值化

//去掉超时的影像以更新运动历史图像

cvUpdateMotionHistory( silh, mhi, timestamp, MHI_DURATION ); // update MHI

cvConvert( mhi, dst );//将 mhi 转化为 dst,dst=mhi

// 中值滤波,消除小的噪声

cvSmooth( dst, dst, CV_MEDIAN, 3, 0, 0, 0 );

cvPyrDown( dst, pyr, CV_GAUSSIAN_5x5 );// 向下采样,去掉噪声,图像是原图像的四分之一

cvDilate( pyr, pyr, 0, 5 ); // 做膨胀操作,消除目标的不连续空洞

cvPyrUp( pyr, dst, CV_GAUSSIAN_5x5 );// 向上采样,恢复图像,图像是原图像的四倍

Page 20: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 20 页,共 23 页

// 下面的程序段用来找到轮廓

// Create dynamic structure and sequence.

stor = cvCreateMemStorage(0);

cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);

// 找到所有轮廓

cvFindContours( dst, stor, &cont, sizeof(CvContour),

CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

//c = cont->total;

// 直接使用 CONTOUR 中的矩形来画轮廓

for(;cont;cont = cont->h_next)

{

CvRect r = ((CvContour*)cont)->rect;

if(r.height * r.width > CONTOUR_MAX_AERA) // 面积小的方形抛弃掉

{

if((r.x+r.x+r.width)/2>w+60 && (r.x+r.x+r.width)/2<w+80){ //碰撞检测

cvRectangle( img, cvPoint(r.x,r.y), cvPoint(r.x + r.width, r.y + r.height), CV_RGB(255,0,0), 1,

CV_AA,0);

}

}

}

//free memory

cvReleaseMemStorage(&stor);

cvReleaseImage( &pyr );

}

4. 差帧代码_主体部分

#include "cv.h"

#include "highgui.h"

#include <time.h>

#include <math.h>

#include <stdio.h>

#include <string.h>

#include "vector"

int main(int argc, char** argv)

{

IplImage* motion = 0;

CvCapture* capture = 0;

capture = cvCaptureFromAVI("11.avi" );//AVI 为视频来源

if( capture )

{

cvNamedWindow( "Frame", 1 );//建立窗口

//cvNamedWindow( "Motion" , 2);

}

for( ; ; )

{

IplImage* image;

if( !cvGrabFrame( capture ))//捕捉一桢

break;

image = cvRetrieveFrame( capture );//取出这个帧

Page 21: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 21 页,共 23 页

if( image )//若取到则判断 motion 是否为空

{

if( !motion )

{

motion = cvCreateImage( cvSize(image->width,image->height), 8, 1 ); //创建 motion

帧,八位,一通道

cvZero( motion ); //零填充 motion

motion->origin = image->origin; //内存存储的顺序和取出的帧相同

}

}

update_mhi( image, motion);//更新历史图像

cvShowImage( "Frame", image );//显示处理过的图像

//cvShowImage( "Motion",motion);

if( cvWaitKey(100) >= 0 )//10ms 中按任意键退出

break;

}

cvReleaseCapture( &capture );//释放设备

cvDestroyWindow( "Frame" );//销毁窗口

//cvDestroyWindow("Motion");

return 0;

}

5. 分类法代码_函数部分

#include "cv.h"

#include "highgui.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

#include <math.h>

#include <float.h>

#include <limits.h>

#include <time.h>

#include <ctype.h>

#ifdef _EiC

#define WIN32

#endif

static CvMemStorage* storage = 0;

static CvHaarClassifierCascade* cascade = 0;

void detect_and_draw( IplImage* image );

const char* cascade_name =

"xml.xml";

void detect_and_draw(IplImage* img )

{

double scale=1.2;

static CvScalar colors[] = {

{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},

Page 22: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 22 页,共 23 页

{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}

};//圆圈的颜色

//准备图像

//

IplImage* gray = cvCreateImage(cvSize(img->width,img->height),8,1);

IplImage*

small_img=cvCreateImage(cvSize(cvRound(img->width/scale),cvRound(img->height/scale)),8,1);

cvCvtColor(img,gray, CV_BGR2GRAY);

cvResize(gray, small_img, CV_INTER_LINEAR);

cvEqualizeHist(small_img,small_img); //直方图均衡

//开始识别

cvClearMemStorage(storage);

double t = (double)cvGetTickCount();

CvSeq* objects = cvHaarDetectObjects(small_img, cascade, storage, 1.1, 2, 0, cvSize(30,30));

//t = (double)cvGetTickCount() - t; //显示每次识别所耗时间

//printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );

//圈出识别出来的物体

for( int i = 0; i < (objects? objects->total : 0); i++ )

{

CvRect* r = (CvRect*)cvGetSeqElem( objects, i );

CvPoint center;

int radius;

center.x = cvRound((r->x + r->width*0.5)*scale);

center.y = cvRound((r->y + r->height*0.5)*scale);

radius = cvRound((r->width + r->height)*0.25*scale);

cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );

}

cvShowImage( "result", img );

cvReleaseImage(&gray);

cvReleaseImage(&small_img);

}

6. 分类法代码_主体部分

int main( int argc, char** argv )

{

cascade_name = "xml.xml"; //装载 xml 文件

cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

if( !cascade )

{

fprintf( stderr, "ERROR: Could not load classif ier cascade\n" );

return -1;

}

storage = cvCreateMemStorage(0);

cvNamedWindow( "result", 1 );

IplImage* motion = 0;

CvCapture* capture = 0;

Page 23: 基于 OpenCV 的小车压双黄线的自动检测 - TipDM泰迪华南杯数据挖掘竞赛论文报告 第1 页,共23 页 基于OpenCV 的小车压双黄线的自动检测 摘 要:本文以小车压双黄线为例,介绍了对基于OpenCV的视频图像处理技术的自动识别的研

泰迪华南杯数据挖掘竞赛论文报告

第 23 页,共 23 页

capture = cvCaptureFromAVI("11.avi" );//AVI 为视频来源

if( capture )

{

for( ; ; )

{

IplImage* image;

if( !cvGrabFrame( capture ))//捕捉一桢

break;

image = cvRetrieveFrame( capture );//取出这个帧

//识别汽车

detect_and_draw( image );

cvShowImage( "result", image );//显示处理过的图像

if( cvWaitKey(100) >= 0 )//10ms 中按任意键退出

break;

}

cvReleaseCapture( &capture );//释放设备

cvDestroyWindow( "result" );//销毁窗口

}

cvDestroyWindow("result");

return 0;

}