嵌入式

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+

嵌入式

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

在行人识别的最后步骤,需要对识别出的行人进行标记。通常在实验阶段往往只是把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 -

嵌入式

行人识别算法的系统设计

模块化设计 行人识别算法的具有一定的复杂度,在设计系统框架时要处理好以下问题: 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 单一职责原则 **定义:**不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 **实现:**对系统功能模块化,每个模块只负责自己的功能。 里氏替换原则 **定义:**如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化。 **实现:**定义存储函数接口的结构体,在结构体中定义函数接口。不同的模块提供一个构造函数,在构造函数中申明接口实现并返回该结构体。针对不同的实现只需要将结构体中的函数接口指向不同的实现,上层模块的调用不会有感知。 依赖倒置原则

嵌入式

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

嵌入式

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

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

嵌入式

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无法及时提供视频帧,导致FVID_exchange失败。由于文档中并没有提失败时的算法内部处理流程,因此我们按照文档中说明的FVID_exchange是FVID_queue和FVID_dequeuer的集合,将这个方法结构,且不对异常进行处理。

皖ICP备13007154号-1