修改这段代码绘制边框位置不对=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); 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 = r.x - r.width / 2; float top = r.y - r.height / 2; float right = r.x + r.width / 2; float bottom = r.y + r.height / 2; // 绘制边界框 cv::rectangle(img, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 255, 0), 2); }
时间: 2024-03-09 15:50:01 浏览: 106
你修改的代码中依然存在问题。假设原来的矩形左上角坐标为 $(x_0, y_0)$,宽度为 $w$,高度为 $h$,则矩形中心点的坐标应该是 $(x_0 + w/2, y_0 + h/2)$,因此计算边框四个顶点坐标的代码应该修改为:
```
// 计算边界框的四个顶点坐标
float left = x - w / 2;
float top = y - h / 2;
float right = x + w / 2;
float bottom = y + h / 2;
```
另外,如果你的矩形坐标是浮点型,那么在 `cv::rectangle` 函数中应该传入 `cv::Point2f` 类型的参数,具体代码如下:
```
// 绘制边界框
cv::rectangle(img, cv::Point2f(left, top), cv::Point2f(right, bottom), cv::Scalar(0, 255, 0), 2);
```
最后,不要忘记在使用完 `res_array` 后释放内存:
```
delete[] res_array;
```
相关问题
这段代码输出坐标位置不对= 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;
这段代码的功能是根据目标检测的结果,获取目标的位置信息和置信度。其中,函数`doInference`是用来推理模型的,它将输入数据`trt->data`传入模型,得到输出结果`trt->prob`。然后,对于每个检测到的目标,都可以通过`get_rect`函数获取其在原图中的位置,并使用这些位置信息和置信度等信息,填充一个二维数组`res_array`。在这段代码中,变量`x`和`y`表示目标框左上角在原图中的横坐标和纵坐标,变量`w`和`h`表示目标框的宽度和高度,变量`class_id`表示目标所属的类别,变量`conf`表示目标检测的置信度。但是,如果输出坐标位置不对,可能是`get_rect`函数的实现有问题,或者输入数据`trt->data`或输出数据`trt->prob`的格式不正确。需要进一步排查问题。
这段代码绘制边框位置不对=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 = r.x - r.width / 2; float top = r.y - r.height / 2; float right = r.x + r.width / 2; float bottom = r.y + r.height / 2; // 绘制边界框 cv::rectangle(img, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 255, 0), 2); }
这段代码中绘制边框位置不对的原因可能在于计算边框四个顶点坐标时使用了矩形左上角的坐标,而应该使用中心点坐标,因为矩形左上角的坐标可能与中心点坐标不一致。可以尝试修改代码如下:
```
// 计算边界框的四个顶点坐标
float left = x - w/2;
float top = y - h/2;
float right = x + w/2;
float bottom = y + h/2;
```
另外,建议在使用完 `res_array` 后及时释放空间,避免内存泄漏。可以在最后加上以下代码:
```
delete[] res_array;
```
阅读全文