zoukankan      html  css  js  c++  java
  • 例程使用(1-2)共享内存 传递简单结构体

    功能:读取USB视频,鼠标点击点(x,y)保存在共享内存

     

    发射端

    /*  1包含文件  */
    //1.1 系统 必选
    #include<iostream>
    #include<Windows.h>
    
    //1.2 opencv 可选
    #include <opencv2/opencv.hpp>  
    using namespace cv;
    using namespace std;
    
    /*  2自定数据区  */
    //2.1 要存储的数据
    typedef struct
    {
    	int x;
    	int y;
    	/*int zx;
    	int zy;*/
    	int width;
    	int height;
    	
    	int flag;
    
    }TrackBox; //目标检测的上下顶点;
    
    TrackBox BOX;
    
    /*3 共享内存*/
    //3.1内存变量
    HANDLE hMapFile;  
    LPCTSTR pBuf;
    TCHAR szName[] = TEXT("Local\FHY_SYSTEM_0");    //指向同一块共享内存的名字
    
    #define FRAME_SIZE 1920*1080	// 要存的数据大小(图像)
    #define BUF_SIZE FRAME_SIZE*10   //分配10倍大
    #define BOX_DATA      (char*)pBuf+FRAME_SIZE*0  //数据存储的起始位置
    
    //3.2 初始化
    int intShareroom() {
    
    	hMapFile = CreateFileMapping(
    		INVALID_HANDLE_VALUE,    // use paging file
    		NULL,                    // default security
    		PAGE_READWRITE,          // read/write access
    		0,                       // maximum object size (high-order DWORD)
    		BUF_SIZE,                // maximum object size (low-order DWORD)
    		szName);                 // name of mapping object
    
    	if (hMapFile == NULL)
    	{
    		printf(TEXT("Could not create file mapping object (%d).
    "),
    			GetLastError());
    		return 1;
    	}
    
    	pBuf = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
    		FILE_MAP_ALL_ACCESS, // read/write permission
    		0,
    		0,
    		BUF_SIZE);
    
    	if (pBuf == NULL)
    	{
    		printf(TEXT("Could not map view of file (%d).
    "),
    			GetLastError());
    
    		CloseHandle(hMapFile);
    
    		return 1;
    	}
    
    }
    
    
    /* 4 测试 鼠标点击输出 x y 存入共享内存   */
    //4.1 鼠标事件
    void onMouse(int event, int x, int y, int flags, void* param)
    {
    	
    
    	//cout << "flag =" << flag << endl;
    	Mat *im = reinterpret_cast<Mat*>(param);
    	switch (event)
    	{
    	case CV_EVENT_LBUTTONDOWN:     //鼠标左键按下响应:返回坐标和灰度  
    		BOX.x = x;
    		BOX.y = y;
    		BOX.flag = flags;
    		
    		cout << "at(" << BOX.x << "," << BOX.y << ")" << "flag =" << BOX.flag << endl;
    		//cout << "flag =" << BOX.flag << endl;
    		//memcpy(&BOX, BOX_DATA, sizeof(TrackBox));
    		
    		memcpy(BOX_DATA, &BOX, sizeof(TrackBox));
            //memcpy(&flag, TRANSFER_FLAG, sizeof(int));
    		//memcpy(&point, DECTION_BOX_DATA, sizeof(CvPoint));
    		break;
    	}
    }
    // 4.2 读取视频 
    int imge_test() {
    
    	// 构造一个VideoWriter
    	//VideoWriter video("test.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(1920, 1080));
    	VideoCapture capture(0);
    	if (!capture.isOpened())
    	{
    		return -1;
    	}
    	Mat frame;
    	capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
    	capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
    
    	bool stop = false;
    	while (1)
    	{
    		//flag = 0;
    		capture >> frame;
    		cvNamedWindow("当前视频", 0);
    
    		resize(frame, frame, Size(1920, 1080));
    		//Sleep(10);
    		cvSetMouseCallback("当前视频", onMouse, &frame);
    
    		imshow("当前视频", frame);
    		waitKey(1);
    
    	}
    
    }
    	
    	
    int main()
    {   //3 共享内存初始化
    	intShareroom();
    
    	//4 图像鼠标点击测试
    	imge_test();
    	
    	//3 共享内存释放
    	UnmapViewOfFile(pBuf); //释放;
    	CloseHandle(hMapFile);
    	return 0;
    }
    

      接收端

     

    #include <windows.h>
    
    #include<iostream>
    using namespace std;
    
    
    // 1.1 定义共享内存
    #define FRAME_SIZE 1920*1080                                      // 1单个大小
    #define BUF_SIZE FRAME_SIZE*10                                  // 2设置单个成倍数
    #define recBOX_DATA      (char*)pBuffer+FRAME_SIZE*0  // 3在共享内存中的存储的开始地址
    // 1.2
    TCHAR szName[] = TEXT("Local\FHY_SYSTEM_0");     //4指向同一块共享内存的名字
    HANDLE hMapFile;   //创建句柄
    LPCTSTR pBuffer;
    
    
    // 2 要发送的数据格式
    typedef struct
    {
    	int x;
    	int y;
    	int width;
    	int height;
    	int flag;
    }TrackBox; //目标检测的上下顶点;
    
    TrackBox recBOX;
    
    // 3初始化
    void  initShareMemory()
    {
    	hMapFile = CreateFileMapping(
    		INVALID_HANDLE_VALUE,    // use paging file
    		NULL,                    // default security
    		PAGE_READWRITE,          // read/write access
    		0,                       // maximum object size (high-order DWORD)
    		BUF_SIZE,                // maximum object size (low-order DWORD)
    		szName);                 // name of mapping object
    
    	if (hMapFile == NULL)
    	{
    	
    		cout << "Could not create file mapping object" << GetLastError() << endl;
    	}
    	pBuffer = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
    		FILE_MAP_ALL_ACCESS, // read/write permission
    		0,
    		0,
    		BUF_SIZE);
    
    	if (pBuffer == NULL)
    	{
    		printf("Could not map view of file (%d).
    ",
    			GetLastError());
    	}
    }
    
    
    
    
    
    void main() {
    
    
    	initShareMemory();
    
    
    	while (true)
    	{
    
    
    		// 4 主函数中 使用
    
    		memcpy(&recBOX, recBOX_DATA, sizeof(TrackBox));// 取共享内存值
    
    		int  itarget_x, itarget_y, itarget_h, itarget_w;
    
    
    		if (recBOX.flag != 0)  // 标志位判断数据是否有效
    		{
    			itarget_x = recBOX.x;//  中心
    			itarget_y = recBOX.y;
    			itarget_h = recBOX.height;
    			itarget_w = recBOX.width;
    			//qDebug("target_x:%d  target_y:%d", recBOX.x, recBOX.y);
    		}
    		else {
    
    			itarget_x = 1920 / 2;//  中心
    			itarget_y = 1080 / 2;
    			//qDebug("target_x:%d  target_y:%d", itarget_x, itarget_y);
    		}
    
    
    		cout << "x	" << itarget_x << "	y	" << itarget_y << "	h	" << itarget_h << "	w	" << itarget_w << endl;
    
    	}
    
    }
    

      

    封装成类

    类定义

    ShareMemray.h

    #pragma once
    #ifndef ShareMemray
    #define ShareMemray
    
    #include<iostream>
    #include<Windows.h>
    #include <opencv2/opencv.hpp> 
    
    using namespace cv;
    using namespace std;
    
    
    #define FRAME_SIZE	 1920*1080						// 要存的数据大小(图像)
    #define BUF_SIZE	 FRAME_SIZE*10					//分配10倍大
    #define BOX_DATA     (char*)pBuf+FRAME_SIZE*0		//数据存储的起始位置 存BOX_DATA  pBuf+FRAME_SIZE*0 -  pBuf+FRAME_SIZE*0+sizeof(TrackBox)  
    #define MAT_DATA     (char*)pBuf+FRAME_SIZE*1       //                   存MAT_DATA  pBuf+FRAME_SIZE*1 -  pBuf+FRAME_SIZE*1+sizeof(Mat)
    
    typedef struct
    {
    	int x;
    	int y;
    
    	int width;
    	int height;
    
    	int flag;
    
    }TrackBox; //目标检测的上下顶点;
    
    
    
    
    class SHAREDMEMORY {
    
    private:
    	TrackBox BOX;
    	HANDLE hMapFile;
    	LPCTSTR pBuf;
    	TCHAR szName[30] = TEXT("Local\FHY_SYSTEM_0");    //指向同一块共享内存的名字
    
    
    public:
    
    	//1 初始化
    	int intShareroom();
    	void SendBox(TrackBox BOX);
    	void RecBox(TrackBox BOX);
    	void stop();	
    
    };
    
    
    
    
    
    
    #endif  //SHAREDMEMORY_HPP
    

      

      

    文件定义

    ShareMemray.cpp

    #include "ShareMemray.h"
    
    
    
    //3.2 初始化
    int SHAREDMEMORY::intShareroom() {
    
    	hMapFile = CreateFileMapping(
    		INVALID_HANDLE_VALUE,    // use paging file
    		NULL,                    // default security
    		PAGE_READWRITE,          // read/write access
    		0,                       // maximum object size (high-order DWORD)
    		BUF_SIZE,                // maximum object size (low-order DWORD)
    		szName);                 // name of mapping object
    
    	if (hMapFile == NULL)
    	{
    		printf(TEXT("Could not create file mapping object (%d).
    "),
    			GetLastError());
    		return 1;
    	}
    
    	pBuf = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
    		FILE_MAP_ALL_ACCESS, // read/write permission
    		0,
    		0,
    		BUF_SIZE);
    
    	if (pBuf == NULL)
    	{
    		printf(TEXT("Could not map view of file (%d).
    "),
    			GetLastError());
    
    		CloseHandle(hMapFile);
    
    		return 1;
    	}
    
    }
    void SHAREDMEMORY::SendBox(TrackBox BOX) {
    	memcpy(BOX_DATA, &BOX, sizeof(TrackBox));
    }
    
    void SHAREDMEMORY::RecBox(TrackBox BOX) {
    	memcpy(&BOX, BOX_DATA, sizeof(TrackBox));
    }
    
    
    void SHAREDMEMORY::stop() {
    	UnmapViewOfFile(pBuf); //释放;
    	CloseHandle(hMapFile);
    }
    

      

    发送端

    #pragma once
    #ifndef MAIN
    #define MAIN
    
    
    /*  1包含文件  */
    //1.1 系统 必选
    #include<iostream>
    #include<Windows.h>
    #include "../Include/ShareMemray.h"
    
    //1.2 opencv 可选
    #include <opencv2/opencv.hpp> 
    using namespace cv;
    using namespace std;
    
    
    
    
    TrackBox BOX1;
    
    /* 4 测试 鼠标点击输出 x y 存入共享内存   */
    //4.1 鼠标事件
    void onMouse(int event, int x, int y, int flags, void* param)
    {
    
    
    	//cout << "flag =" << flag << endl;
    	Mat *im = reinterpret_cast<Mat*>(param);
    	switch (event)
    	{
    	case CV_EVENT_LBUTTONDOWN:     //鼠标左键按下响应:返回坐标和灰度 
    		BOX1.x = x;
    		BOX1.y = y;
    		BOX1.flag = flags;
    
    		cout << "at(" << BOX1.x << "," << BOX1.y << ")" << "flag =" << BOX1.flag << endl;
    	
    
    
    		break;
    	}
    }
    // 4.2 读取视频
    int imge_test(SHAREDMEMORY sharesend) {
    
    	// 构造一个VideoWriter
    	//VideoWriter video("test.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(1920, 1080));
    	VideoCapture capture(0);
    	if (!capture.isOpened())
    	{
    		return -1;
    	}
    	Mat frame;
    	capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
    	capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
    
    	bool stop = false;
    	while (1)
    	{
    		//flag = 0;
    		capture >> frame;
    		cvNamedWindow("当前视频", 0);
    
    		resize(frame, frame, Size(1920, 1080));
    		//Sleep(10);
    		cvSetMouseCallback("当前视频", onMouse, &frame);
    
    		imshow("当前视频", frame);
    		waitKey(1);
    
    		if (BOX1.flag == 1) {
    		
    			sharesend.SendBox(BOX1);
    			BOX1.flag = 0;
    		}
    
    	}
    
    }
    
    
    int main()
    {
    	//共享内存初始化
    	SHAREDMEMORY sharesend;
    	sharesend.intShareroom();
    	
    	//共享内存发送信息
    	imge_test(sharesend);
    
    	//共享内存发送消息
    	sharesend.stop();
    	
    	return 0;
    }
    
    
    #endif
    

      

    接收端

    #include <windows.h>
    #include<iostream>
    #include "../Include/ShareMemray.h"
    
    using namespace std;
    
    
    TrackBox recBOX;
    
    
    
    void main() {
    
    	SHAREDMEMORY sharerec;
    	sharerec.intShareroom();
    	
    
    
    	while (true)
    	{
    
    
    		sharerec.RecBox(recBOX);
    
    		int  itarget_x, itarget_y, itarget_h, itarget_w;
    
    
    		if (recBOX.flag != 0)  // 标志位判断数据是否有效
    		{
    			itarget_x = recBOX.x;//  中心
    			itarget_y = recBOX.y;
    			itarget_h = recBOX.height;
    			itarget_w = recBOX.width;
    			//qDebug("target_x:%d  target_y:%d", recBOX.x, recBOX.y);
    		}
    		else {
    
    			itarget_x = 1920 / 2;//  中心
    			itarget_y = 1080 / 2;
    			//qDebug("target_x:%d  target_y:%d", itarget_x, itarget_y);
    		}
    
    
    		cout << "x	" << itarget_x << "	y	" << itarget_y << "	h	" << itarget_h << "	w	" << itarget_w << endl;
    
    	}
    	sharerec.stop();
    
    }
    

      

    如何发送一个新的自定义结构体

     1在共享内存头文件构造这个结构体

    typedef struct
    {
    	int x;
    	int y;
    
    	int width;
    	int height;
    
    	int flag;
    
    }TrackBox; //目标检测的上下顶点;
    

      

    2 在发送类里面加入这个结构体声明

     3 确定在开辟的贡献内存里,分哪一块用来存

     3-1 确认共享内存总的区间,足以存下

    总空间名字

    总空间大小

    3-2 在我我们开辟的共享内存里,分那一块用来存

    4 实际存入

     

  • 相关阅读:
    写了这么久前端,你知道浏览器原理吗?
    史上最全的web前端开发程序员学习清单!
    常见前端面试题及答案
    “下辈子再也不当程序员了,我被黑够了”
    什么是web前端,全栈工程师就业前景怎么样?
    要嫁就嫁程序员,钱多话少死得早!
    想转行做web前端工程师,必学这6大技能
    测试用例设计总结
    python读取一个英文文件,并记录每个单词出现的次数,降序输出
    python读取一个文件的每一行判断是否为素数,并把结果写到另一个文件中
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/8330336.html
Copyright © 2011-2022 走看看