opencv 的循环缓冲区 cv::Mat
circular buffer for opencv cv::Mat
我使用this example进行循环缓冲。
为了测试我创建了接下来的三个函数:
void cnt(ScreenStreamer &SS, cv::Mat & img)
{
CVUtils::Image m_img;
SS >> m_img;
img = m_img.matRef();
cv::imshow("",img);
cv::waitKey();
}
void snd1(circ_buffer<cv::Mat > & CM, cv::Mat & M)
{
CM.send(M);
}
void rcv1(circ_buffer<cv::Mat > & CV, cv::Mat & M)
{
M = CV.receive();
}
然后运行它在主函数中:
int main()
{
ScreenStreamer stream;
CVUtils::Image m_img;
cv::Mat bufImg;
cv::Mat inpImg;
int key = 0;
circ_buffer<cv::Mat > F1;
F1.set_capacity(50);
std::thread m1( snd1, F1, &inpImg );
std::thread m2( rcv1, F1, &bufImg );
std::thread m3( cnt, stream, &inpImg);
m1.join();
m2.join();
m3.join();
return 0;
}
不幸的是我得到了这个错误
Error C2664 'std::tuple<void (__cdecl *)(circ_buffer<cv::Mat> &,cv::Mat &),circ_buffer<cv::Mat>,cv::Mat *>::tuple(std::tuple<void (__cdecl *)(circ_buffer<cv::Mat> &,cv::Mat &),circ_buffer<cv::Mat>,cv::Mat *> &&)': cannot convert argument 1 from 'void (__cdecl &)(circ_buffer<cv::Mat> &,cv::Mat &)' to 'std::allocator_arg_t' CVUtilsExperimental C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\memory 1630
它是来自模板实现还是来自函数实现?
用什么google来解决呢?
你的所有函数都通过引用获取参数,你需要使用 std::ref
包装器 class 将它们传递给线程构造函数:
The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref). thread reference
所以重写如下
std::thread m1( snd1, ref(F1), ref(inpImg) );
std::thread m2( rcv1, ref(F1), ref(bufImg) );
std::thread m3( cnt, ref(stream), ref(inpImg) );
我使用this example进行循环缓冲。
为了测试我创建了接下来的三个函数:
void cnt(ScreenStreamer &SS, cv::Mat & img)
{
CVUtils::Image m_img;
SS >> m_img;
img = m_img.matRef();
cv::imshow("",img);
cv::waitKey();
}
void snd1(circ_buffer<cv::Mat > & CM, cv::Mat & M)
{
CM.send(M);
}
void rcv1(circ_buffer<cv::Mat > & CV, cv::Mat & M)
{
M = CV.receive();
}
然后运行它在主函数中:
int main()
{
ScreenStreamer stream;
CVUtils::Image m_img;
cv::Mat bufImg;
cv::Mat inpImg;
int key = 0;
circ_buffer<cv::Mat > F1;
F1.set_capacity(50);
std::thread m1( snd1, F1, &inpImg );
std::thread m2( rcv1, F1, &bufImg );
std::thread m3( cnt, stream, &inpImg);
m1.join();
m2.join();
m3.join();
return 0;
}
不幸的是我得到了这个错误
Error C2664 'std::tuple<void (__cdecl *)(circ_buffer<cv::Mat> &,cv::Mat &),circ_buffer<cv::Mat>,cv::Mat *>::tuple(std::tuple<void (__cdecl *)(circ_buffer<cv::Mat> &,cv::Mat &),circ_buffer<cv::Mat>,cv::Mat *> &&)': cannot convert argument 1 from 'void (__cdecl &)(circ_buffer<cv::Mat> &,cv::Mat &)' to 'std::allocator_arg_t' CVUtilsExperimental C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\memory 1630
它是来自模板实现还是来自函数实现? 用什么google来解决呢?
你的所有函数都通过引用获取参数,你需要使用 std::ref
包装器 class 将它们传递给线程构造函数:
The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref). thread reference
所以重写如下
std::thread m1( snd1, ref(F1), ref(inpImg) );
std::thread m2( rcv1, ref(F1), ref(bufImg) );
std::thread m3( cnt, ref(stream), ref(inpImg) );