架构 arm64 的未定义符号:cv::StereoMatcher::compute

Undefined symbols for architecture arm64: cv::StereoMatcher::compute

我最近一直在为 Xcode(版本 10.0)使用 OpenCV 框架(版本 3.4.3),我试图用它从立体图像(基于this tutorial 中列出的步骤;尽管 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 设置的一部分(基于 this article)。

然而,当我尝试构建解决方案时,我遇到了这个错误:

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)

查找错误标题,我发现了 this Whosebug question 并浏览了一些回复。尽管有些解决方案有些过时,但我验证了 Other Linker Flags 属性包含 $(inherited) 参数,并且启用了上述文件的目标成员资格。我还尝试更改 C++ Standard Library 属性,但没有效果。

由于 StereoBM::create() 代码不会导致任何问题,并且语法高亮显示和代码 auto-completer 都按预期响应 StereoBM::compute() 代码,我不确定如何解决这个问题问题。

经过一些额外的搜索,我已经能够解决这个问题。因为我使用的是原始指针,而不是 cv::Ptr<T> (outlined here),所以我没有正确创建抽象的有效实例 class.

我将我的代码修改为以下内容:

+ (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);
}

请注意,虽然这确实解决了我的问题,但我确实发现了其他与我的实现无关的问题(最明显的是缺少内存释放和不兼容的图像格式),我单独解决了这些问题。我决定不在我的解决方案代码中包含这些更改,因为它们不会影响相关问题。