我最近一直在使用针对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()
代码,因此我不确定如何解决此问题。
答案 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);
}
请注意,尽管这确实解决了我的问题,但确实发现了与我的实现相关的其他不相关的问题(最值得注意的是缺少内存释放和不兼容的图像格式),这些问题我分别解决了。我决定不将这些更改包含在我的解决方案代码中,因为它们不会影响所讨论的问题。