目标:同一台电脑,不同编程语言传递数据
核心思路:mmap
demo1:windows上C++传输1080p视频流给python(实测几乎无延迟)
cpp(发视频)
#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <Windows.h>
#include <string>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
#define MMAP_SIZE 1024*1024*50 // 1024字节
int main()
{
//LPCWSTR是一个指向unicode编码字符串的32位指针
LPCWSTR mmapName = L"sharemem";
//HANDLE:句柄,是Windows用来表示对象的(不是C++的对象)
HANDLE hMapFileVTX = CreateFileMapping(INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE, 0, MMAP_SIZE, mmapName);
//LPVOID是一个没有类型的指针,也就是说你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),
//然后在使用的时候再转换回来。 可以将其理解为long型的指针,指向void型。
LPVOID lpBase = MapViewOfFile(hMapFileVTX, FILE_MAP_ALL_ACCESS, 0, 0, MMAP_SIZE);
// Do some work...
cv::VideoCapture cap(0);
while (cap.isOpened())
{
Mat src,frame;
cap >> src; //读取当前帧
cv::resize(src,frame,cv::Size(1920,1080));
if(!frame.empty()){ //判断输入的视频帧是否为空的
imshow("C++ sender",frame); //在window窗口显示frame摄像头数据画面
}
int size = frame.cols * frame.rows * frame.channels();
cout<<size<<endl;
memcpy(lpBase, frame.data, size);
cv::waitKey(33);
}
//close
UnmapViewOfFile(lpBase);
CloseHandle(hMapFileVTX);
return 0;
}
py(收视频)
import mmap
import cv2
import numpy as np
while(1):
mmap_file = mmap.mmap(-1, 1024 * 1024 * 50, access=mmap.ACCESS_READ, tagname='sharemem')
all_buffer = mmap_file.read()
data_buffer = all_buffer[:6220800]
if(len(data_buffer)==6220800):
cv_image = np.frombuffer(data_buffer, dtype=np.uint8).reshape(1080, 1920, 3)
cv2.imshow('python rec',cv_image)
else:
print("error")
cv2.waitKey(33)
示例画面(实测没有延迟,去掉window标题 分不出谁发谁收)
其他内容
传递int
传递double
传递str
图像案例都给了,这些可以类推了吧?什么字符串,json自己捣鼓去吧。
|