专栏首页钱塘小甲子的博客MeanShift算法C++解析(二)

MeanShift算法C++解析(二)

这回呢主要说说鼠标回调函数和目标初始化函数。

当在视频流界面按下按键“P”的时候呢,画面就会停止,点击两下鼠标,分别作为追踪目标选择的左上角和右下角,如此,就可确定追踪目标。在鼠标选择完毕之后,回调函数onMouse会调用init_target函数。这是一个目标初始化函数,也差不多包括了MeanShift算法的一部分核心内容了吧。至于什么是回调函数,那我只能简单的说一下。回调函数是事件驱动的编程方法中的一种函数。函数调用时间不确定,只有特定事件发生,例如按下某个按键,函数才会激活被调用,在Qt内部机制里面叫槽函数(实现有点不一样),在MFC里面就是大量的回调函数,包括eclipse里面也是。有点类似于嵌入式编程里面的中断函数吧。​

void onMouse(intevent,intx,inty,intflags,void*param)

{
if(pause)
{
//=======================================
if(event==CV_EVENT_LBUTTONDOWN)
{
CvPointpt=cvPoint(x,y);
if(chooseEndFlag==MOUSE2PT)
{
drawing_box.width=abs(pt1st.x-pt.x);
drawing_box.height=abs(pt1st.y-pt.y);//设置目标矩形的宽和高
cvRectangle(current,pt1st,pt,CV_RGB(255,0,0),2);
cvShowImage("Meanshift",current);//绘制带目标矩形的图像
//目标初始化
m_wei=(double*)malloc(sizeof(double)*drawing_box.height*drawing_box.width);
init_target(hist1,m_wei,current);
is_tracking=true;
//break;
chooseEndFlag=MOUSE1PT;
return;
}
else
{
chooseEndFlag=MOUSE2PT;
pt1st=cvPoint(pt.x,pt.y);
drawing_box.x=pt.x;
drawing_box.y=pt.y;
}
}
}

}

在onMouse函数里面调用了init_target函数,这个函数 好好解析一下首先是内部变量,

​如下面的示意图所示(有点丑),

​int t_h,t_w,t_x,t_y;这四个量分别用来描述选择的跟踪目标的矩形框,依次是:高,宽,左上角横坐标,左上角纵坐标。

