0

我尝试做一个 Mat 图像元素队列,但 Visual C++ 给我一个关于队列“tipe”的错误。

我想要一个 OpenCV Mat 图像的并发队列,以便与多个线程一起使用。

我怎样才能做到这一点?

这是队列的代码给我错误(创建关于一个例子见这个论坛):

template<data Mat>
 class coda_concorr
  {
  private:
std::queue<Mat> la_coda;
HANDLE mutex;
public:
void push(Mat const& data)
{
    WaitForSingleObject(mutex,INFINITE):
    la_coda.push(data);
    RelaseMutex(mutex);
}
bool vuota() const
{
    WaitForSingleObject(mutex,INFINITE);
    return la_coda.empty();
    ReleaseMutex(mutex);
}

bool try_pop(Mat& popped)
{
    WaitForSingleObject(mutex,INFINITE);
    if (la_coda.empty())
    {
        return false;
    }
    popped = la_coda.front();
    la_coda.pop();
    return true;
}

void aspetta_per_pop(Mat& popped)
{
    WaitForSingleObject(mutex,INFINITE);
    while (la_coda.empty())
    {
        WaitForSingleObject(mutex,INFINITE);
    }
    popped=la_coda.front();
    la_coda.pop();
}
};

我使用 Visual Studio 2010 和 OpenCV 2.4.4

4

2 回答 2

1

如果我是你,我会为并发队列使用第三方库,因为编写高效的线程安全代码被认为很难。我可以推荐Microsoft 的 PPL 库Intel 的 TBB 库

于 2013-06-05T10:45:00.807 回答
1

这是无效的模板语法:

template<data Mat>
class coda_concorr { .... };

您没有在类中使用任何模板参数,因此您可以将其设为非模板。Mat但是将其设为模板并替换为模板参数会更有意义。

template<typename T>
class coda_concorr
{
 private:
  std::queue<T> la_coda;
  ....
 public:
  void push(T const& data) { .... }
};

然后,您可以为 a 实例化模板cv::Mat

coda_concorr<cv::Mat> matQueue;

或其他类型,这是首先使类成为模板的重点:

coda_concorr<int> intQueue;
coda_concorr<std::string> stringQueue;
于 2013-06-05T10:45:32.573 回答