使用CreateFileMapping来进行进程间的通信和使用信号量来进行同步操作——进程间实现图片传输

使用共享内存+信号量来进行进程间的通信,实现进程间的图片传输
推荐使用opencv3.x版本,因为opencv4.x就不支持IplImage和Mat类型之间的转换,
有两个进程:图片采集端和图片计算端下面一一讲解:

一、图片采集端作用:采集图片和把图片写入共享内存

/*使用vs+opencv3.x
本程序是使用共享内存来进行进程间的通信,使用图片采集端(进程一)来采集图片并把图片写入共享内存里
在图片计算端(进程二)从共享内存里读出图片信息并做相应的图片处理
本进程是进程一:图片采集端:主要是使用摄像头来采集图片,并把图片存入共享内存,框架为:
1. 使用opencv的API:VideoCapture来打开摄像头和采集图片
2. 使用CreateFileMapping来在内核创建映射对象
3. 使用MapViewOfFile来将文件映射到内存空间
4. 使用memcpy来传递图片信息
中间使用了信号量CreateSemaphore来实现同步操作,防止我们进程一还没写完,进程二就开始读,导致的错误
信号量的使用:
1. CreateSemaphore创建信号量
2. WaitForSingleObject实现p操作
3. ReleaseSemaphore实现v操作*/
#include <tchar.h>
#include <fstream>
#include <math.h>
#include <Windows.h>
#include<iostream>

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

#define IMAGE_WIDTH 640
#define IMAGE_HEIGHT 480

#define IMAGESIZE IMAGE_WIDTH*IMAGE_HEIGHT  //每帧图像(单通道)的大小
#define SHARE_MEM_SIZE IMAGESIZE*5        //设定共享内存总大小(图像头信息 + RGB图像数据信息)
#define SHU_RU_IMAGE_HEAD (char*)pBuf+IMAGESIZE*0 //图像头信息首地址
#define SHU_RU_IMAGE_DATA (char*)pBuf+IMAGESIZE*2//图像数据信息首地址
//共享内存句柄
HANDLE hShareM;//handle的理解:handle表示一个Windows对象(不是C++对象),是Windows为分配的资源的标识号
LPCTSTR pBuf;

//信号量句柄
HANDLE pSemWrite;
HANDLE pSemRead;


TCHAR shareMemName[] = TEXT("shareMem");//共享内存名字

char semName1[] = "semWrite";//信号量名字
char semName2[] = "semRead";
//图像头结构体
typedef struct 
{
   
	int width;
	int height;
}imageHeadinf;

int initialShareMem();
int initialSem();
void  copyToMem(IplImage* image);

int main()
{
   
	//**初始化共享内存和信号量
	initialShareMem();
	initialSem();

	int i = 0;
	while (i < 10)
	{
   
		i++;
		//使用摄像头采集图片
		VideoCapture capture(0);//摄像机采集图片
		if (!capture.isOpened())
		{
   
			cout <<</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值