OpenCV函数上的std :: thread生成错误"尝试使用已删除的函数"

时间:2017-02-07 14:51:28

标签: c++ opencv stdthread

这是我使用的代码:

cv::Mat mask, foreground;
std::thread t(cv::threshold, mask, foreground, 254, 255, cv::THRESH_BINARY);
t.join();

使用支持C ++ 11的Xcode 8进行编译。有什么想法吗?

以下是完整的错误消息:

在/Users/mlitvin/xcode/Create/ImageProcUtils.cpp:13中包含的文件中: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:347:5:错误:尝试使用已删除的功能     __invoke(_VSTD :: move(_VSTD :: get(__ t)),_ VSTD :: move(_VSTD :: get(__ t))...);     ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:357:5:注意:在实例化函数模板特化' std: :__ 1 :: __ thread_execute'这里要求     __thread_execute(* __ p,_Index());     ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:369:42:注意:在实例化函数模板特化' std: :__ 1 :: __ thread_proxy>'这里要求     int __ec = pthread_create(& __ t_,0,& __ thread_proxy,__ p.get());                                          ^ /Users/mlitvin/xcode/Create/ImageProcUtils.cpp:71:21:注意:在实例化函数模板特化' std :: __ 1 :: thread :: thread'这里要求         std :: thread t(cv :: threshold,mask,foreground,254,255,cv :: THRESH_BINARY);                     ^ 文件包括:368: 文件包括:3: 在/Users/mlitvin/xcode/Create/Create/Create_Prefix.h:25中包含的文件中: 在/Users/mlitvin/xcode/Create/3rdParty/OpenCV-2.3.1/modules/imgproc/include/opencv2/imgproc/imgproc.hpp:50中包含的文件中: 在/Users/mlitvin/xcode/Create/3rdParty/OpenCV-2.3.1/modules/core/include/opencv2/core/core.hpp:56中包含的文件中: 在/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:625中包含的文件中: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits:1087:5:注意:' ~__nat'已在此明确标记删除     ~__nat()=删除;     ^ 生成1个错误。

修改1:

看起来问题在于将cv::OutputArray类型的对象作为参数传递。

1 个答案:

答案 0 :(得分:0)

我设法通过添加一个代理函数来解决这个问题,其中只有输出通过引用传递:

void cv_threshold(cv::Mat _src, cv::Mat& _dst, double thresh, double maxval, int type) {
    cv::threshold(_src, _dst, thresh, maxval, type);
}
...
cv::Mat mask, foreground;
std::thread t(cv_threshold, mask, std::ref(foreground), 254, 255, cv::THRESH_BINARY);
t.join();

我很高兴知道为什么原始方法不起作用 - 会接受解释这个问题的答案。