inyolo视频检测过程中,由于命令行参数不同,程序进入函数不同,这里只需要 这一句 命令下走的函数部分
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>
因此将这里用到的run detector函数部分打包成一个simplebox函数。
这里要解决的问题在于yolo内部函数之间的互相依赖关系。
之前想将这个函数做成类,但是yolo作者是纯c写的代码,类是c++才有的概念,这就涉及到c ,c++混合编程的问题,中间学到了不少相关的基础知识。比如在c++文件里调用 c的头文件要用extern C声明等。
在用gcc编译工程后,程序只用了cpu,解决未果,后来索性抛弃这个思路,按照yolo源码解析(1):代码逻辑 - 优快云博客 这位作者的添加头文件和c文件思路,将打包好的simplebox函数放在src目录下,在makefile文件中,OBJ = 后面添加 symplebox.o,并将这个函数放入darknet.h声明中。
主函数内部只需这一句: simplebox(argc,argv); 即可实现函数封装(我自己认为的封装)。
还需注意的是,在视频流检测时,复制摄像机镜头地址后,需要加双引号在放入mi,即命令行中,“视频流地址”,不然视频流中的特殊字符会影响文件名读取。
附上代码:
主要思想是:
将examples下面darknet.c内的主函数名 int main 改为 void simplebox,其他函数不变,并将darkent.c 重命名为 symplebox.c,移出example文件夹,放入src文件夹,并写一个symplebox.h声明sympleb