功能:读取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).\n"),
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).\n"),
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;
}
接收端