1

我在 Objective-C 中使用 OpenCV 库(交叉编译),它基本上可以正常工作。

不幸的是,当使用可以在find_obj.cpp中找到的示例时,我得到 CvSURFParams 的奇怪值,这些值必须作为参数传递给cvExtractSURF函数。

features2d.hpp(openCV的一部分):

typedef struct CvSURFParams
{
    int    extended;
    double hessianThreshold;

    int    nOctaves;
    int    nOctaveLayers;

} CvSURFParams;

surf.cpp(openCV 的一部分):

CvSURFParams cvSURFParams(double threshold, int extended)
{
    CvSURFParams params;
    params.hessianThreshold = threshold;
    params.extended = extended;
    params.upright = 0;
    params.nOctaves = 4;
    params.nOctaveLayers = 2;
    return params;
}

ViewController.mm(我的主视图控制器):

CvSURFParams params = cvSURFParams(500, 1);

调用ViewController.mm中的 cvSURFParams 函数后,params 的值为:

extended         = (int)    1
hessianThreshold = (double) 0
nOctaves         = (int)    1082081280
nOctaveLayers    = (int)    4

在ViewController.mm中更正hessianThresholdnOctaves、 ..的值并没有帮助,只要我将参数传递给我的cvExtractSURF函数,在surf.cpp中调试此函数时就会出现错误的值:

extended         = (int)    1
upright          = (int)    0
hessianThreshold = (double) 500
nOctaves         = (int)    4
nOctaveLayers    = (int)    0

有人可以帮忙吗?

提前致谢,

——斯蒂芬

4

1 回答 1

0

听起来 OpenCV 中结构的表示与您的 ViewController.mm 表示它的方式不同。hessianThreshold 的大小不同,否则存在对齐问题。需要检查的一些事项:

  1. 在 ViewController.mm 中输出 sizeof(CvSURFParams) 作为一些调试代码。也可以从 OpenCV 库中执行此操作。很可能它们不一样。
  2. 您还可以在两个项目中输出 sizeof(double) 。它们应该是相同的,如果不是,那么您发现了问题,您需要指示编译器在两个项目中使用相同的 sizeof(double)。
  3. 如果两个项目中的 sizeof(double) 相同,则问题似乎是编译器在每个项目中对结构的对齐方式不同。同样,这很可能是编译器设置,尽管如果您不想要默认值,通常可以使用 #pragma 指令来指定特定的对齐方案。
于 2011-07-11T17:11:54.400 回答