opencv cv :: Mat的循环缓冲区

时间:2018-03-14 21:48:04

标签: multithreading opencv boost circular-buffer

我使用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();
}

然后在main函数中运行它:

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

它来自模板实现还是来自函数实现? 谷歌要解决什么?

1 个答案:

答案 0 :(得分:0)

所有函数都通过引用获取参数,您需要使用std::ref包装类将它们传递给线程构造函数:

  

通过值移动或复制线程函数的参数。如果需要将引用参数传递给线程函数,则必须将其包装(例如,使用std :: ref或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) );