首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同进程之间传输cv::Mat对象的最佳方式是什么?

问在不同进程之间传输cv::Mat对象的最佳方式是什么?
EN

Stack Overflow用户
提问于 2015-11-13 03:05:02
回答 2查看 1.6K关注 0票数 0

我试图将cv::Mat对象从一个程序传递到另一个程序,这两个程序都是用C++实现的,最好并行运行。cv::Mat中没有图像,所以imread和imwrite在这里没有用(我们不能用传统的图像压缩方法来压缩数据)。一种解决方案是将矩阵写入文件(例如CSV文件),但是由于程序处理的信息太多,磁盘将成为瓶颈,此外,我很快就会耗尽磁盘空间。

经过一番挖掘,我发现管道(名字或未命名)是一种有用的解决方案。我编写了两个试点程序: Producer.cpp:

代码语言:javascript
复制
int main(int argc, char* argv[])
{       
        Mat image;
        image = imread(argv[1]);
        cout << image;
        cout.flush();
        return 0;
}

Consumer.cpp:

代码语言:javascript
复制
int main(int argc, char* argv[])
{       
        Mat image;
        cin >> image;
        imshow("Image", image);
        waitKey();
        return 0;
}

令人惊讶的是,第二个程序不会编译。

错配类型‘_CharT2*’和‘cv::Mat’cin >>图像;

这意味着(我猜) ">>“运算符对cv::Mat没有重载。尽管我们可能能够覆盖>>操作符,因为矩阵很大,并且stdin和stdout是基于文本的,但它也不是最好的,也不是最简单的方法。

因此,回到主要问题:从一个程序到另一个程序传递cv::Mat对象(或任何其他二进制对象)的最佳方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-14 00:14:56

应该以某种方式序列化Mat (或任何其他对象)。在opencv中序列化的简单方法是使用FileStorage。以下是示例代码:

制片人:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    Mat image;
    image = imread(argv[1]);
    FileStorage fs("temp", FileStorage::WRITE);
    fs << "MyImage" << image;
    return 0;
}

消费者:

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    Mat image;
    FileStorage fs("temp", FileStorage::READ);
    fs["MyImage"] >> image;
    imshow("Image", image);
    waitKey();
    return 0;
}

其中"temp“是存储数据的文件名。在不使用fileSystem的情况下并行运行这些程序的最佳方法是在并行运行程序之前在适当的位置定义一个命名管道"temp“:

代码语言:javascript
复制
>mkfifo temp
>./producer testFile.jpg | ./consumer

这种方式不使用磁盘,程序可以并行运行。

fileStorage将Mat的二进制内容更改为ascii,这很费时。您可以决定像解释的here那样以二进制方式序列化内容,并与它们一起使用命名管道。

票数 2
EN

Stack Overflow用户

发布于 2015-11-13 08:21:38

将该文件写入磁盘,并记住在完成该文件后立即删除它。文件缓存将延迟物理写入,而快速删除则会阻止物理写入。

或者,存储数据是共享内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33685266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档