如何实现byte[r,c,c]与Halcon HObject/HImage及byte[]的相互转换?
解决方案:Zivid/Halcon/ML.NET 图像数据内存级转换
1. Zivid三维byte数组(row, column, channel)转Halcon HImage/HObject
Halcon.NET 提供直接从内存创建图像的API,无需通过文件中转。核心是利用GenImage1(单通道)或GenImage3(三通道)方法,将三维数组按通道提取为一维内存块后传入。
三通道彩色图示例(RGB):
// 假设zividImageData是Zivid返回的byte[rows, cols, 3]数组 int rows = zividImageData.GetLength(0); int cols = zividImageData.GetLength(1); // 提取RGB各通道的一维数据(Halcon要求按行连续存储) byte[] rChannel = new byte[rows * cols]; byte[] gChannel = new byte[rows * cols]; byte[] bChannel = new byte[rows * cols]; for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { int flatIdx = r * cols + c; rChannel[flatIdx] = zividImageData[r, c, 0]; gChannel[flatIdx] = zividImageData[r, c, 1]; bChannel[flatIdx] = zividImageData[r, c, 2]; } } // 创建HImage HImage halconImage = new HImage(); halconImage.GenImage3("byte", cols, rows, rChannel, gChannel, bChannel); // 转HObject直接赋值即可 HObject halconObj = halconImage;
单通道灰度/深度图示例:
int rows = zividImageData.GetLength(0); int cols = zividImageData.GetLength(1); byte[] singleChannel = new byte[rows * cols]; for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { singleChannel[r * cols + c] = zividImageData[r, c, 0]; } } HImage halconGrayImage = new HImage(); halconGrayImage.GenImage1("byte", cols, rows, singleChannel);
注意:确认Zivid返回的通道顺序(RGB/BGR),如果是BGR,需要调整
GenImage3的通道参数顺序。
2. Halcon HImage转ML.NET所需的一维byte数组(PNG格式,与File.ReadAllBytes结果一致)
利用Halcon的WriteImage方法直接写入内存流,避免磁盘IO,得到的字节数组与读取PNG文件的结果完全一致。
// 假设halconImage是已有的HImage实例 byte[] pngBytes; using (MemoryStream ms = new MemoryStream()) { // 将图像写入内存流,格式指定为png halconImage.WriteImage("png", 0, ms); // 转换为一维byte数组 pngBytes = ms.ToArray(); } // pngBytes可直接传入ML.NET,效果等同于File.ReadAllBytes("xxx.png")
注意:如果需要其他格式(如JPG),只需将
"png"替换为对应格式字符串(如"jpeg"),但ML.NET通常优先支持PNG以避免压缩损失。
内容的提问来源于stack exchange,提问作者Malinko
相关产品推荐
相关产品推荐

