基于codebook的运动目标检测和追踪+演示ppt


WINDOWS上用VS2013实现基于码书的运动目标检测,检测了在会议厅中的运动目标,实现了目标跟踪和绘制目标轮廓的功能。最后还有演示的ppt
资源截图
代码片段和文件信息
#include         
#include 
#include 

#define CHANNELS 3      
// 设置处理的图像通道数要求小于等于图像本身的通道数

///////////////////////////////////////////////////////////////////////////
// 下面为码本(codeook)码元(ce)的数据结构
// 处理图像时每个像素对应一个码本每个码本中可有若干个码元

typedef struct ce {
uchar   learnHigh[CHANNELS];
// 此码元各通道的阀值上限(学习界限)
uchar   learnLow[CHANNELS];
// 此码元各通道的阀值下限
// 学习过程中如果一个新像素各通道值x[i]均有 learnLow[i]<=x[i]<=learnHigh[i]则该像素可合并于此码元
uchar   max[CHANNELS];
// 属于此码元的像素中各通道的最大值
uchar   min[CHANNELS];
// 属于此码元的像素中各通道的最小值
int     t_last_update;
// 此码元最后一次更新的时间每一帧为一个单位时间用于计算stale
int     stale;
// 此码元最长不更新时间用于删除规定时间不更新的码元精简码本
} code_element;                     // 码元的数据结构

typedef struct code_book {
code_element    **cb;
// 码元的二维指针理解为指向码元指针数组的指针使得添加码元时不需要来回复制码元只需要简单的指针赋值即可
int             numEntries;
// 此码本中码元的数目
int             t;
// 此码本现在的时间一帧为一个时间单位
} codeBook;                         // 码本的数据结构


///////////////////////////////////////////////////////////////////////////////////
// int updateCodeBook(uchar *p codeBook &c unsigned cbBounds int numChannel)
// 使用新的数据点更新codebook条目
//
// p            指向一个YUV像素的指针
// c            此像素的码本
// cbBounds     代码本的学习边界 (查阅资料得到的最佳值: 10)
// numChannel   正在学习的颜色通道的数量
//
//
// 返回
// 码本索引
int cvupdateCodeBook(uchar *p codeBook &c unsigned *cbBounds int numChannel)
{
if (c.numEntries == 0) c.t = 0;
// 码本中码元为零时初始化时间为0
c.t += 1;   // 记录学习事件
// 每调用一次加一即每一帧图像加一

//设置像素阀值上下限
int n;
unsigned int high[3] low[3];
for (n = 0; n < numChannel; n++)
{
high[n] = *(p + n) + *(cbBounds + n);
// *(p+n) 和 p[n] 结果等价经查阅*(p+n) 速度更快
if (high[n] > 255) high[n] = 255;
low[n] = *(p + n) - *(cbBounds + n);
if (low[n] < 0) low[n] = 0;
// 用p 所指像素通道数据加减cbBonds中数值作为此像素阀值的上下限
}

//测试p像素是否适合现有的码元阀值
int matchChannel;
int i;
for (i = 0; i < c.numEntries; i++)
{
// 遍历此码书每个码元测试p像素是否满足其中之一
matchChannel = 0;
for (n = 0; n < numChannel; n++)
//遍历每个通道
{
if ((c.cb[i]->learnLow[n] <= *(p + n)) && (*(p + n) <= c.cb[i]->learnHigh[n]))
// 如果p 像素通道数据在该码元阀值上下限之间
{
matchChannel++;
}
}
if (matchChannel == numChannel)
// 如果p 像素各通道都满足上面条件
{
c.cb[i]->t_last_update = c.t;
// 更新该码元时间为当前时间

for (n = 0; n < numChannel; n++)
//调整该码元各通道最大最小阀值
{
if (c.cb[i]->max[n] < *(p + n))
c.cb[i]->max[n] = *(p + n);
else if (c.cb[i]->min[n] > *(p + n))
c.cb[i]->min[n] = *(p + n);
}
break;
}
}

// p 像素不满足此码本中任何一个码元下面创建一个新码元
if (i == c.numEntries)
{
code_element **foo = new code_element*[c.numEntries + 1];
// 申请c.numEntries+1 个指向码元的指针
for (int ii = 0; ii < c.numEntries; ii++)
// 将前c.numEntries 个指针指向已存在的每个码元
foo[ii] = c.cb[ii];

foo[c.numEntries] = new code_element;
// 申请一个新的码元
if (c.numEntries) delete[] c.cb;
// 删除c.cb 指针数组
c.cb = foo;
// 把foo 头指针赋给c.cb

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-04-17 09:20  codebook
     目录           0  2018-12-20 10:46  codebookcodebook
     目录           0  2018-12-20 10:45  codebookcodebook.vs
     目录           0  2018-12-20 10:45  codebookcodebook.vscodebook
     目录           0  2018-12-20 10:45  codebookcodebook.vscodebookv15
     文件       32768  2018-12-20 10:45  codebookcodebook.vscodebookv15.suo
     文件    22208512  2018-12-20 10:45  codebookcodebook.vscodebookv15Browse.VC.db
     目录           0  2018-12-20 10:45  codebookcodebookcodebook
     文件     6252544  2009-04-30 22:51  codebookcodebookcodebookRaw.avi
     文件       14554  2018-12-12 14:43  codebookcodebookcodebookcodebook.cpp
     文件        8411  2018-12-06 00:11  codebookcodebookcodebookcodebook.vcxproj
     文件        1156  2018-12-06 00:08  codebookcodebookcodebookcodebook.vcxproj.filters
     文件         165  2018-12-06 00:08  codebookcodebookcodebookcodebook.vcxproj.user
     文件         200  2018-12-06 00:08  codebookcodebookcodebookpch.cpp
     文件         639  2018-12-06 00:08  codebookcodebookcodebookpch.h
     目录           0  2018-12-20 10:45  codebookcodebookcodebookx64
     目录           0  2018-12-20 10:46  codebookcodebookcodebookx64Debug
     文件         273  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.log
     文件      433721  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.obj
     文件     2031616  2018-12-06 00:11  codebookcodebookcodebookx64Debugcodebook.pch
     目录           0  2018-12-20 10:46  codebookcodebookcodebookx64Debugcodebook.tlog
     文件        1492  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.tlogCL.command.1.tlog
     文件       43084  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.tlogCL.read.1.tlog
     文件        1110  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.tlogCL.write.1.tlog
     文件         208  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.tlogcodebook.lastbuildstate
     文件        1234  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.tloglink.command.1.tlog
     文件        2238  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.tloglink.read.1.tlog
     文件         598  2018-12-12 14:43  codebookcodebookcodebookx64Debugcodebook.tloglink.write.1.tlog
     文件        3898  2018-12-06 00:11  codebookcodebookcodebookx64Debugpch.obj
     文件      388096  2018-12-12 14:43  codebookcodebookcodebookx64Debugvc141.idb
     文件     1921024  2018-12-12 14:43  codebookcodebookcodebookx64Debugvc141.pdb
............此处省略8个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)