You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中OpenCV Absdiff输出的OutputArray转byte[]方法求助

解决OpenCvSharp OutputArray转byte[]的问题

核心思路

OpenCvSharp的OutputArray本质是Mat的包装类,先将其转换为Mat对象,再通过Mat的API获取编码后的图片字节数组(用于存储)或原始像素数据。

步骤1:正确接收Absdiff的输出(避免OutputArray转换)

调用Cv2.Absdiff时,直接用Mat作为输出参数,无需使用OutputArray,简化后续操作:

// 假设你已经有两个输入Mat:processImageOne、processImageTwo
Mat differenceMat = new Mat();
Cv2.Absdiff(processImageTwo, processImageOne, differenceMat);

步骤2:将Mat转换为可存储的byte[]

根据你的需求选择两种方式:

方式1:编码为图片格式(PNG/JPG,适合文件存储)

直接用OpenCvSharp的ToBytes方法或Cv2.ImEncode生成图片格式的字节数组:

// 方法A:使用Mat的ToBytes快捷方法
byte[] pngBytes = differenceMat.ToBytes(".png");
// 方法B:使用ImEncode更灵活(可设置编码参数)
using (MemoryStream ms = new MemoryStream())
{
    Cv2.ImEncode(".png", differenceMat, ms);
    byte[] pngBytes = ms.ToArray();
}

方式2:获取原始像素数据(适合Unity Texture2D直接加载)

如果需要Mat的原始像素字节(未编码),可以通过内存复制获取:

int byteCount = (int)(differenceMat.Total() * differenceMat.ElemSize());
byte[] rawPixels = new byte[byteCount];
System.Runtime.InteropServices.Marshal.Copy(differenceMat.Data, rawPixels, 0, byteCount);

补充:如果已经得到OutputArray

如果你的代码中已经持有OutputArray类型的differenceImage,先将其转换为Mat再处理:

Mat diffMat = differenceImage.GetMat();
// 后续步骤同上述方式1或2

注意事项

  • OpenCV默认颜色空间是BGR,Unity使用RGB。如果存储的图片需要在Unity中正确显示,建议先转换颜色空间:
    Mat rgbDiffMat = new Mat();
    Cv2.CvtColor(differenceMat, rgbDiffMat, ColorConversionCodes.BGR2RGB);
    // 再对rgbDiffMat进行编码操作
    

内容的提问来源于stack exchange,提问作者Matthias Roth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:50:27