解决的c++项目里的图片需要传输到unity做显示,返回的是cv::Mat 的data和 宽高,原始图像是三通道RGB图
C++:
cv::Mat _currentFrame;
void GetRawImageBytes(unsigned char* data, int width, int height)
cv::Mat resizedMat(height, width, _currentFrame.type());
cv::resize(_currentFrame, resizedMat, resizedMat.size(), cv::INTER_CUBIC);
cv::imshow("Nicolas", resizedMat);
cv::Mat argb_img;
cv::cvtColor(resizedMat, argb_img, CV_RGB2BGRA);
std::vector<cv::Mat> bgra;
cv::split(argb_img, bgra);
std::swap(bgra[], bgra[]);
std::swap(bgra[], bgra[]);
std::memcpy(data, argb_img.data, argb_img.total() * argb_img.elemSize());
C#:
using System;
using System.Runtime.InteropServices;
using UnityEngine;
public class Test : MonoBehaviour
[DllImport("ImageInputInterface")]
private static extern void GetRawImageBytes(IntPtr data, int width, int height);
private Texture2D tex;
private Color32[] pixel32;
private GCHandle pixelHandle;
private IntPtr pixelPtr;
void Start()
InitTexture();
gameObject.GetComponent<Renderer>().material.mainTexture = tex;
void Update()
MatToTexture2D();
void InitTexture()
tex = new Texture2D(, , TextureFormat.ARGB32, false);
pixel32 = tex.GetPixels32();
pixelHandle = GCHandle.Alloc(pixel32, GCHandleType.Pinned);
pixelPtr = pixelHandle.AddrOfPinnedObject();
void MatToTexture2D()
GetRawImageBytes(pixelPtr, tex.width, tex.height);
tex.SetPixels32(pixel32);
tex.Apply();
void OnApplicationQuit()
pixelHandle.Free();
fromhttps://stackoverflow.com/questions/49482647/convert-opencv-mat-to-texture2d