这个问题有些含糊不清。这里和opencv的网站上的一些答案说mat对象有一些线程安全性,而另一些人说它不是线程安全的。关于线程的大多数问题都在写入上下文中。在同时修改mat对象时。我有兴趣从不同的线程中读取不同的mat对象。我的代码太复杂了,无法在此发布,所以我会做一些概述。
Mat对象(基本上是图像)存储在Vector中。当向量的大小达到预定义的数量时,我停止向向量添加并开始处理不同线程中的向量。因此,向量中的第一个mat对象被分配给线程0(线程用c ++ 11线程创建),第二个用于线程1,依此类推。不会对矢量进行修改。这只是阅读。
垫子处理功能非常简单,只是:
Mat& I = image; //image comes from vector
for (int i = 0; i < I.rows; i++){
for (int t = 0; t < I.cols; t++){
ColorValue = GetColorVal(I.at<Vec3b>(i, t)[0], I.at<Vec3b>(i, t)[1], I.at<Vec3b>(i, t)[2]);
//do some other stuff here
问题是GetColorVal函数的结果不完整。如果我使用mutex.locks或将线程数限制为1并不重要,它总是不完整的。我根本没有修改任何东西,只是阅读。据我所知,它并没有处理整个图像。如果我禁用线程,相同的代码会给出正确的结果。
我的计划是在这一点上,将图像处理代码分离到较小的应用程序,并使用tcp或其他一些进程通信库(如nanomsg)来移动和处理图像。我计划运行这些较小的应用程序中的7-8个。
但在我完成所有工作之前,我想确保即使在读取环境中,opencv mat也不是线程安全的。