我先散乱进行记录,等后续我再整理
(1)关于object_detector.hpp
#ifndef OBJECT_DETECTOR_HPP #define OBJECT_DETECTOR_HPP #includenamespace ObjectDetector{ struct Box{ float left, top, right, bottom, confidence; int class_label; Box() = default; Box(float left, float top, float right, float bottom, float confidence, int class_label) :left(left), top(top), right(right), bottom(bottom), confidence(confidence), class_label(class_label){} }; typedef std::vector BoxArray; }; #endif // OBJECT_DETECTOR_HPP
代码解析:
typedef std::vectorBoxArray;
这里typedef将std::vector
认为是实例化了一个Box类型的vector对象(这个容器的每个元素成员都是一个Box结构体类型的对象)
但是看了前面居然有typedef,那就表明这里不是实例化一个vector对象了(这个对象的类型是Box类型)。
(2)关于yolo代码中一直存在的Yolo::BoxArray
这个我一直很疑惑Yolo名字空间里面根本就没有BoxArray成员啊:
最后才发现,在名字空间namespace Yolo中 使用了
using namespace ObjectDetector;
这个作用就是表示:将名称空间ObjectDetector中的所有成员引入到当前作用域中(当前作用域是namespace Yolo,即Yolo)。这样就相当于ObjectDetector中的所有成员就是名字空间Yolo中的成员。所以Yolo::BoxArray就自然合理了。
(2)接下来我们跟随app_yolo.cpp文件探究过程
1)进入Yolo::create_infer
然后进入yolo.cpp
那么我们分析解读一下create_infer函数:
shared_ptrcreate_infer(const string& engine_file, Type type, int gpuid, float confidence_threshold, float nms_threshold) { shared_ptr instance(new InferImpl()); if(!instance->startup(engine_file, type, gpuid, confidence_threshold, nms_threshold)) { instance.reset(); } return instance; }
首先是:
shared_ptr
定义了一个智能指针对象instance, 且instance类型为InferImpl。
并且使用了new InferImpl()的返回结果对该对象instance进行了初始化。
注意:new InferImpl()可以简单认为返回结果是一个地址(或者说是一个指针,注意哦指针是地址,指针变量不是指针,准确地说指针变量存储着指针(或叫地址))。
那么我们就去看下InferImpl类:
我们可以看到 InferImpl类的定义也是在yolo.cpp文件里面。



