python端代码
import numpy as np
import mmap
import cv2
import time
# 创建一个空的共享内存
shm_size = 1024*1024*10 # 10MB
shm = mmap.mmap(-1, shm_size, "SynchronousImage")
while True:
# 读取图像文件
image = cv2.imread('3.png')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换颜色通道顺序从 BGR 到 RGB
# 输出图像的宽度和高度
height, width = image.shape[:2]
print("图像宽度:", width)
print("图像高度:", height)
# 水平翻转(镜像)
# 参数 0 表示沿着 x 轴(水平方向)翻转
# image = cv2.flip(image, 1)
# 垂直翻转(镜像)
# 参数 1 表示沿着 y 轴(垂直方向)翻转
image = cv2.flip(image, 1)
# 水平和垂直同时翻转(镜像)
# 参数 -1 表示同时沿着 x 和 y 轴翻转
image = cv2.flip(image, -1)
# 将图像数据写入共享内存
image_bytes = image.tobytes()
shm.seek(0)
shm.write(image_bytes)
# 等待一段时间(可根据需要调整)
time.sleep(.1)
# 关闭共享内存
shm.close()
unity C#端代码
using System.IO.MemoryMappedFiles;
using UnityEngine;
using UnityEngine.UI;
public class MemoryFetchImage : MonoBehaviour
{
public int width; // 接收图像的宽 --> 需要和python端 放置时保持一致
public int height; // 接收图像的高
public RawImage RawImage;
private void Start()
{
FetchImage(RawImage,new Texture2D(width, height, TextureFormat.RGB24, false));
}
private void FetchImage(RawImage rawImage, Texture2D texture2D)
{
// 打开共享内存
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("SynchronousImage"))
{
// 创建共享内存的视图
using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
{
// 读取共享内存中的图像数据
byte[] imageData = new byte[width * height * 3];
accessor.ReadArray(0, imageData, 0, width * height * 3);
// 将图像数据加载到 Texture2D 中
texture2D.LoadRawTextureData(imageData);
texture2D.Apply();
}
}
RawImage.texture = texture2D;
}
}