嵌入式

DSP平台上的开发总结

行人识别位置过滤总结

数据统计 数据统计工作是为了获得行人位置的分布区间。统计方法为计算不同高度下的行人ROI上边界和下边界距离假设的水平线的距离。 通过在DetectModule输出结果的部分插入以下代码实现统计: if (roi->height < 200) { count[1][roi->height >> 2] += (240 - roi->y - DST_START_COL); //此处统计上边界距离水平线距离 count[0][roi->height >> 2]++; for (int i = 0; i < 50; i++) { printf("%.2f ", count[0][i] == 0 ? 0 : count[1][i] / count[0][i]); } printf("\r\n"); } 统计结果按高度每4个像素为一个阶梯,分布如下图。 接下来统计一下分布距离与ROI高度的关系 从统计结果可以看书,上下边界距离水平线的距离大约呈线性增加,平均比率分别为0.6和0.4。 接下来针对70米(30~50个像素高度)左右距离的ROI进行分析,判断在某个距离下的ROI分布: if (roi->height > 30 && roi->height < 40)

Read more

红外行人识别系统标记方法

在行人识别的最后步骤,需要对识别出的行人进行标记。通常在实验阶段往往只是把ROI的框涂出来,但是在工程阶段,需要更加精细的标记方法以获得更好的用户体验。 经过总结,标记的ROI需要满足以下需求: 只标记人的身体部分,不填或少填无关的部分; 标记部分显示黄色,颜色深浅随着roi的置信度变化; 设计思路: 一般人体的亮度均大于背景,因此可以设置一个阈值,只标记高于阈值的像素,实现只标记人体部分。 我们红外图像只有亮度信息,对应到RGB色域中,RGB的值就是亮度的值。因此我们可以调高R和G的值来提高黄色的色度,降低B的值来增加颜色的深度。只要R和G的值一样且大于B就能获得理想的效果。 那么开始设计: 去除背景部分 经过测试,行人身体的亮度大都大于192,因此只标记亮度大于192的像素。 通过两个像素的均值确定需要填图的黄色色度 yy = (ptr[current + 1] + ptr[current + 3]) >> 1; 根据当前亮度,调整黄色的明暗程度,这部分yb的值必须小于yy yb = yy - (1 << level); 计算具体的亮度值 因为R和G固定,因此直接优化为0.886 * yy,再带入上一公式,化简 y = yy - 0.114 * (1 << level); 换算YCbCr ptr[current + 1] = y; ptr[current + 3] = y; ptr[current] = (yb - y) * 0.564 + 128; ptr[current + 2] = (yy -

Read more

行人识别算法的系统设计

模块化设计 行人识别算法的具有一定的复杂度,在设计系统框架时要处理好以下问题: 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 实现:对系统功能模块化,每个模块只负责自己的功能。 里氏替换原则 定义:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化。 实现:定义存储函数接口的结构体,在结构体中定义函数接口。不同的模块提供一个构造函数,在构造函数中申明接口实现并返回该结构体。针对不同的实现只需要将结构体中的函数接口指向不同的实现,上层模块的调用不会有感知。 依赖倒置原则 定义:高层模块不应该依赖低层模块,且都应该依赖其抽象。 实现:高层模块定义接口,底层模块按照接口设计其实现。高层模块通过对象工厂拿到底层模块的实例,不需要依赖底层模块的头文件。 接口隔离原则 定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 实现:采用多层模块的方式,对内允许模块定义自己的子模块,对外定义统一的操作接口,最小化模块的任务。 迪米特法则 定义:一个对象应该对其他对象保持最少的了解。 实现:在设计检测引擎的时候,引擎只关注于其定义好的四个子模块,不关心子模块的内部实现。子模块在自己的构造函数中完整自己的初始化。 开闭原则 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 实现:在ROI模块中,为避免其他模块存储数据依赖ROI的问题,为ROI模块设计了存储注册机制。遵循先注册后存储的过程,避免对ROI模块的修改。 模块设计的过程 解耦 定义接口,标准化代码逻辑 去除头文件依赖

Read more

DSP开发技巧

DSP侧如何统计具体函数运行时间? TI DSPC64x+内核有一个64位的硬件定时器(Time Stamp Counter),它的频率和CPU频率一致。 最简单的办法是使用TSC的低32位TSCL。注意在DM644x中,TSCH用于ARM。 #include void main (){ … TSCL=0; … t1=TSCL; my_code_to_benchmark(); t2=TSCL; printf(“# cycles == %d\n”, (t2-t1)); } 来源:http://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=61575

Read more

DM6437上行人识别程序开发总结

最近完成了DSP平台上行人识别程序的框架设计与实现,这里总结一下开发过程中遇到的问题及解决方案: 1. BIOS配置文件修改生效问题 CCS3.3编译程序的方式有increase build和build all两种方式,通常情况下如果只有改了某个文件,可以选择increase build来提高算法的编译速度。但是如果修改了配置文件,则一定要选择build all,否则修改无法生效。 2. 周期函数、软中断的配置问题 在BIOS中配置周期函数和软中断的时候,要注意中断配置的名称和它调用的方法不能同名,如果同名的话会导致配置失效。 3. 不同中断函数之间变量共享方式 多个中断函数需要共享某些变量时,可以使用闭包的方式,避免全局变量的使用。即将这几个函数定义在一个.c文件中,使用static修饰共享的变量。 4. 模块复用性提高 上面闭包的方式可以使多个软中断函数共享变量,但是这种设计会降低模块的复用程度,比如相同的检测模块调用多次完成对不同尺度下图像的检测。这时可以使用结构体存储模块的配置参数,每次调用模块中方法使将配置结构体传回,实现对模块的复用。 5. 对内部函数与变量的保护 为了防止外部调用不应该调用的函数,可以定义两个头文件,头文件1声明外部调用需要使用的结构体和函数,头文件2定义内部使用的函数,公开模块时只公开头文件1即可。

Read more

DM6437 使用PRD操作VPFE和VPBE时视频帧异常问题修复

为了将算法执行流程与视频流交换流程分开,需要使用PRD出发软中断,再执行算法或视频流交换操作。 但是在实践中发现,当视频流交换函数触发的时钟周期为50ms时,会随机出现部分视频帧为旧数据的问题,造成视频播放时内容回跳,非常影响显示效果。经过试验,排除了缓冲区过小,硬件计算性能等问题,最后将问题锁定在vpfe和vpbe时数据交换失败上,并解决。 原理说明 在解决问题前首先需要理解sdk中视频帧交换的过程,在DSP/BIOS VPFE Device Driver User's Guide中可以查到,vpfe和vpbe各有两个缓冲队列READY Queue和FREE Queue,它们会不断从READY队列中存入/取出数据,并放入FREE队列中。使用FVID_exchange可以将一个空的buffer加入READY队列并从FREE队列中取出一帧,这也是例子中所推荐的方法,在未使用PRD时也可以流程的执行。 但是,加入PRD触发的频率大于视频输入帧率的时候,vpfe无法及时提供视频帧,导致FVIDexchange失败。由于文档中并没有提失败时的算法内部处理流程,因此我们按照文档中说明的FVIDexchange是FVIDqueue和FVIDdequeuer的集合,将这个方法结构,且不对异常进行处理。 //FVID_exchange(hGioVpfeCcdc, &frameBuffPtr); FVID_queue(hGioVpfeCcdc, frameBuffPtr) FVID_dequeue(hGioVpfeCcdc, &frameBuffPtr); //FVID_exchange(hGioVpbeVid0, &frameBuffPtr); FVID_queue(hGioVpbeVid0, frameBuffPtr); FVID_dequeue(hGioVpbeVid0, &frameBuffPtr); 结构后执行发现和使用exchange时的效果类似,因此推测FVID_exchange对于出队失败并没有特殊处理。当这种情况出现时,frameBuffPtr早vpfe中并没有被更新,并直接放入vpbe的READ队列中,这时假如vpfe在vpbe播放这一帧之前更新了这个数据帧,就会造成某一帧显示的内容超前其它帧。假如没有更新这个数据帧,则会导致某一帧显示的内容落后其它帧。 修改方案 在理解原理后,就可以发现只要在出队失败时,framebuffer所指向的内容是过期的,不能再执行这一帧的入队操作,因此修改程序执行逻辑如下: if ( FVID_

Read more

皖ICP备13007154号-1