将跟踪算法fDSST移植到Nanopi中
fDSST跟踪算法在pc上速度大概为30ms,有着较好的尺度变化适应能力。之前我写的算法尺度变化
方面性能较差,我想将算法移植到nanopi中,测试一下其跟踪速度,看其是否有可能在嵌入式平台中实
时运行跟踪算法(25HZ)。这是我第一次将算法移植到嵌入式平台,移植过程中出了很多问题,通过此
博客将问题进行整理记录,若有不对的地方希望大家能批评指正。
移植过程主要分为三步:跟踪算法的准备,makefile的编写,可执行文件的生成。
1. 跟踪算法准备
从github上下载了一个开源的fdsst跟踪算法,将主函数进行了修改,增加了画框函数、最小面积判
断、改写算法等使之能循环起来。其余部分均从github上下载,并且暂时没有进行修改。
在移植过程中,arm指令集加速的头文件SSE2NEON.h缺少函数,所以我从jratcliff63367/sse2neon
下载了项目,更换了fDSST中的SSE2NEON.h头文件
一共准备了一下几个文件:
Pc上fDSST的跟踪效果:
2. makefile文件的编写
生成linux可以使用的可执行文件的过程为:源文件-> .o文件,再由.o文件->可执行文件 。Makefile
主要有三大块内容:链接库的链接,cpp文件的编译,可执行文件的链接。
“首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即
Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作
叫作链接(link)。
编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是让我们告诉编
译器头文件的所在位置(头文件中放声明,而定义放在C/C++文件中),只要所有的语法正确,编译器
就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(.O文件或是OBJ
文件)。
链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(.O文件或.OBJ
文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件。在大多数
时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,
这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library
File),也就是 .lib 文件,在Linux下,是Archive File,也就是 .a 文件”。
引用自(跟我一起写 Makefile)
2.1 编译的书写方法:
将.cpp或者.c文件编写为.o文件
main.o: main.cpp
g++ -c main.cpp -o main.o
2.2 链接的书写方法:
将生成的.o文件与依赖共同生成linux可以使用的可执行文件.
Csdn有众多makefile的博客,makefile编写 讲了makefile的基础写法以及省略写法。经过众多版本
的测试后,最终在使用opencv第三方库的makefile文件示例的makefile上进行一定的修改,最终生成了可
执行文件。
INCLUDE = $(shell pkg-config --cflags opencv) #opencv的include头文件路径
LIBS = $(shell pkg-config --libs opencv) -lm #opencv的lib库文件路径
#OTHERLIB= -lxxx #其他依赖库
SOURCES = fdssttracker.cpp fhog.cpp main.cpp #源文件
# 目标文件
OBJECTS =main.o fdssttracker.o fhog.o #先生成目标文件.o
# 可执行文件
TARGET =Demo #生成的可执行文件名称
$(TARGET):$(OBJECTS) #可执行文件的链接
g++ -fopenmp -o $(TARGET) $(OBJECTS) -I $(INCLUDE) $(LIBS) $(OTHERLIB) -std=c++11
$(OBJECTS):$(SOURCES) #.o文件的生成
g++ -fopenmp -c $(SOURCES) -std=c++11
clean:
rm $(OBJECTS) $(TARGET)
3. 实际操作及调试
3.1 使用finalshell连接上nanopi,新建文件夹mkdir fdsst
3.2 将程序放入fdsst文件夹,输入cd进入fdsst文件夹
3.3makefile编写时出现的问题
①头文件应为为#include<opencv2/core/core.hpp>
注意为‘/’不是’\’,否则会报以下错误。
② 报错“sse.hpp:8:64: fatal error: emmintrin.h: No such file or directory”
#include <emmintrin.h> 此头文件为windows下的指令集优化,在arm中无法使用,将指令集更换为
arm下的指令集优化(#include<sse2neon.h>)即可。
③ 报错sse2neon缺少函数
github上下载了新的sse2neon.h头文件,替换后头文件改为小写sse2neon.h即可
3.4 可执行文件make生成
输入make对工程进行编译,生成Demo可执行文件。
3.5 可执行文件运行
由于需要有图像显示,所以在finalshell中使用远程桌面,cd进入文件夹,输入./Demo运行
可执行文件。至此,跟踪算法移植成功,但是速度较慢,耗时为70ms左右,后期将针对速度对跟踪算法
进行优化,使其能在嵌入式平台中实时运行。