opencv cnn 模块 detection 返回的四维数组在mat中的排列
时间: 2023-11-27 10:52:15 浏览: 190
在 OpenCV 的 CNN 模块中,detection 函数返回的四维数组在 Mat 中是按照以下方式排列的:
- 第一维:表示检测到的目标个数。
- 第二维:表示每个目标的类别数。
- 第三维:表示每个目标的边界框数。对于单个目标,通常只有一个边界框。
- 第四维:包含目标的信息,包括类别、置信度以及边界框的坐标。
因此,可以使用以下代码访问检测到的第一个目标的第一个边界框的类别、置信度和边界框坐标:
```
cv::Mat detection_result; // 存储 detection 函数返回的四维数组
int class_id = detection_result.at<float>(0, 0, 0, 1); // 获取类别编号
float confidence = detection_result.at<float>(0, 0, 0, 2); // 获取置信度
cv::Rect bbox(detection_result.at<float>(0, 0, 0, 3), detection_result.at<float>(0, 0, 0, 4), detection_result.at<float>(0, 0, 0, 5), detection_result.at<float>(0, 0, 0, 6)); // 获取边界框坐标
```
相关问题
opencv cnn 模块 detection 返回的四维数组在mat中 但是mat本身是个二维数组
在 OpenCV 的 C++ 接口中,CNN 模块的 detection 函数返回的是一个四维数组(通常是 BatchSize x NumClasses x MaxNumDetections x 7),其中第一个维度表示批处理大小,第二个维度表示类别数,第三个维度表示每张图像最多检测到的目标数,第四个维度表示检测到的目标的属性信息。但是,OpenCV 的 Mat 类型是一个二维数组,因此需要将四维数组转换为 Mat 类型才能进行后续的操作。
具体的转换方法如下:
```c++
// 假设 detection 函数返回的四维数组为 detections
cv::Mat detectionsMat(detections.size[0] * detections.size[2], 7, CV_32F);
for (int i = 0; i < detections.size[0]; ++i) {
for (int j = 0; j < detections.size[2]; ++j) {
for (int k = 0; k < 7; ++k) {
detectionsMat.at<float>(i * detections.size[2] + j, k) = detections.at<float>(i, 0, j, k);
}
}
}
```
这里使用了一个大小为 BatchSize x MaxNumDetections x 7 的 Mat 类型 detectionsMat 来存储四维数组 detections。首先使用三重循环将 detections 中的数据复制到 detectionsMat 中。在 detectionsMat 中,第一维度表示批处理中所有图像的所有检测结果,第二维度表示每个检测结果的属性信息。
opencv cnn 模块 detection 返回的四维数组在mat中 循环获取每个人脸的信息
OpenCV中的CNN模块可以用来进行对象检测,其中返回的四维数组表示了检测到的对象的位置和置信度信息。如果你想获取每个人脸的信息,可以按照以下步骤进行:
1. 遍历返回的四维数组,找到所有置信度大于一个阈值的人脸位置信息。
```
float confThreshold = 0.5; // 置信度阈值
for (int i = 0; i < detections.size[2]; ++i)
{
float confidence = detections.at<float>(0, 0, i, 2);
if (confidence > confThreshold)
{
// 处理此人脸位置信息
}
}
```
2. 对于每个满足条件的人脸位置信息,从四维数组中获取其位置和大小信息,并将其转换为OpenCV的Rect类型。
```
int xLeftBottom = static_cast<int>(detections.at<float>(0, 0, i, 3) * frame.cols);
int yLeftBottom = static_cast<int>(detections.at<float>(0, 0, i, 4) * frame.rows);
int xRightTop = static_cast<int>(detections.at<float>(0, 0, i, 5) * frame.cols);
int yRightTop = static_cast<int>(detections.at<float>(0, 0, i, 6) * frame.rows);
Rect faceRect(xLeftBottom, yLeftBottom, xRightTop - xLeftBottom, yRightTop - yLeftBottom);
```
3. 可以将人脸位置信息保存到一个数组或容器中,以便后续使用。
```
vector<Rect> faces; // 存储所有人脸位置信息
faces.push_back(faceRect); // 将当前人脸位置信息加入数组中
```
这样,你就可以获取到所有检测到的人脸的位置和大小信息,并进行后续处理。
阅读全文