实践5 视频运动目标检测:帧差法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实践5 视频运动目标检测:帧差法的实现
实验任务:
根据原理,获取并显示两幅图像的帧差灰度图和帧差二值图,如下图所示。
实现的算法是:
(1)分别读取两张图像;
(2)将2张图像分别转换为灰度图,转换函数可用:cvCvtColor/cvtColor;
(3)将2张灰度图相减(求差值),得到帧差灰度图,相减函数可用:cvAbsDiff/absdiff;(4)利用阈值操作,将帧差灰度图转化为帧差二值图,阈值操作函数可用:cvThreshold/threshold;(如果假设目标设定为白色,背景设定为黑色,则需要使用逻辑“非”操作进行颜色转换,可使用cvNot/bitwise_not函数);
(5)显示图像。
请将上述任务改成找茬游戏的自动找茬功能。
请改为三帧差分,并上交源代码。
函数解析:
(1)cvCvtColor/cvtColor
C: void cvCvtColor( const CvArr* src, CvArr* dst, int code );
C++:void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
src 输入的8-bit,16-bit或32-bit单倍精度浮点数影像。
dst 输出的8-bit,16-bit或32-bit单倍精度浮点数影像。
code色彩空间转换的模式,该code来实现不同类型的颜色空间转换。比如CV_BGR2GRAY表示转换为灰度图,CV_BGR2HSV将图片从RGB空间转换为HSV空间。常见的code模式有:
CV_RGB2GRAY(彩色图像-灰度图像)
CV_BGR2YCrCb
CV_RGB2YCrCb
CV_YCrCb2BGR
CV_YCrCb2RGB
CV_BGR2HSV
CV_RGB2HSV
CV_HSV2BGR
CV_HSV2RGB
(2)cvAbsDiff/absdiff
OpenCV 中计算两个数组差的绝对值的函数。
void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );
src1 第一个原数组(第一张图像)
src2 第二个原数组(第二张图像)
dst输出数组(输出的帧差图像)
函数cvAbsDiff 计算两个数组差的绝对值,其数学原理为:
dst(I)c = abs(src1(I)c - src2(I)c).
所有数组必须有相同的数据类型相同的大小(或ROI大小)。
(3)cvThreshold/threshold
作用:函数cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。
void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double
max_value, int threshold_type );
src:原始数组(单通道, 8-bit of 32-bit 浮点数)。dst:输出数组,必须与src 的类型一致,或者为8-bit。
threshold:阈值
max_value:使用CV_THRESH_BINARY 和CV_THRESH_BINARY_INV 的最大值。
threshold_type:阈值类型
threshold_type=CV_THRESH_BINARY:
如果src(x,y)>threshold ,dst(x,y) = max_value; 否则,des(x,y)=0;
threshold_type=CV_THRESH_BINARY_INV:
如果src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.
本函数支持的对图像取阈值的方法由threshold_type 确定:
threshold_type=CV_THRESH_BINARY:
dst(x,y) = max_value, if src(x,y)>threshold 0, otherwise.
threshold_type=CV_THRESH_BINARY_INV:
dst(x,y) = 0, if src(x,y)>threshold; dst(x,y) = max_value, otherwise.
threshold_type=CV_THRESH_TRUNC:
dst(x,y) = threshold, if src(x,y)>threshold; dst(x,y) = src(x,y), otherwise.
threshold_type=CV_THRESH_TOZERO:
dst(x,y) = src(x,y), if (x,y)>threshold ; dst(x,y) = 0, otherwise.
threshold_type=CV_THRESH_TOZERO_INV:
dst(x,y) = 0, if src(x,y)>threshold ; dst(x,y) = src(x,y), otherwise.