体系结构arm64的未定义符号:cv :: StereoMatcher :: compute

时间:2018-09-21 13:03:57

标签: opencv cocoa objective-c++

我最近一直在使用针对Xcode(版本10.0)的OpenCV框架(版本3.4.3),我正尝试使用该框架从立体图像创建深度图(基于{{3中概述的步骤}};尽管不是在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 tutorial)。

但是,当我尝试构建解决方案时,遇到此错误:

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 article并经历了一些响应。尽管某些解决方案有些过时,但我验证了Other Linker Flags属性包含$(inherited)参数,并且已启用上述文件的目标成员身份。我还尝试过将C++ Standard Library属性更改为无效。

由于StereoBM::create()代码不会引起任何问题,并且语法突出显示和代码自动完成程序都可以按预期响应StereoBM::compute()代码,因此我不确定如何解决此问题。

1 个答案:

答案 0 :(得分:0)

经过一些额外的搜索,我已经能够解决此问题。由于我使用的是原始指针,因此没有正确地创建抽象类的有效实例,而不是cv::Ptr<T>(概述为here)。

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

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

请注意,尽管这确实解决了我的问题,但确实发现了与我的实现相关的其他不相关的问题(最值得注意的是缺少内存释放和不兼容的图像格式),这些问题我分别解决了。我决定不将这些更改包含在我的解决方案代码中,因为它们不会影响所讨论的问题。