Visual C++ Mat 图像元素队列:如何?

Posted

技术标签:

【中文标题】Visual C++ Mat 图像元素队列:如何?【英文标题】:Visual C++ A queue of Mat images elements: how? 【发布时间】:2013-06-05 10:12:09 【问题描述】:

我尝试做一个 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

【问题讨论】:

你能发布你得到的实际错误吗? 错误 C2061: errore di sintassi: identificatore 'data' 'coda_concorr': elenco dei parametri di modello mancante o non valido 【参考方案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)  .... 
;

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

coda_concorr<cv::Mat> matQueue;

或不同的类型,这是首先将类设为模板的目的:

coda_concorr<int> intQueue;
coda_concorr<std::string> stringQueue;

【讨论】:

我在哪里声明这是一个“垫子”队列? @Domenico 当您实例化 coda_concorr 时。阅读模板。 我按照您的指示实例化队列。当我尝试向其推送一个 Mat 变量时,给出错误 C2676。为什么? 我不能在这个队列的两个线程之间进行竞争。如果只使用一个线程的队列,则可以。如果我使用两个线程,那么推入队列的问题就是我得到的。【参考方案2】:

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

【讨论】:

以上是关于Visual C++ Mat 图像元素队列:如何?的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 如何使用线程启动非 void 函数

如何使用 C++ Mat Class ptr 对象的基本 C 包装器打印 Mat 元素

如何在 Visual Studio 2010 中实现 Tesseract 以与项目一起运行

如何在配置了 ITK 的 Visual Studio 中使用 C++ 读取和写入图像

如何访问二进制 Mat 图像中的像素值?

无法同时显示五个 Mat 图像(C++、OpenCV)