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 图像元素队列:如何?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C++ Mat Class ptr 对象的基本 C 包装器打印 Mat 元素
如何在 Visual Studio 2010 中实现 Tesseract 以与项目一起运行