知道cv::rect 求非极大值抑制
时间: 2023-08-08 22:01:20 浏览: 122
非极大值抑制(Non-Maximum Suppression)是一种在计算机视觉中常用的技术,用于减少物体检测算法中的重叠框。在使用OpenCV库时,可以使用cv::rect代表矩形框。
要实现非极大值抑制,需要以下几个步骤:
1. 读取所有的矩形框,并根据其对应的置信度进行排序,从置信度高的到低的。
2. 选择置信度最高的矩形框,并将其添加到最终的输出列表中。
3. 遍历剩余的矩形框,与已选择的矩形框进行比较,如果存在重叠部分大于一定阈值的情况,则将该矩形框从候选列表中删除。
4. 重复步骤3,直到遍历完所有的矩形框。
5. 最终,输出的列表中将只包含没有被抑制的矩形框。
在实现非极大值抑制时,可以使用cv::rect的成员函数来方便地获取矩形框的坐标和尺寸等信息,并使用OpenCV提供的函数来计算两个矩形框之间的重叠部分。
需要注意的是,在具体实现时需要根据具体的算法细节来进行调整,比如选择合适的置信度阈值和重叠部分的阈值。这些参数的选择将会影响最终的非极大值抑制效果。
通过以上步骤,您就可以使用cv::rect和OpenCV库来实现非极大值抑制,从而减少物体检测算法中的重叠框,得到更准确的检测结果。
相关问题
cv::dnn::NMSBoxes 的非dnn版本
cv::dnn::NMSBoxes是OpenCV中深度学习模块(dnn)中提供的一种非极大值抑制(NMS)的函数,用于去除检测结果中的重复框。如果不使用OpenCV的深度学习模块,可以通过以下代码实现非dnn版本的NMSBoxes函数:
```
void NMSBoxes(const std::vector<cv::Rect>& boxes, const std::vector<float>& scores, float score_threshold, float nms_threshold, std::vector<int>& indices) {
// 将boxes和scores打包成一个结构体数组
struct BoxWithScore {
cv::Rect box;
float score;
};
std::vector<BoxWithScore> boxes_with_scores;
for (int i = 0; i < boxes.size(); i++) {
boxes_with_scores.push_back({ boxes[i], scores[i] });
}
// 按照得分从高到低排序
std::sort(boxes_with_scores.begin(), boxes_with_scores.end(), [](const BoxWithScore& a, const BoxWithScore& b) {
return a.score > b.score;
});
// 执行NMS
indices.clear();
for (int i = 0; i < boxes_with_scores.size(); i++) {
if (boxes_with_scores[i].score < score_threshold) {
break;
}
bool keep = true;
for (int j = 0; j < indices.size(); j++) {
if (keep) {
int overlap_area = (boxes_with_scores[i].box & boxes_with_scores[indices[j]].box).area();
int union_area = boxes_with_scores[i].box.area() + boxes_with_scores[indices[j]].box.area() - overlap_area;
keep = overlap_area * 1.0 / union_area <= nms_threshold;
}
else {
break;
}
}
if (keep) {
indices.push_back(i);
}
}
}
```
以上代码仅供参考,实际的实现可能会有所不同,具体实现方式可能因模型和框架而异。
std::vector<int> nms_result; cv::dnn::NMSBoxes(boxes, confidences, CONF_THRESHOLD, NMS_THRESHOLD, nms_result); std::vector<cv::Mat> temp_mask_proposals; std::vector<OutputSeg> output; Rect holeImgRect(0, 0, src.cols, src.rows); for (int i = 0; i < nms_result.size(); ++i) { int idx = nms_result[i]; OutputSeg result; result.id = classIds[idx]; result.confidence = confidences[idx]; result.box = boxes[idx]& holeImgRect; output.push_back(result); temp_mask_proposals.push_back(picked_proposals[idx]); }什么意思
这段代码是一个目标检测算法的一部分,它使用非极大值抑制(NMS)来筛选出具有高置信度的目标框。首先,它调用了cv::dnn::NMSBoxes函数,该函数会根据指定的阈值将置信度低于阈值的目标框过滤掉,并将保留的目标框的索引存储在nms_result向量中。
然后,通过遍历nms_result向量,获取每个保留目标框的索引。接下来,创建一个OutputSeg结构体变量result,将目标类别id、置信度和经过修剪的目标框赋值给result。然后,将result添加到output向量中,并将对应的临时掩码提案添加到temp_mask_proposals向量中。
最后,将经过筛选后的结果存储在output向量中,并将对应的临时掩码提案存储在temp_mask_proposals向量中。整个过程旨在选择具有高置信度的目标框,并将与之相关的信息存储到output和temp_mask_proposals中以供后续使用。
阅读全文