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

OpenCV for Unity中Mat.get数据类型不兼容异常排查求助

问题排查与解决方案

异常原因分析

首先解析异常中的类型码28:OpenCV的Mat类型由深度(depth)和通道数(channels)共同决定,计算规则为type = depth + (channels-1)*8。其中CV_32S的深度值是4,代入计算得4 + (4-1)*8 = 28,说明你的linesMat是4通道32位整数矩阵(CV_32SC4)——这是HoughLinesP的默认输出格式,每一行对应一条线的4个坐标值(x1,y1,x2,y2)。

日志显示调用了Mat.get(byte[] data)重载方法,而你代码中明明传入的是int[],大概率是旧代码残留(之前用byte[]的版本)未编译更新导致的。此外,你调用的linesMat.convertTo(linesMat, CvType.CV_32S)是多余操作:HoughLinesP返回的Mat本身就是CV_32S深度,convertTo仅修改深度、不改变通道数,所以执行后仍然是CV_32SC4类型。

解决方案

1. 确保代码编译更新

  • 清理Unity项目的编译缓存(Library/ScriptAssemblies目录),重新编译项目,确保运行的是最新代码(使用int[]接收数据的版本)。

2. 移除多余的类型转换

删除linesMat.convertTo(linesMat, CvType.CV_32S);这一行,因为HoughLinesP已经返回符合要求的CV_32S深度矩阵。

3. 优化数据读取方式(推荐)

HoughLinesP的输出是每行对应一条线的4个坐标,逐行读取更直观且不易出错,替代直接读取整个数组的方式:

private void GetCrossCorners()
{   
    List<int[]> linesList = new List<int[]>();
    // 逐行读取每条线的坐标
    for (int i = 0; i < linesMat.rows(); i++)
    {
        int[] lineCoords = new int[4];
        linesMat.get(i, 0, lineCoords);
        linesList.Add(lineCoords);
    }
    
    // 如需转为一维数组,可执行以下操作
    int[] linesArray = linesList.SelectMany(line => line).ToArray();
    // 后续处理逻辑...
}

4. 调试验证Mat类型(可选)

添加调试代码确认Mat的参数是否符合预期:

private void GetCrossCorners()
{   
    Debug.Log($"linesMat类型码: {linesMat.type()}");
    Debug.Log($"linesMat深度: {CvType.depth(linesMat.type())}"); // 应为4(对应CV_32S)
    Debug.Log($"linesMat通道数: {CvType.channels(linesMat.type())}"); // 应为4
    
    // 后续读取逻辑...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:05:16