【1】SIFT特征没有自己编写,使用了opencv的SIFT特征提取、匹配函数。
【2】centos6.8装opencv3.0有问题,系统更换成了ubuntu14.04.4。opencv3已将sift库去掉,需要自己在git上下载编译,但是编译出来错误很多,诸多不顺,最终换成了老版本。opencv2.4.9,系统ubuntu14.04.4,很顺利。
【3】opencv特征库的描述子提取出来是cv::Mat类型,对数据库完全不懂如何存储自定义类型,所以使用opencv自带的文件类将Mat写入XML中了。好在整个服务运行的过程中,只是对特征库中的数据进行逐个比对,所以将特征存储在数据库,XML的区别也只是一开始服务器开启时载入数据的速度快慢,并不影响数据查询速度。
【4】所有同类型工作线程都是提取待检测图片的特征描述子,并将该描述子与特征库中所有的描述子逐个比较。所以我把xml中的特征,在服务开启时,就全部载入进来了。做成了全局。
【5】特征库描述子们做成全局,该怎么弄?既不能在函数栈中分配(随着特征库的增加会不会爆栈?)也不想做成全局变量(全局静态区放这么大的数据量好吗?)。最后是使用全局的*const ptr=new FEA()。
const指针,这样指针指向不会发生改变了,可以放心的定义成全局了(大家都看的到,大家都改不了);
FEA(),只提供对特征描述子的值副本,这样特征库描述子大家都看的到,大家都改不了。
new,在堆中分配内存,不会爆栈,不用担心全局静态区放太多的东西。