Отслеживание OpenCV / SURF для iPhone: неверные значения при создании структуры - PullRequest
1 голос
/ 11 июля 2011

Я использую библиотеку OpenCV в Objective-C (кросс-компилируется), которая в принципе работает нормально.

К сожалению, при использовании примера, который можно найти в 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);

После вызова функции cvSURFParams в ViewController.mm значения параметров:

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

Исправление значений для hessianThreshold , nOctaves , .. in ViewController.mm не помогает, как только я передаю params моей функции cvExtractSURF , при отладке этой функции в surf.cpp :

появляются неправильные значения
extended         = (int)    1
upright          = (int)    0
hessianThreshold = (double) 500
nOctaves         = (int)    4
nOctaveLayers    = (int)    0

Может кто-нибудь помочь, пожалуйста?

Заранее спасибо,

- Стефан

1 Ответ

0 голосов
/ 11 июля 2011

Похоже, что представление структуры в OpenCV отличается от того, как ее представляет ваш ViewController.mm.Либо hessianThreshold имеет другой размер, либо существует проблема с выравниванием.Некоторые вещи для проверки:

  1. Выведите sizeof (CvSURFParams) в вашем ViewController.mm в виде некоторого кода отладки.Также сделайте это из библиотеки OpenCV.Скорее всего, они не одинаковы.
  2. Вы также можете вывести sizeof (double) в обоих проектах.Они должны быть одинаковыми, если нет, то вы обнаружили проблему, и вам нужно будет указать компилятору использовать одинаковый размер (double) в обоих проектах.
  3. Если sizeof (double) одинаков в обоихпроекты, то проблема заключается в том, что компилятор выравнивает структуры по-разному в каждом проекте.Опять же, это, скорее всего, настройки компилятора, хотя обычно есть инструкции #pragma, которые можно использовать для указания конкретной схемы выравнивания, если вы не хотите использовать значение по умолчанию.
...