std::vector<std::array<int, 3>> res什么意思
时间: 2023-09-24 10:09:32 浏览: 82
`std::vector<std::array<int, 3>> res` 是定义了一个名为 `res` 的变量,它是一个 `std::vector` 容器,存储了一组长度为 3 的 `std::array`。
在这个定义中,`std::array<int, 3>` 表示一个长度为 3 的 `array`,其中的元素类型为 `int`。`std::vector<std::array<int, 3>>` 表示一个存储了多个长度为 3 的 `array` 的向量,每个 `array` 中的元素都是 `int` 类型。
所以,`std::vector<std::array<int, 3>> res` 的意思是创建了一个向量 `res`,用于存储多个长度为 3 的数组,每个数组中的元素类型为 `int`。在这段代码中,`res` 被用来存储一些特定条件下的结果。
相关问题
这段代码怎么绘制框doInference(*trt->context, trt->stream, trt->buffers, trt->data, trt->prob, BATCH_SIZE); std::vector<std::vector<Yolo::Detection>> batch_res(1); auto& res = batch_res[0]; nms(res, &trt->prob[0 * OUTPUT_SIZE], CONF_THRESH, NMS_THRESH); int len = res.size(); // 结果数组 float(*res_array)[6] = new float[len][6]; // 得到所有目标的数据 for (size_t j = 0; j < res.size(); j++) { cv::Rect r = get_rect(img, res[j].bbox); res_array[j][0] = r.x; res_array[j][1] = r.y; res_array[j][2] = r.width; res_array[j][3] = r.height; res_array[j][4] = res[j].class_id; res_array[j][5] = res[j].conf;
这段代码是目标检测算法输出结果的处理代码,通过调用 nms() 函数对检测结果进行非极大值抑制,得到筛选后的检测结果。然后,对每个检测结果,使用 get_rect() 函数获取对应物体的边界框,将边界框的坐标和大小存储在 res_array 数组中。如果需要在图像上绘制检测框,可以使用 OpenCV 的 rectangle() 函数,将边界框的坐标和大小作为参数传递给该函数即可。
写下这段代码怎么绘制框doInference(*trt->context, trt->stream, trt->buffers, trt->data, trt->prob, BATCH_SIZE); std::vector<std::vectorYolo::Detection> batch_res(1); auto& res = batch_res[0]; nms(res, &trt->prob[0 * OUTPUT_SIZE], CONF_THRESH, NMS_THRESH); int len = res.size(); // 结果数组 float(*res_array)[6] = new float[len][6]; // 得到所有目标的数据 for (size_t j = 0; j < res.size(); j++) { cv::Rect r = get_rect(img, res[j].bbox); res_array[j][0] = r.x; res_array[j][1] = r.y; res_array[j][2] = r.width; res_array[j][3] = r.height; res_array[j][4] = res[j].class_id; res_array[j][5] = res[j].conf;
这段代码是目标检测算法输出结果的处理代码,如果需要在图像上绘制检测框,可以按照以下步骤进行:
1. 遍历结果数组中的每个目标,获取目标的坐标和大小信息:
```c++
for (size_t j = 0; j < res.size(); j++) {
cv::Rect r = get_rect(img, res[j].bbox);
float x = r.x;
float y = r.y;
float w = r.width;
float h = r.height;
int class_id = res[j].class_id;
float conf = res[j].conf;
// ...
}
```
2. 计算边界框的四个顶点坐标:
```c++
float left = x - w / 2;
float top = y - h / 2;
float right = x + w / 2;
float bottom = y + h / 2;
```
3. 使用 OpenCV 的 rectangle() 函数绘制边界框:
```c++
cv::rectangle(img, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 255, 0), 2);
```
其中,cv::Scalar(0, 255, 0) 表示绘制框的颜色,2 表示绘制框的线宽。
完整代码如下:
```c++
doInference(*trt->context, trt->stream, trt->buffers, trt->data, trt->prob, BATCH_SIZE);
std::vector<std::vector<Yolo::Detection>> batch_res(1);
auto& res = batch_res[0];
nms(res, &trt->prob[0 * OUTPUT_SIZE], CONF_THRESH, NMS_THRESH);
int len = res.size();
// 结果数组
float(*res_array)[6] = new float[len][6];
// 得到所有目标的数据
for (size_t j = 0; j < res.size(); j++) {
cv::Rect r = get_rect(img, res[j].bbox);
float x = r.x;
float y = r.y;
float w = r.width;
float h = r.height;
int class_id = res[j].class_id;
float conf = res[j].conf;
// 计算边界框的四个顶点坐标
float left = x - w / 2;
float top = y - h / 2;
float right = x + w / 2;
float bottom = y + h / 2;
// 绘制边界框
cv::rectangle(img, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 255, 0), 2);
}
```
阅读全文