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
相关产品推荐
相关产品推荐

