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