Неопределенные символы для архитектуры arm64: cv :: StereoMatcher :: compute - PullRequest
0 голосов
/ 21 сентября 2018

Недавно я работал с платформой OpenCV (версия 3.4.3) для Xcode (версия 10.0), с которой я пытаюсь создать карту глубины из стереоизображений (на основе шагов, описанных в этот урок ; хотя и не на Python).В качестве попытки я создал следующую функцию:

+ (UIImage *)to3D:(UIImage *)ui1 :(UIImage *)ui2 {
  Mat cv1(ui1.size.width, ui1.size.height, CV_8UC4);
  Mat cv2(ui2.size.width, ui2.size.height, CV_8UC4);
  Mat dsp(ui2.size.width, ui2.size.height, CV_8UC4);

  UIImageToMat(ui1, cv1, true);
  UIImageToMat(ui2, cv2, true);

  StereoBM *stereo = StereoBM::create(16, 15);
  stereo -> StereoBM::compute(cv1, cv2, dsp);

  return MatToUIImage(dsp);
}

Я включил эту функцию как часть моей настройки OpenCV (на основе этой статьи ).

КогдаЯ пытаюсь построить решение, однако я столкнулся с этой ошибкой:

Undefined symbols for architecture arm64:
  "cv::StereoMatcher::compute(cv::_InputArray const&, cv::_InputArray const&, cv::_OutputArray const&)", referenced from:
      +[OpenCV to3D::] in OpenCV.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Просматривая заголовок ошибки, я обнаружил этот вопрос StackOverflow и просмотрел некоторые ответы.Хотя некоторые решения немного устарели, я убедился, что атрибут Other Linker Flags содержит аргумент $(inherited) и что целевое членство для вышеупомянутого файла было включено.Я также попытался изменить атрибут C++ Standard Library, но безрезультатно.

Поскольку код StereoBM::create() не вызывает никаких проблем, а подсветка синтаксиса и автозаполнение кода отвечают на код StereoBM::compute() какожидается, я не уверен, как решить эту проблему.

1 Ответ

0 голосов
/ 27 сентября 2018

После некоторых дополнительных поисков я смог решить проблему.Поскольку я использовал необработанный указатель, вместо cv::Ptr<T> (обведено здесь ) я неправильно создавал действительный экземпляр абстрактного класса.

Я адаптировалмой код для следующего:

+ (UIImage *)to3D:(UIImage *)ui1 :(UIImage *)ui2 {
  Mat cv1(ui1.size.width, ui1.size.height, CV_8UC4);
  Mat cv2(ui2.size.width, ui2.size.height, CV_8UC4);
  Mat dsp(ui2.size.width, ui2.size.height, CV_8UC4);

  UIImageToMat(ui1, cv1, true);
  UIImageToMat(ui2, cv2, true);

  Ptr<StereoBM> stereo = StereoBM::create(16, 15); // changed type to Ptr<StereoBM>
  stereo -> compute(cv1, cv2, dsp); // removed StereoBM:: namespace

  return MatToUIImage(dsp);
}

Обратите внимание, что, хотя это и помогло решить мою проблему, я обнаружил дополнительные несвязанные проблемы с моей реализацией (в частности, недостаток освобождения памяти и несовместимые форматы изображений), которые я решил отдельно,Я решил не включать эти изменения в код моего решения, поскольку они не влияют на вопрос.

...