double h,dist;这两个变量是比较重要的,h是整个算法的带宽,就是目标矩形中点到四个顶点的长度的平方,(h=pow(((double)t_w)/2,2)+pow(((double)t_h)/2,2);),dist的话,是distance的意思,就是某一点到中点的距离(dist=pow(i-(double)t_h/2,2)+pow(j-(double)t_w/2,2);//d=x^2+y^2)

int i,j;用来循环计数的变量
int q_r,q_g,q_b,q_temp;由于是彩色图像,所以要分成RGB三个通道来完成,然后计算出最终用来表示颜色的数值(q_temp=q_r*256+q_g*16+q_b;)

hist1呢就是一个直方图,横坐标从0,1,2,3,4一直到4096,因为有三个通道,每个通道16位。init_target的本质任务,就是填好这张名字叫做hist1的直方图。

最简单的填法就是,从目标矩形第一个像素开始,是哪种颜色就对属于那种颜色的那个数值加一。​但是这样对于像素同学们太一视同仁了。我们往往认为处于目标矩形中间的像素有更加多的话语权。所以我们利用之间计算的h和dist计算出一个权重矩阵

m_wei[i*t_w+j]=1-dist/h;

​C+=m_wei[i*t_w+j];

然后把所有权值求和,就和的目的等会儿就知道啦。​

hist1[q_temp]=hist1[q_temp]+m_wei[(i-t_y)*t_w+(j-t_x)];
这是直方图的计算公式,q_temp是当前像素对应的0-4096的色彩值。仔细一想,发现,本质就是,每一个目标矩形里面的像素点都有一张选取票,票上写着权值矩阵中对应的大小,然后开始投票,于是直方图就形成了。
//归一化直方图
for(i=0;i<</span>4096;i++)
{
hist1[i]=hist1[i]/C;

}

直方图的所有值加起来要等于100%,初中的孩子都知道哦。所以需要用C这样一个东西。不过作为一个小本,装着逼要说这叫直方图的归一化。

void init_target(double*hist1,double*m_wei,IplImage*current)

{//此函数无需考虑时间复杂度
int t_h,t_w,t_x,t_y;//目标矩形信息
double h,dist;
int i,j;
int q_r,q_g,q_b,q_temp;
t_h=drawing_box.height;//选区高
t_w=drawing_box.width;//选区宽
t_x=drawing_box.x;//选区左上角x坐标
t_y=drawing_box.y;//选区左上角y坐标
h=pow(((double)t_w)/2,2)+pow(((double)t_h)/2,2);//带宽,(不明白原来的注释为什么是带宽,感觉就是用来归一化的,最大的离中心点的距离)
//初始化权值矩阵和目标直方图
for(i=0;i<</span>t_w*t_h;i++)
{
m_wei[i]=0.0;
}
for(i=0;i<</span>4096;i++)//4098=16*16*16
{
hist1[i]=0.0;
}
for(i=0;i<</span>t_h;i++)
{
for(j=0;j<</span>t_w;j++)
{
dist=pow(i-(double)t_h/2,2)+pow(j-(double)t_w/2,2);//d=x^2+y^2
m_wei[i*t_w+j]=1-dist/h;
C+=m_wei[i*t_w+j];//统计权值矩阵的总和?
}
}
//计算目标权值直方
for(i=t_y;i<</span>t_y+t_h;i++)
{
for(j=t_x;j<</span>t_x+t_w;j++)
{
//rgb颜色空间量化为16*16*16bins
q_r=((u_char)current->imageData[i*current->widthStep+j*3+2])/16;//char*imageData;
q_g=((u_char)current->imageData[i*current->widthStep+j*3+1])/16;
q_b=((u_char)current->imageData[i*current->widthStep+j*3+0])/16;
q_temp=q_r*256+q_g*16+q_b;
hist1[q_temp]=hist1[q_temp]+m_wei[(i-t_y)*t_w+(j-t_x)];
}
}
//归一化直方图
for(i=0;i<</span>4096;i++)
{
hist1[i]=hist1[i]/C;
}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MeanShift算法C++解析(四)

    之前的MeanShift算法只是一个大致的算法,没有任何附加的功能哦。现在还是从程序本身理解算法吧,等真的理解透了理论在来扯一下整个MeanShift 的无参...

    钱塘小甲子
  • 多因子模型之因子(信号)测试平台----因子值的处理(一)

    在开始今天的内容前,我们要先了解几个概念。许多书本上,可能不会这样讲,这个仅仅是笔者的一些感悟。

    钱塘小甲子
  • 时间序列分析这件小事(二)--自回归

    说到时间序列,那么就必须提起自回归了。什么是自回归呢,就是说未来的一个时点可以用之前的时点来进行回归预测,还是那一串数字,但是时间状态不同了,存在不同阶的时滞。

    钱塘小甲子
  • IMex和IntAct数据库简介

    蛋白质相互作用的数据库非常的多,比如DIP, MINT, IntAct, BioGRID等,不同数据库中的信息存在了大量的冗余,而且在不同数据库之间进行检索也非...

    生信修炼手册
  • 数据中心蓄冷时间多长合适呢?-孙长青

    2010年3月25日,据国外媒体报道,由于欧洲数据中心过热以及应急措施失效,导致维基百科周三出现大范围宕机。

    数据中心DATACenter_PUE-POE
  • c#基础系列1---值类型和引用类型

    不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识,写出来渴求同类抨击,对自己也算是个十年之痒的一个总结。

    架构师修行之路
  • iOS SwiftUI 动画控制运行轨迹之Curve(2020教程)

    动画曲线是一种在整个动画过程中表达速度的方式。在前面的示例中,您看到了“ easeInOut”效果。目前苹果内置了四个运动曲线

    知识大胖
  • 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例

    今年6月SAP发布C/4HANA之后,有顾问朋友们在微信公众号后台留言,询问C/4HANA如何同SAP的数字化核心S/4HANA系统结合起来,从而打通企业的前后...

    Jerry Wang
  • 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例

    今年6月SAP发布C/4HANA之后,有顾问朋友们在微信公众号后台留言,询问C/4HANA如何同SAP的数字化核心S/4HANA系统结合起来,从而打通企业的前后...

    Jerry Wang
  • MySql 5.7.18 数据库主从(Master/Slave)同步安装与配置详解

    MySql复制的优点: 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操作,降低主服务器的访问压力 3.可以在从...

    Javen

扫码关注云+社区

领取腾讯云代金券