Dlib:如何初始化 mmod_rect 并将其忽略标志设置为 1?
Dlib: How to initialize an mmod_rect with its ignore flag set to 1?
对那些不喜欢回答基本问题的人的公平警告:我已经很长时间没有看过 C++ 代码了。我要问的一些是基本语法的东西,我只是对语言了解不够,无法提出问题。我不知道要做什么 google。希望你们中的一些人可以帮助我将我的问题编辑成有凝聚力的东西。
所以问题是这样的。我目前正在从事一个涉及 dlib 的项目。在 dlib 中,有一个名为 mmod_rect 的结构定义为 here.
struct mmod_rect
{
mmod_rect() = default;
mmod_rect(const rectangle& r) : rect(r) {}
mmod_rect(const rectangle& r, double score) : rect(r),detection_confidence(score) {}
mmod_rect(const rectangle& r, double score, const std::string& label) : rect(r),detection_confidence(score), label(label) {}
rectangle rect;
double detection_confidence = 0;
bool ignore = false;
std::string label;
operator rectangle() const { return rect; }
bool operator == (const mmod_rect& rhs) const
{
return rect == rhs.rect
&& detection_confidence == rhs.detection_confidence
&& ignore == rhs.ignore
&& label == rhs.label;
}
};
inline mmod_rect ignored_mmod_rect(const rectangle& r)
{
mmod_rect temp(r);
temp.ignore = true;
return temp;
}
如果相关,可以找到矩形的文档 here。基本上,矩形是一个 class,通过传入左、上、右和下整数来初始化。
我得到的工作代码首先定义了一个 mmod_rects 的向量,如下所示:
std::vector<mmod_rect> rects;
然后它推送到包含以下行的向量:
rects.push_back(rectangle(left, top, right, bottom));
我对上面的行感到困惑。由于 rects 是 mmod_rects 的向量而不是 rects 的向量,代码如何通过调用 rect 的构造函数并将其推到向量上而逃脱。为什么这不会引发编译器错误?我认为它与 mmod_rect 的结构定义中的行有关,它说:
mmod_rect(const rectangle& r) : rect(r) {}
我的理解是,这意味着您可以通过传入对矩形的引用来构造一个 mmod_rect。我只是对使用冒号
的语法感到困惑
: rect(r) {}
如果有人能解释一下这个语法到底是做什么的,以及这里的 push_back 操作是如何工作的,那就太好了。
现在进入我想问的主要问题。我的目标是使用忽略标志设置为 1 的 mmod_rects 填充矢量矩形。我将如何着手执行此操作?以下代码能否实现目标?
mmod_rect r(rectangle(left, top, right, bottom));
r.ignore = 1;
rects.push_back(r);
有没有更好的方法使用 ignored_mmod_rect 来做到这一点?我不完全理解代码的作用。
构造函数中冒号后面的东西是"member initializer list"。请参阅:http://en.cppreference.com/w/cpp/language/initializer_list 或在此处搜索 "c++ member initializer list."
事实上,将 rectangle
推到 mmod_rect
的 std::vector
上的原因是因为 mmod_rect
可以从 rectangle
构造。 C++ 允许使用一级隐式构造函数。构造函数可以标记为 explicit
以防止在这种情况下自动使用它。
实际上 rectangle
和 mmod_rect
是 "value" 类型。这意味着您可以像对待他们一样对待他们。数字。 (通常必须将更复杂的类型视为共享子结构或无法轻易复制等) ignored_mmod_rect
函数只是将一个值转换为另一个值。你可以这样写:
rects.push_back(ignored_mmod_rect(rectangle(left, top, right, bottom));
在当今一流的 API 设计中,这可能是通过 mmod_rect
上的方法完成的,并且 rectangle
会有一个基于初始化列表的构造函数,所以可以只写 {left, top, right, bottom}
而不是 rectangle(left, top, right, bottom)
.
对那些不喜欢回答基本问题的人的公平警告:我已经很长时间没有看过 C++ 代码了。我要问的一些是基本语法的东西,我只是对语言了解不够,无法提出问题。我不知道要做什么 google。希望你们中的一些人可以帮助我将我的问题编辑成有凝聚力的东西。
所以问题是这样的。我目前正在从事一个涉及 dlib 的项目。在 dlib 中,有一个名为 mmod_rect 的结构定义为 here.
struct mmod_rect
{
mmod_rect() = default;
mmod_rect(const rectangle& r) : rect(r) {}
mmod_rect(const rectangle& r, double score) : rect(r),detection_confidence(score) {}
mmod_rect(const rectangle& r, double score, const std::string& label) : rect(r),detection_confidence(score), label(label) {}
rectangle rect;
double detection_confidence = 0;
bool ignore = false;
std::string label;
operator rectangle() const { return rect; }
bool operator == (const mmod_rect& rhs) const
{
return rect == rhs.rect
&& detection_confidence == rhs.detection_confidence
&& ignore == rhs.ignore
&& label == rhs.label;
}
};
inline mmod_rect ignored_mmod_rect(const rectangle& r)
{
mmod_rect temp(r);
temp.ignore = true;
return temp;
}
如果相关,可以找到矩形的文档 here。基本上,矩形是一个 class,通过传入左、上、右和下整数来初始化。
我得到的工作代码首先定义了一个 mmod_rects 的向量,如下所示:
std::vector<mmod_rect> rects;
然后它推送到包含以下行的向量:
rects.push_back(rectangle(left, top, right, bottom));
我对上面的行感到困惑。由于 rects 是 mmod_rects 的向量而不是 rects 的向量,代码如何通过调用 rect 的构造函数并将其推到向量上而逃脱。为什么这不会引发编译器错误?我认为它与 mmod_rect 的结构定义中的行有关,它说:
mmod_rect(const rectangle& r) : rect(r) {}
我的理解是,这意味着您可以通过传入对矩形的引用来构造一个 mmod_rect。我只是对使用冒号
的语法感到困惑 : rect(r) {}
如果有人能解释一下这个语法到底是做什么的,以及这里的 push_back 操作是如何工作的,那就太好了。
现在进入我想问的主要问题。我的目标是使用忽略标志设置为 1 的 mmod_rects 填充矢量矩形。我将如何着手执行此操作?以下代码能否实现目标?
mmod_rect r(rectangle(left, top, right, bottom));
r.ignore = 1;
rects.push_back(r);
有没有更好的方法使用 ignored_mmod_rect 来做到这一点?我不完全理解代码的作用。
构造函数中冒号后面的东西是"member initializer list"。请参阅:http://en.cppreference.com/w/cpp/language/initializer_list 或在此处搜索 "c++ member initializer list."
事实上,将 rectangle
推到 mmod_rect
的 std::vector
上的原因是因为 mmod_rect
可以从 rectangle
构造。 C++ 允许使用一级隐式构造函数。构造函数可以标记为 explicit
以防止在这种情况下自动使用它。
实际上 rectangle
和 mmod_rect
是 "value" 类型。这意味着您可以像对待他们一样对待他们。数字。 (通常必须将更复杂的类型视为共享子结构或无法轻易复制等) ignored_mmod_rect
函数只是将一个值转换为另一个值。你可以这样写:
rects.push_back(ignored_mmod_rect(rectangle(left, top, right, bottom));
在当今一流的 API 设计中,这可能是通过 mmod_rect
上的方法完成的,并且 rectangle
会有一个基于初始化列表的构造函数,所以可以只写 {left, top, right, bottom}
而不是 rectangle(left, top, right, bottom)
.