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

