有没有办法可以创建指向图像内存位置的指针,将其传递给另一个程序并从那里访问它。我们有像Mat这样的图像容器数据类型,我们用它来读取图像
cv::Mat m ;
m = imread("a.jpg") ;
我们可以创建指向这些图像的指针并将其传递给其他程序吗?
例如,我可以传递整数的地址
int x = 10 as '&x' to another program by using named pipes for IPC
write(pipe , &x , sizeof(int));
在接收方
read(pipe , &y , sizeof(int));
打印时显示10
将为整数做,我们如何为图像做到这一点。
答案 0 :(得分:4)
我们可以创建指向这些图像的指针并将其传递给其他程序吗?
不,你不能那样做。指针绑定到特定进程虚拟内存空间,当在不同进程中使用时,这些指针毫无意义。
答案 1 :(得分:0)
您需要使用共享内存来执行此操作。对于POSIX-y系统,使用shm_open
和mmap
,您可以创建两个进程都可以访问的内存区域。注意,该区域的地址在两个过程中通常不会相同。不是Windows程序员,但我相信CreateFileMapping
和MapViewOfFile
是类似的。下面的代码示例概述了您可能在linux上执行的操作:
在流程A和B中:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
//ensure success by checking fd >= 0!
int fd = shm_open("unique_name", O_CREAT | O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
//choose length to be some sufficiently large region of memory to
//hold the data structures you want to share. Both process A and B
//should agree on this.
//ensure success by checking that ptr != 0
void* ptr = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
//Create your image objects using the memory region you have just created
//using one of the constructors that takes a user-provided data pointer
cv::Mat(rows, cols, type, ptr, step);
此时,您在一个进程中对该对象所做的任何操作都将反映在另一个进程中。您需要单独同步两个进程(可能使用信号量,消息队列或管道)以确保两个进程之间的映像内容的一致性。如果进程A将始终写入并且进程B将始终只读取图像内容,则可以简化一些事情。
希望有所帮助。