在不同的进程之间传输cv::Mat对象的最佳方式是什么
What is the best way to transfer a cv::Mat object between different processes?
我正试图将两个cv::Mat对象从一个程序传递到另一个程序,这两个对象都是用C++实现的,最好是并行运行。cv::Mat中没有图像,因此imread和imwrite在这里没有用处(我们不能用传统的图像压缩方法压缩数据)。一种解决方案是将矩阵写入文件(例如CSV文件),但由于程序处理的信息太多,磁盘将成为瓶颈,此外,我很快就会耗尽磁盘空间。
经过一番挖掘,我发现管道(名称或未命名)是一个有用的解决方案。我写了两个试点项目:Producer.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*"answers"cv::Mat"cin>>图像;
这意味着(我想)">>"运算符对于cv::Mat没有过载。尽管我们可以覆盖>>运算符,但由于矩阵很大,stdin和stdout都是基于文本的,所以这不是最好的方法,也不是最简单的方法。
所以,回到主要问题:将cv::Mat对象(或可能的任何其他二进制对象)从一个程序传递到另一个程序的最佳方式是什么?
Mat(或任何其他对象)应该以某种方式序列化。在opencv中序列化的简单方法是使用FileStorage。以下是示例代码:
生产者:
int main(int argc, char* argv[])
{
Mat image;
image = imread(argv[1]);
FileStorage fs("temp", FileStorage::WRITE);
fs << "MyImage" << image;
return 0;
}
消费者:
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":
>mkfifo temp
>./producer testFile.jpg | ./consumer
这样就不用使用磁盘,而且程序可以并行运行。
fileStorage将Mat的二进制内容更改为ascii,这很耗时。可以决定以二进制形式序列化内容,如本文所述,并将命名管道与它们一起使用。
将文件写入磁盘,并记住在完成后立即删除。文件缓存会延迟物理写入,而快速删除会阻止物理写入。
或者,将数据存储为共享内存。
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- OpenCV Otsu的阈值:计算多个Mat对象的单个阈值
- 当我更改其他 Mat 对象时,垫子值会更改
- 无法在类中分配 cv::Mat 对象C++
- 将 Mat 对象C++传递给 Unity
- 为什么包装 setMouseCallback 会导致 Mat 对象为空
- OpenCV Mat对象复制速度更快
- 在cv::Mat对象上循环时,内存位置出现cv::异常
- OpenCV-C++中Mat对象的平均值
- OpenCV格式化程序类和Mat对象的cout产生链接器错误:体系结构x86_64的未定义符号:libopencv_co
- 如何从XML文件(OpenCV)将一定数量的行读入Mat对象
- 在 Java 客户端中创建 Mat 对象,使用 opencv 从C++服务器发送
- 通过套接字将 Mat 对象从 c++ 发送到 Java
- 为什么OpenCV Mat对象在嵌套for循环中指定了预期值后却不包含这些值
- 如何将像素设置为cv::Mat对象中的值
- 将Mat对象从androidjava传递到本机cpp部分
- I'm试图将像素数据转换为OpenCV Mat对象
- 如何在Android中从文件中读取OpenCV Mat对象
- Zeros Mat 对象具有除零以外的一些值
- 如何调整空的 cv::Mat 对象