opencv 行人计算,详细分析(每行解释)---给女朋友看的,初学者T T

解释

最开始需要明白点

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

参数3:输出比较后的(以图片形式显示不同),保存到 /画面3
—————————————————— ——————————————————

第十段:


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:记录人的  坐标

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时  ,字符不倾斜。当值为 1.0f时,字体倾斜 45度。 
参数4 :字体笔划的粗细程度。 
参数5 :字体笔划的类型,


cvPutText:在outFrame/画面中添加文字信息

cvPutText(参数1,参数2,参数3,参数4)

主要参数1,2,4

参数1:以下参数 outFrame/画面显示

参数2:用之前存好的 文字内容 peopleCount(格式:char )

参数4:用之前存好的 字体结构 font(格式:CvFont)


imageCount(格式:int)

用来计算现在播放到 视频的第几帧/画面(在调试窗口中显示)

————————————————————————————————————

最后第十八段:然而并没有用(主要功能是 在按下按钮s时暂停)


全部代码已解释

	


                
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值