下面是你提供的 detect_trt
函数添加了 Doxygen 标准注释的版本,注释使用中文:
/**
* @brief 使用 TensorRT 进行目标检测的主函数。
*
* 此函数初始化参数,设置输入源(图片、视频或摄像头),加载 YOLO 模型,并在一个循环中读取输入帧,
* 进行推理和后续处理。
*
* @return int 返回值为 -1 表示出现错误,正常结束时返回0。
*/
int detect_trt() {
utils::InitParameter param; ///< 初始化参数对象
utils::InputStream source; ///< 输入流类型
source = utils::InputStream::IMAGE; ///< 设置默认输入源为图片
std::string model_path = TRT_MODEL_PATH; ///< 模型路径
std::string image_path = TRT_IMAGE_PATH; ///< 图像路径
std::string video_path = TRT_VIDEO_PATH; ///< 视频路径
int camera_id = TRT_camera_id; ///< 摄像头 ID, 默认值为 0
int total_batches = TRT_total_batches; ///< 总批次数量,默认值为 0
int delay_time = TRT_delay_time; ///< 延迟时间,默认值为 1ms
cv::VideoCapture capture; ///< 视频捕获对象
bool is_show = true; /// 是否显示结果的标志
bool is_save = true; /// 是否保存结果的标志
setParameters(param); /// 设置参数
// 设置输入源并读取数据,如果失败则返回错误码 -1
if (!setInputStream(source, image_path, video_path, camera_id,
capture, total_batches, delay_time, param)) {
sample::gLogError << "read the input data errors!" << std::endl;
return -1;
}
YOLOV8 yolo(param); // 创建 YOLO 对象并传入参数
// 读取模型文件到 trt_file 向量中
std::vector<unsigned char> trt_file = utils::loadModel(model_path);
// 检查模型文件是否为空,如为空则记录错误并返回 -1
if (trt_file.empty()) {
sample::gLogError << "trt_file is empty!" << std::endl;
return -1;
}
// 初始化模型,如果初始化失败则记录错误并返回 -1
if (!yolo.init(trt_file)) {
sample::gLogError << "initEngine() ocur errors!" << std::endl;
return -1;
}
yolo.check(); // 检查模型有效性
cv::Mat frame; // 用于存储当前帧图像的 Mat 对象
std::vector<cv::Mat> imgs_batch; // 批量图像存储向量
imgs_batch.reserve(param.batch_size); // 预留批量大小空间以提高效率
sample::gLogInfo << imgs_batch.capacity() << std::endl;
int batchi = 0; // 当前批次索引计数器
// 循环直到捕获设备关闭或达到总批次限制
while (capture.isOpened())
{
if (batchi >= total_batches && source != utils::InputStream::CAMERA)
{
break; // 达到总批次数且不是摄像头模式,则退出循环
}
if (imgs_batch.size() < param.batch_size) { // 如果尚未填满一个批次
if (source != utils::InputStream::IMAGE)
{
capture.read(frame); // 从视频源读取一帧图像
}
else
{
frame = cv::imread(image_path); // 从指定路径读取静态图像
}
if (frame.empty()) {
sample::gLogWarning << "no more video or camera frame" << std::endl;
task(yolo, param, imgs_batch, delay_time, batchi, is_show, is_save); // 执行任务处理已读到的图像批次
imgs_batch.clear(); // 清空已处理的图像批次
batchi++; // 增加批次计数器
break;
}
else {
imgs_batch.emplace_back(frame.clone()); // 将当前帧加入待处理的图像批次中
}
}
else {
task(yolo, param, imgs_batch, delay_time, batchi, is_show, is_save); // 执行任务处理完整的一批图像数据
imgs_batch.clear(); // 清空已处理的图像批次
batchi++; // 增加批次计数器
}
}
return -1; /// 返回错误代码,因为循环终止条件可能是因为捕捉设备关闭或其他原因
}
上述代码中添加了详细的注释,符合 Doxygen 的标准格式,有助于理解代码逻辑和功能。如果你有其他需要修改或者添加的信息,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问