0
votes

This is the code I'm using:

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

Compiling with Xcode 8 with support for C++11. Any ideas?

Here is the full error message:

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.

Edit 1:

Looks like the problem is with passing an object of type cv::OutputArray as argument.

1
What is the full error message? It should tell you what function is deleted. - NathanOliver
I notice you don't pass the address-of the member function into the thread ctor. I'd expect to see &cv::threshold. Perhaps it could be that the deleted function error message is a red herring and you just have a syntax error. - acraig5075
threshold() isn't a member function, it's not inside a class (cv is opencv namespace). I tried to add & before cv::threshold but the same error remains. - Michael Litvin
Looks like the problem is with passing an object of type cv::OutputArray as argument. - Michael Litvin

1 Answers

0
votes

I managed to solve this problem by adding a proxy function in which only the output is passed by reference:

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

I'll be happy to know why the original method didn't work though - will accept an answer that explains that.