void Tracker::pruning(Detection &selected_detections, std::vector<int> &final_select, std::vector<track_ptr> &tacks_in) { // TODO const uint &TrackSize = tacks_in.size(); const uint &detSize = selected_detections.size(); final_select.resize(detSize); cv::Mat assigmentsBin = cv::Mat::zeros(cv::Size(detSize, TrackSize), CV_32SC1); cv::Mat costMat = cv::Mat(cv::Size(detSize, TrackSize), CV_32FC1); // cosmatrix (cols rows) std::vector<int> assignments; std::vector<float> costs(detSize * TrackSize); for (uint i = 0; i < TrackSize; ++i) { for (uint j = 0; j < detSize; ++j) { costs.at(i + j * TrackSize) = euclideanDist(selected_detections[j].position, tracks_[i]->GetState()); costMat.at<float>(i, j) = costs.at(i + j * TrackSize); } } // std::cout<<"######## pruning costMat ############### \n"<<costMat<<" \n"<<std::endl; AssignmentProblemSolver APS; // 匈牙利算法 APS.Solve(costs, TrackSize, detSize, assignments, AssignmentProblemSolver::optimal); const uint &assSize = assignments.size(); // 这个的大小应该是检测结果的大小,里边对应的是目标的编号 for (uint i = 0; i < assSize; ++i) { if (assignments[i] != -1 && costMat.at<float>(i, assignments[i]) < 0.8) { assigmentsBin.at<int>(i, assignments[i]) = 1; } } const uint &rows = assigmentsBin.rows; const uint &cols = assigmentsBin.cols; std::vector<bool> choosen(detSize, false); std::vector<bool> trackchoosen(TrackSize, false); for (uint i = 0; i < rows; ++i) { for (uint j = 0; j < cols; ++j) { if (assigmentsBin.at<int>(i, j)) { final_select[j] = tacks_in[i]->GetId(); trackchoosen[i] = true; tracks_[i]->UpdateBox(selected_detections[j]); tracks_[i]->UpdateMeasure(selected_detections[j].position(0), selected_detections[j].position(1)); choosen[j] = true; } } } for (int i = 0; i < choosen.size(); ++i) { if (!choosen[i]) { not_associated_.push_back(selected_detections[i]); } } for (int i = 0; i < trackchoosen.size(); ++i) { if (!trackchoosen[i]) { tracks_[i]->MarkMissed(); } } // std::cout<<"######## pruning not asso ###############"<<not_associated_.size()<<std::endl; }
时间: 2024-04-28 17:23:33 浏览: 12
这段代码实现了目标跟踪的一个重要步骤:匹配检测结果和已有跟踪目标。具体来说,它通过计算每个检测结果和每个跟踪目标之间的欧式距离,构建了一个代价矩阵,然后使用匈牙利算法求解最小代价匹配。匹配成功的检测结果与跟踪目标之间建立一一对应关系,并更新跟踪目标的状态和位置;未匹配成功的检测结果被标记为未关联的目标,未匹配成功的跟踪目标被标记为漏检目标。最终,函数返回匹配成功的目标编号列表和未匹配成功的检测结果列表。需要注意的是,这段代码中使用了OpenCV中的Mat类来处理代价矩阵,其中使用了CV_32SC1和CV_32FC1两种数据类型。
相关问题
error:file tracker_service.c,line:2089 如何解决
这个错误通常是由于文件系统中某些文件或目录的权限问题引起的。您可以尝试以下方法来解决:
1. 检查文件或目录的权限是否正确,确保您有足够的权限访问它们。
2. 如果您正在使用 Linux 系统,请尝试执行以下命令,以确保文件系统没有损坏:
```
fsck /dev/sda1
```
其中 /dev/sda1 是您的文件系统所在的设备。
3. 如果您正在使用 Windows 系统,请尝试运行磁盘扫描和修复工具来修复文件系统中的错误。
如果上述方法都无法解决问题,建议您查看该文件的代码并进一步调试。
AttributeError: module 'dlib' has no attribute 'correlation_tracker'
根据提供的引用内容,你遇到的错误是"AttributeError: module 'dlib' has no attribute 'correlation_tracker'"。这个错误通常发生在使用dlib库时,尝试访问一个不存在的属性或方法时。可能的原因是你的dlib库版本过低,或者你的代码中存在拼写错误。
为了解决这个问题,你可以尝试以下几个步骤:
1. 确保你已经正确安装了dlib库。你可以使用以下命令检查dlib库的版本:
```shell
python -c "import dlib; print(dlib.__version__)"
```
如果你的版本过低,可以考虑升级dlib库到最新版本。
2. 检查你的代码中是否存在拼写错误。确保你正确地引用了dlib库中的`correlation_tracker`属性。你可以参考dlib的官方文档或示例代码来确保正确使用该属性。
3. 如果以上步骤都没有解决问题,可能是因为你的dlib库版本与你的代码不兼容。你可以尝试更新dlib库到最新版本,或者查看dlib的官方文档以了解是否有关于`correlation_tracker`的更改或替代方法。
希望以上解决方案能帮助你解决问题!如果你还有其他问题,请随时提问。