在创建垫之后,从字节向量在垫子上加载图像

时间:2013-08-04 16:03:25

标签: c++ multithreading image opencv data-structures

我的情况是下一个:我正在开发一个多线程应用程序,其中不同线程以套接字形式接收图像,将它们存储在vector<char>和应该使用它生成cv::Mat,以便能够使用 OpenCV 进行处理。好吧,并发症主要是因为为了将每个线程的私人数据与其他线程分开,我使用了结构数组,我用所有的声明了每个线程可能需要的数据结构。因此,我还必须在其中声明vector<char>cv::Mat,并且一旦向量已经接收到所有图像字节,我必须找到一种方法在{{1}内适当地“加载它们” 没有创建任何额外的,因为为每个线程保留的内存空间是固定的。


到目前为止我尝试过:

cv::Mat

收到一张图片后的结果:

struct thread_data {                   //private data for threads
     std::vector<char> buf_img;
     Mat img_scene;
     Mat img_temp;
     //...

     thread_data() { 
          buf_img.reserve(65000),      // initialization with enough space
      img_scene.create(700,500, CV_8U),
      img_temp.create(700,500, CV_8U);
          }
    };


thread_data *tdata;
// declare array of structs
tdata = (thread_data * ) calloc(nthreads, sizeof(thread_data));

//...

// And the thread function, once received the image:

private_tm->img_temp = cv::Mat(private_tm->buf_img,true).clone(); //from vector to Mat

if( !private_tm->img_temp.data ) { 
      std::cout<< " --(!) Image could not be read " << std::endl; 
      private_tm->answer = "error";
}
else {
    // decode image and call the function passing the pointer to the struct:
    private_tm->img_scene = cv::Mat(cv::imdecode(private_tm->temp,1)).clone();
private_tm->answer = OCV_func((void*)private_tm); 
 }

我真的需要帮助,因为我觉得这可能是一个我无法看到的简单解决方案。


一些研究:

-I搜索直到在OpenCV文档中的cv :: Mat声明中用尽一个可以做到这一点的功能,但我没有运气。我找不到一个功能,没有创建新的Mat 可能会获得图像(来自矢量,char *或文件)。 mat documentation

- 这是一个与我需要的问题相似的问题(答案非常令人不满):link

提前致谢。

1 个答案:

答案 0 :(得分:0)

您不能以您的方式使用calloc。它只会为thread_data对象分配内存,但会调用其构造函数或其子对象的构造函数。

更改以下内容......

thread_data *tdata;
// declare array of structs
tdata = (thread_data * ) calloc(nthreads, sizeof(thread_data));

为...

thread_data *tdata = new thread_data();

我强烈建议您使用std::unique_ptr等智能指针,这样您就不必担心调用delete

std::unique_ptr<thread_data> tdata(new thread_data());