OpenCV中Mat索引操作含义及Python目标检测代码转Java问询
OpenCV目标检测Python转Java核心问题解答
1. detections[0, 0, i, 2]的作用、索引含义及是否为ROI
- 作用:提取当前检测框的置信度(模型判断目标存在的概率),用来过滤置信度低于阈值的无效检测结果。
- 四个索引的具体含义:
- 第一个
0:对应模型输出的批次维度,这里只输入了单张图片,批次号固定为0。 - 第二个
0:对应模型的检测输出层,SSD类目标检测模型通常只有一个检测结果输出层,所以固定为0。 - 第三个
i:当前遍历的第i个候选检测框,也就是所有检测结果中的第i个目标框。 - 第四个
2:检测框数据中的置信度字段位置,每个检测框的结构化数据为[批次ID, 类别ID, 置信度, 框起始x, 框起始y, 框结束x, 框结束y],索引2正好对应置信度数值。
- 第一个
- 是否为ROI:不是。ROI指的是感兴趣区域(即目标框的坐标范围),这个值只是一个概率数值,和区域无关。
2. 该行代码的Java转换
Java中OpenCV的Mat是多维数组结构,需要用get()方法获取指定位置的浮点值,代码如下:
// detections为net.forward()返回的4维float类型Mat float confidence = detections.get(0, 0, i, 2)[0];
注:get()方法返回对应位置的通道值数组,这里检测结果是单通道,所以取数组第0位元素。
3. box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])的含义及Java转换
代码含义
detections[0, 0, i, 3:7]:提取第i个检测框的归一化坐标,四个值依次是[起始x比例, 起始y比例, 结束x比例, 结束y比例],这些值的范围是0-1,是相对于图片宽高的比例值。* np.array([w, h, w, h]):将归一化坐标分别乘以图片的实际宽度w和高度h,把比例值转换成图片上的绝对像素坐标,这样才能用于绘制检测框。
Java转换代码
Java没有Python那样的切片语法,需要手动提取每个坐标值再计算:
// 提取四个归一化坐标值 float xStartNorm = detections.get(0, 0, i, 3)[0]; float yStartNorm = detections.get(0, 0, i, 4)[0]; float xEndNorm = detections.get(0, 0, i, 5)[0]; float yEndNorm = detections.get(0, 0, i, 6)[0]; // 转换成绝对像素坐标(w为图片宽度,h为图片高度) int startX = (int) (xStartNorm * w); int startY = (int) (yStartNorm * h); int endX = (int) (xEndNorm * w); int endY = (int) (yEndNorm * h);
或者用循环简化提取过程:
float[] normBox = new float[4]; // 提取索引3到6的四个归一化坐标 for (int j = 0; j < 4; j++) { normBox[j] = detections.get(0, 0, i, 3 + j)[0]; } // 转换为像素坐标 int startX = (int) (normBox[0] * w); int startY = (int) (normBox[1] * h); int endX = (int) (normBox[2] * w); int endY = (int) (normBox[3] * h);
内容的提问来源于stack exchange,提问作者Mich
相关产品推荐
相关产品推荐

