2017-02-07 32 views
-1

这是我正在使用的代码:的std ::上OpenCV的功能线程生成错误“试图使用已删除的功能”

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

在Xcode 8编译与支持C++ 11。有任何想法吗?

以下是完整的错误消息:

In file included from /Users/mlitvin/xcode/Create/ImageProcUtils.cpp:13: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:347:5: error: attempt to use a deleted function __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: note: in instantiation of function template specialization 'std::__1::__thread_execute' requested here __thread_execute(*__p, _Index()); ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:369:42: note: in instantiation of function template specialization 'std::__1::__thread_proxy >' requested here int __ec = pthread_create(&__t_, 0, &__thread_proxy, __p.get()); ^ /Users/mlitvin/xcode/Create/ImageProcUtils.cpp:71:21: note: in instantiation of function template specialization 'std::__1::thread::thread' requested here std::thread t(cv::threshold, mask, foreground, 254, 255, cv::THRESH_BINARY); ^ In file included from :368: In file included from :3: In file included from /Users/mlitvin/xcode/Create/Create/Create_Prefix.h:25: In file included from /Users/mlitvin/xcode/Create/3rdParty/OpenCV-2.3.1/modules/imgproc/include/opencv2/imgproc/imgproc.hpp:50: In file included from /Users/mlitvin/xcode/Create/3rdParty/OpenCV-2.3.1/modules/core/include/opencv2/core/core.hpp:56: In file included from /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: note: '~__nat' has been explicitly marked deleted here ~__nat() = delete; ^ 1 error generated.

编辑1:

貌似问题是与通过cv::OutputArray类型的对象作为参数。

+2

什么是完整的错误信息?它应该告诉你什么功能被删除。 – NathanOliver

+0

我注意到你不会将成员函数的地址传递给线程ctor。我期望看到'&cv :: threshold'。也许可能是因为删除的函数错误信息是一个红色的鲱鱼,你只是有一个语法错误。 – acraig5075

+0

'threshold()'不是一个成员函数,它不在类内('cv'是opencv命名空间)。我试图在'cv :: threshold'之前添加'&',但仍然存在相同的错误。 –

回答

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

我会很高兴地知道为什么原来的方法也没有工作,虽然 - 会接受解释这个问题的答案。