解释
最开始需要明白点
1.每一个帧(即 图片/画面)都可以用一个大型数组表达
————————————————————————————————————
第一段:main函数开头第一句
把视频sidewalk.avi 读取到 VideoFile(格式CvCapture*)
if判断读不读取到, 如果VideoFile为空就输出 提示语句,return跳出程序,返回1。
————————————————————————————————————
第二段:
利用 frame_size(格式:CvSize)存储视频的长和宽,
if 判断是否调试模式(调试模式则在窗口显示调试数据)//只是方便程序员看--可以不理会
----后面if (DEBUG)同理,以后的忽略
————————————————————————————————————
第三段:可以不用理解
读取视频的一些参数:
FPS:每秒显示的帧数
FOURCC:视频格式(四字符代码 four character code)
————————————————————————————————————
第四段:实际没有这段代码也可以--可以不用理解
播放器参数设置:使用videoWriter(格式CvVideoWriter*)存储设置
cvCreateVideoWriter(参数1,参数2,参数3,参数4)
参数1:视频地址
参数2:视频格式,('D', 'I', 'V', 'X') 相当于 MPEG-4 格式
参数3:每秒播放帧数
参数4:视频尺寸“长和宽”
————————————————————————————————————
第五段:这段比较长,但都是相互联系的
cvNamedWindow:创建窗口(分别有6个窗口)
窗口1:background Frame
窗口2:current Frame
窗口3:diff Frame
窗口4:output Frame
窗口5:ROI Frame
窗口6:ROI Frame (Color)
diffFrame(格式IplImage*):存储图片
接下来的currentFrame,outFrame,tempFrameBGR,ROIFrame,,,,一样存储图片
cvCreateImage():创建图片参数,赋给diffFrame
不同的窗口显示对应的图片(后面实行的功能,这里的代码只是创建相关参数)
diffFrame -> diff Frame窗口
backgroundFrame -> background Frame窗口
ROI Frame ->ROIFrame窗口
等等
————————————————————————————————————
第六段:创建初始化一些参数
能看懂就不说。。。
注释“修改地方” 是后来自己添加改善判断条件
————————————————————————————————————
第七段:真正功能实现的地方
while(1)死循环:作用是不断循环提取视频每一帧(帧 即图片/画面)
tempFrame = cvQueryFrame(VideoFile);
作用:提取VideoFile一个帧/画面,注意!!提取后VideoFile就减少一帧/画面
提取后通过if判断tempFrame 里是否有 帧/画面,有才进入下一步(第八段)
————————————————————————————————————
第八段:
cvCvtColor(色彩转换):把tempFrame(原图)颜色剔除后,存储到currentFrame
(实现RGB颜色向HSV,HSI等颜色空间的转换)
cvCvtColor(参数1,参数2,参数3)
参数1:输入 帧/画面
参数2:输出 帧/画面
参数3: 转换为 CV_GRAY2BGR 格式
imageCount(计算现在的是视频的第几个帧/画面)
if判断imageCount是否第0个帧/画面(即第一个帧/画面),意思是只有程序开始才会运行一次,以后不运行。
if判断内运行的:
backgroundFrame = cvCloneImage(currentFrame);
//保持参照图(以后就以这图比较)---只要跟这图比较,有不同就认为有物体经过
---(可以不用理解)for语句是自己添加的用来调试,功能:跳过前一部分视频
————————————————————————————————————
第九段:
图片显示:对应第五段中创建的窗口显示
cvShowImage(参数1,参数2)
参数1:对应的窗口“background Frame”
参数2:需要显示的变量(存 帧/画面 )
两个图片找出不同的
cvAbsDiff(参数1,参数2,参数3)
参数1:输入比较帧/画面1
参数2:输入比较帧/画面2
第十段:
cvCvtColor(色彩转换):把tempFrame(原图)颜色剔除后,存储到currentFrame
(实现RGB颜色向HSV,HSI等颜色空间的转换)
cvRectangle:绘制画面里的矩形
cvShowImage:diffFrame帧/画面 -> diff Frame窗口
cvCvtColor(色彩转换):把(原图)颜色剔除后,存储到tempFrameBGR
ROIFrame = cvCloneImage(outFrame);
//复制outFrame帧/画面 到ROIFrame 存储
————————————————————————————————————
第十一段:
cvSetImageROI:
感兴趣区域(在帧/画面 设定一个范围)
cvSetImageROI(参数1,参数2)
参数1:需要修改设置的帧/画面,ROIFrame
参数2:cvRect范围坐标(长,宽,长距离,宽距离)【对应(x,y,长度,高度)】
cvShowImage:在ROI Frame窗口显示 ROIFrame帧/画面
cvSetImageCOI:
感兴趣通道(一个帧/画面 有3个颜色通道合并而成,Photoshop上可以看到)
cvSetImageCOI(参数1,参数2);
参数1:需要修改设置的帧/画面,ROIFrame
参数2:通道几,对应R、G、B(Red红色,Green绿色,Blue蓝色--三原色)
!!修改后帧/画面只剩下相对应的色彩
————————————————————————————————————
第十二段:
这段代码大意,通过cvMinMaxLoc 在ROIFrame帧/画面取得 四个值,分别是minVal, maxVal, minLoc, maxLoc。
然后只判断其中的一个值maxVal是否在70以上(可以理解为 ROIFrame帧/画面里 有多少跟背景backgroundFrame帧/画面 不同点数)
minVal:最小值【帧/画面里(即数组里) 的最小值】 ---不明白可以看回文章第一行的解释
maxVal:最大值【帧/画面里(即数组里) 的最大值】 ---不明白可以看回文章第一行的解释
minLoc:最小值的坐标(x,y)
maxLoc:最大值的坐标(x,y)
if判断 maxVal < 70
当maxVal 为70以下判断为无物体经过
功能: 清除maxVal >=70判断为有人时得到的数据
if判断 maxVal >=70
当maxVal 为70以上判断为有物体经过
功能: 继续第十三段代码
————————————————————————————————————
第十三段:这段代码是我自己添加的,主要是实现有第二个人进入感兴趣区域,也能计算。
if判断 testCount2 = 0
功能1:当有第一个人进入时记录下他的坐标
if判断 testCount3 = 0
功能2:将 前一个帧/画面记录下他的坐标 与 现在的帧/画面记录下他的坐标比较。当位置坐标的值相差一定值时,就认为有第二个人进入感兴趣区域,person+1 人数加一
personX:记录人的 X 坐标
personY:记录人的 Y 坐标
testCount2 :相当于功能1开关
testCount3 :相当于功能2开关
————————————————————————————————————
第十四段:
cvSetImageCOI:ROIFrameBGRPrior感兴趣通道,设为 通道一 R(详解对照 第十一段)
if判断 条件1:MOVEMENT == 0 条件2:cvCountNonZero(ROIFrameBGRPrior) == 0 【条件解释向下看】
当条件1跟条件2同时成立,才会执行功能
功能1:cvZero(ROIFrameBGR)清除ROIFrameBGR里的数据,MOVEMENT=1开关上锁(直到重置后才能进入判断),people+1 人数加1。
MOVEMENT :相当于功能1 开关
ROIFrameBGRPrior:已被修改为通道一 的 ROIFrameBGRPrior 帧/画面,
cvCountNonZero(参数1)
参数1:ROIFrameBGRPrior 帧/画面
功能: 计算非零数组元素个数,当ROIFrameBGRPrior 帧/画面 里有人经过就有多个非零数组(n个)
————————————————————————————————————
第十五段:绘制ROI Frame (Color)窗口的图【大概了解就可以】
大致功能跟绿色注释相同
————————————————————————————————————
第十六段:选择性理解
cvOr:或运算
cvOr(参数1,参数2,参数3)
参数1:输入帧/画面1(数组)
参数2:输入帧/画面2(数组)
参数3:通过数组或运算,输出到帧/画面1
cvRectangle:绘制outFrame帧/画面中的 矩形框
sprintf:存储需要在窗口显示的文字(字符串格式化)
sprintf(参数1,参数2,变量1。。显示多个变量)
参数1:将下面的参数存在 peopleCount字符数组中(可以理解为存储待显示的内容)
参数2:可以根据自己需要显示的文字信息,定义具体文字信息
变量1:输出people人数
————————————————————————————————————
第十七段:主要设置在outFrame窗口显示的文字信息(这里设置sprintf里的文字显示格式)
cvInitFont:字体结构(例:字体宽度,字体高度字体的斜度,字体笔划的粗细程度)
cvInitFont(参数1,参数2,参数3,参数4,参数5)
参数1:将下列参数 存储到 font(格式:CvFont)中
参数2:字体名称标识符,对应不同的格式(CV_FONT_HERSHEY_SIMPLEX -
参数3 :字体的斜度。当值为 0时
参数4 :字体笔划的粗细程度。
参数5 :字体笔划的类型,
cvPutText:在outFrame帧/画面中添加文字信息
cvPutText(参数1,参数2,参数3,参数4)
主要参数1,2,4
参数1:以下参数 在outFrame帧/画面显示
参数2:用之前存好的 文字内容 peopleCount(格式:char )
参数4:用之前存好的 字体结构 font(格式:CvFont)
imageCount(格式:int)
用来计算现在播放到 视频的第几帧/画面(在调试窗口中显示)
————————————————————————————————————
最后第十八段:然而并没有用(主要功能是 在按下按钮s时暂停)
全部代码已解释