camshift之反向投影详解

1、颜色空间转换

H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一HSV颜色空间模型角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。

纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。

V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。

RGB转化到HSV的算法:

max=max(R,G,B);min=min(R,G,B);V=max(R,G,B);S=(max-min)/max;

HSV颜色空间模型(圆锥模型)

if(R = max) H =(G-B)/(max-min)* 60;

if(G = max) H = 120+(B-R)/(max-min)* 60;

if(B = max) H = 240 +(R-G)/(max-min)* 60;

if(H < 0) H = H+ 360;

HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。

 

2、总体来说,该算法通过颜色空间转化函数将RGB空间的图像帧转化为HSV空间的三通道矩阵hsv,然后通过Inrange函数检查输入矩阵的每个元素的三个通道的数值是否在给定的范围内,若在范围内,那么该点对应的掩码值为1,否则为0,从而生成相应的掩码矩阵mask,再通过Mixchannel函数取出hsv矩阵中0通道H分量的值放到hue矩阵中,再由calcHist函数生成H分量的分布直方图,放入hist矩阵中,其中每一维直方图的大小为16,即有16个颜色分布值,而且仅仅统计在0-180之间的H分量。结合calcBackProject函数,把原H通道矩阵通过其直方图映射为相应的反射投影矩阵backproj,然后backproj&mask,保留H分量在0-180之间的元素对应的反向分量值,最后调用camshift算法,得到跟踪框,对每一帧运行meanshift算法。后面又通过histing矩阵分出bin区域,然后生成相应的存放RGB颜色值的buffer矩阵,再通过矩形函数画出RGB空间的彩色颜色分布直方图。

3.代码分析

3、cvCvtColor(src,dst_gray,CV_BGR2GRAY);颜色空间转化函数
void cvCvtColor( const CvArr* src, CvArr* dst, int code ); code色彩空间转换的模式,该code来实现不同类型的颜色空间转换。
比如CV_BGR2GRAY表示转换为灰度图,CV_BGR2HSV将图片从RGB空间转换为HSV空间。其中当code选用CV_BGR2GRAY时,dst需要是单通道图片。
当code选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。在该算法中,
cvtColor(image, hsv, CV_BGR2HSV)用于将rgb摄像头帧转化成hsv空间的。
4、void cvInRangeS( const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst );
src第一个原数组;lower包括进的下边界;upper不包括进的上边界;dst输出数组必须是 8u 或 8s 类型.当src在所在范围内时,dst被置1,否则置0;
5、calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges)

将roi的0通道计算直方图并通过mask放入hist中,hsize为每一维直方图的大小即用来统计颜色个数,hsize=16,&phranges表示用来统计的范围,为0-180度。算法通过mixChannels(&hsv, 1,&hue, 1, ch, 1);将hsv第一个通道(也就是色调)的数复制到hue中,0索引数组表示仅仅取出hsv三个通道的0通道,便于后面计算颜色分布直方图。

6、calcBackProject(&hue, 1, 0, hist, backproj, &phranges)反向投影函数
参数分别是输入图像,输入图像的数量,用于计算反向投影的通道列表,输入直方图,目标反向投影输出图像,直方图中每个维度bin的取值范围。因此该语句为计算hue
图像0通道直方图hist的反向投影,并输入backproj中,图像的反向投影图是用输入图像的某一位置上像素值(多维或灰度)对应在直方图的一个bin上的值来代替
该像素值,所以得到的反向投影图是单通的,输出图像象素点的值是观测数组在某个分布(直方图)下的概率
 
仍然有疑问,H分量的范围为0-360度之间,但是该算法仅仅统计了0-180度之间的值,个人推测因为反向分量之间正好相差180度,所以只需要统计一半的数值就可以得
到整体的颜色分布,而进行完这些繁琐的矩阵间的计算之后,接下来就是camshift算法的整体运行了,对每一帧图片计算其反向分量图,其实就是一种数学上的映射
函数的概念,将三通道的RGB矩阵转化为了单通道的反向通道灰色图像,便于数据之间的比较,找到相似的区域从而实现跟踪,而meanshift算法则是在此基础上不断
地调整跟踪框的大小,更新跟踪框。

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值