【发布时间】:2015-11-13 03:05:02
【问题描述】:
我正在尝试将几个 cv::Mat 对象从一个程序传递到另一个程序,它们都是用 C++ 实现的,最好是并行运行。 cv::Mat 里面没有图像,所以 imread 和 imwrite 在这里没有用(我们不能用传统的图像压缩方法来压缩数据)。一种解决方案是将矩阵写入文件(例如CSV文件),但由于程序处理的信息太多,磁盘将成为瓶颈,而且我很快就会耗尽磁盘空间。
经过一番挖掘,我发现管道(名称或未命名)是一种有用的解决方案。我写了两个试点程序: 生产者.cpp:
int main(int argc, char* argv[])
{
Mat image;
image = imread(argv[1]);
cout << image;
cout.flush();
return 0;
}
Consumer.cpp:
int main(int argc, char* argv[])
{
Mat image;
cin >> image;
imshow("Image", image);
waitKey();
return 0;
}
令人惊讶的是,第二个程序无法编译。
不匹配的类型‘_CharT2*’和‘cv::Mat’ cin >> 图像;
这意味着(我猜)“>>”运算符没有为 cv::Mat 重载。即使我们可以覆盖 >> 运算符,因为矩阵很大,而且标准输入和标准输出是基于文本的,它既不是最好的也不是最简单的方法。
所以,回到主要问题:将 cv::Mat 对象(或任何其他二进制对象)从一个程序传递到另一个程序的最佳方式是什么?
【问题讨论】:
-
TCP/IP 但这个问题的答案不止一种
-
你可以查看here如何序列化和反序列化
Mat -
感谢 GPPK 的回答,TCP/IP 是一个不错的选择,但它们如何以及为什么比管道更好?
-
感谢三木的回复。所提出的解决方案是鼓舞人心的,即使根据我的测试,速度提升速度要快 5 到 10 倍(我相信它与运行测试的系统有关)。我将把它与命名管道混合,希望能解决我的问题。完成后我会尽快发布解决方案。
标签: c++ opencv pipe named-pipes