Unity C#
cameraDll.cs
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
public class cameraDll : MonoBehaviour
{
[DllImport("run_on_camera_sequence")]
//static extern void ByteToMat(System.IntPtr imageData, int imageW, int imageH, int nFlag);
static extern void ByteToMat(byte[] imagedata, int imageW, int imageH, int nFlag);
// Start is called before the first frame update
int width = 640;
int height = 480;
private WebCamTexture webCamTexture;
void Start()
{
webCamTexture = new WebCamTexture();
如果有后置摄像头,调用后置摄像头
//for (int i = 0; i < WebCamTexture.devices.Length; i++)
//{
// print(WebCamTexture.devices[i].name);
// if (WebCamTexture.devices[i].name == "Creative GestureCam")
// {
// webcamTexture.deviceName = WebCamTexture.devices[i].name;
// break;
// }
//}
webCamTexture.deviceName = WebCamTexture.devices[0].name;
Renderer renderer = GetComponent<Renderer>();
renderer.material.mainTexture = webCamTexture;
webCamTexture.Play();
}
// Update is called once per frame
void Update()
{
ByteToMat(ConvertWebCamTextureToByteArray(), 480, 640, 3);
}
//获取像素
public byte[] ConvertWebCamTextureToByteArray()
{
Color[] pixels = new Color[width * height];
pixels = webCamTexture.GetPixels();
byte[] bytes = new byte[width * height * 4];
for (int i = 0; i < pixels.Length; i++)
{
Color color = pixels[i];
bytes[i * 4] = (byte)(color.r * 255);
bytes[i * 4 + 1] = (byte)(color.g * 255);
bytes[i * 4 + 2] = (byte)(color.b * 255);
bytes[i * 4 + 3] = (byte)(color.a * 255);
}
return bytes;
}
}
C++
cpp
cv::Mat outImg;
extern "C" __declspec(dllexport)
//解析从u3d中传过来的字节格式的图像数据为Mat
void ByteToMat(byte* pImg, int nH, int nW, int nFlag)//nH,nW为BYTE*类型图像的高和宽,nFlag为通道数
{
if (pImg == nullptr)
{
return ;
}
outImg = cv::Mat(nH, nW, CV_8UC4, pImg);
cv::cvtColor(outImg, outImg, cv::COLOR_RGB2BGR);
cv::flip(outImg, outImg, 1);
cv::rotate(outImg, outImg, cv::ROTATE_180);
cv::imshow("u3dvideo", outImg);
cv::waitKey(1);
}
初阶上nFlag没用,可以不要。