我试图理解基于Ballard 1981的广义霍夫变换的OpenCV实现。我正在阅读generalized_hough.cpp。在这一行是混乱开始的地方:
namespace
{
class GeneralizedHoughBallardImpl : public GeneralizedHoughBallard, private GeneralizedHoughBase
{
显然这是定义一个命名空间,然后是一个名为GeneralizedHoughBallardImpl的类,我收集它是Generalized Hough Ballard Implementation的缩写。 ":"字符清楚地表示"继承自"像往常一样,"私有的GeneralizedHoughBase"很明显,因为声明了该类,并且它的函数在之前的同一文件中定义:
class GeneralizedHoughBase
{
protected:
GeneralizedHoughBase();
virtual ~GeneralizedHoughBase() {}
void setTemplateImpl(InputArray templ, Point templCenter);
void setTemplateImpl(InputArray edges, InputArray dx, InputArray dy, Point templCenter);
(much more code for this class omitted) . . .
现在我失去了,我可以找到" GeneralizedHoughBallard"声明或定义。在同一个文件(generalized_hough.cpp)中有以下代码:
Ptr<GeneralizedHoughBallard> cv::createGeneralizedHoughBallard()
{
return makePtr<GeneralizedHoughBallardImpl>();
}
如果我正确理解这一点,那就是指定&#34; Ptr GeneralizedHoughBallard&#34;是函数createGeneralizedHoughBallard()的返回类型,但不以任何方式定义类GeneralizedHoughBallard。此外,如果我search the entire OpenCV repo for "GeneralizedHoughBallard",我在7个不同的文件中找到了11个文本GeneralizedHoughBallard的实例,但它们似乎都是类似于上面的用法,而不是声明或定义。
我在这里缺少什么? OpenCV中的Ptr语法是否有特殊之处,不必定义/声明类? GeneralizedHoughBallard是在某个地方定义/声明的,我没有发现或没有注意到?如果有人能提供一些澄清,我们将不胜感激。
答案 0 :(得分:2)
因此,要查看上面列出的内容,可以使用GeneralizedHoughBallardImpl类,该类在匿名类*中定义。
然后,在同一个文件中,有一个在cv命名空间中定义的createGeneralizedHoughBallard函数。此函数使用模板化的makePtr函数创建GeneralizedHoughBallardImpl的实例,然后C ++将指针实例类型转换为GeneralizedHoughBallard,因为GeneralizedHoughBallardImpl派生自GeneralizedHoughBallard。
createGeneralizedHoughBallard函数在2个不同的头文件中声明为CV_EXPORTS Ptr createGeneralizedHoughBallard()(目前)。因此,由于createGeneralizedHoughBallard是在定义GeneralizedHoughBallard类的头文件中声明的,因此该函数将编译而不会出现问题。
注意,GeneralizedHoughBallard类在https://github.com/opencv/opencv/blob/e93aa158cf39b88836797a6e74b06c7dbe8199b7/modules/imgproc/include/opencv2/imgproc.hpp
中定义*指定匿名类中的项目是确保文件中声明的项目不与其他文件中可能相同的命名项目冲突的好方法。