// 极值点评分 void Caliper::ExtremePointRating() { if(extremePoints.empty()) return; // 评分: value * (1 - |i - 0.5 * le| / 0.5 * len) int halfLen = static_cast<int>(path.size() / 2); for(auto& e: extremePoints) { e.score = e.value * (1 - static_cast<double>(std::abs(e.ps - halfLen)) / halfLen); } //按评分排序:降序 sort(extremePoints.begin(), extremePoints.end(), CompareExtremPointInfoBysocre); result.peak = extremePoints.at(0).pt; if(extremePoints.size() == 1) { result.center = result.front = result.back = extremePoints.at(0).pt; return; } if(extremePoints.size() == 2) { int a = std::abs(extremePoints.at(0).ps - halfLen); int b = std::abs(extremePoints.at(1).ps - halfLen); if(a > b) { result.front = result.back = extremePoints.at(0).pt; result.center = extremePoints.at(1).pt; }else { } }else { std::vector<ExtremPointInfo> epf(extremePoints.begin(), extremePoints.begin() + 3); sort(epf.begin(), epf.end(), CompareExtremPointInfoByPs);//降序 result.back = epf.at(0).pt; result.center = epf.at(1).pt; result.front = epf.at(2).pt; } }
时间: 2024-02-14 12:36:02 浏览: 60
这段代码看起来是C++,它是用来进行极值点评分的。这个函数首先检查是否存在极值点,如果没有则直接返回。接着,对每个极值点进行评分,评分的公式为 value * (1 - |i - 0.5 * le| / 0.5 * len),其中 value 为极值点的数值,i 为极值点在整个路径上的位置,le 为路径的长度,len 为路径长度的一半。评分后,将所有极值点按照评分从高到低排序。然后根据极值点的数量,分别处理三种情况:如果只有一个极值点,则将其作为 peak、front、back 和 center;如果有两个极值点,则将评分较高的作为 center,评分较低的作为 front 和 back;如果有三个或更多极值点,则取评分最高的作为 back,评分第二高的作为 center,评分第三高的作为 front。最后将结果保存在 result 结构体中。
相关问题
OpenCvSharp4.6 编写的 C# 代码版本 // 求取极值点 void Caliper::FindExtremePoint() { // 1. 检查搜索路径像素数据是否为空 if(pathPixelValueAfterFilter.empty()) return; // 2. 遍历滤波后的数据,查找极值点 extremePoints.clear(); switch (polarity) { // 不考虑极性 case 0 : for(size_t i = 1; i < pathPixelValueAfterFilter.size() - 1; ++i) { // 两边异号为极值点 if (size_t(std::abs(pathPixelValueAfterFilter.at(i))) >= contrastThreshold && (0 > (pathPixelValueAfterFilter.at(i) - pathPixelValueAfterFilter.at(i - 1)) * (pathPixelValueAfterFilter.at(i + 1) - pathPixelValueAfterFilter.at(i))) ) { extremePoints.push_back(ExtremPointInfo(path.at(i), static_cast<int>(i), static_cast<int>(pathPixelValueAfterFilter.at(i)))); } } break; // 黑到白 case 1 : for(size_t i = 1; i < pathPixelValueAfterFilter.size() - 1; ++i) { // 两边异号为极值点 if (pathPixelValueAfterFilter.at(i) > 0 && size_t(std::abs(pathPixelValueAfterFilter.at(i))) >= contrastThreshold && (0 > (pathPixelValueAfterFilter.at(i) - pathPixelValueAfterFilter.at(i - 1)) * (pathPixelValueAfterFilter.at(i + 1) - pathPixelValueAfterFilter.at(i))) ) { extremePoints.push_back(ExtremPointInfo(path.at(i), static_cast<int>(i), static_cast<int>(pathPixelValueAfterFilter.at(i)))); } } break; // 白到黑 case -1: for(size_t i = 1; i < pathPixelValueAfterFilter.size() - 1; ++i) { // 两边异号为极值点 if (pathPixelValueAfterFilter.at(i) < 0 && size_t(std::abs(pathPixelValueAfterFilter.at(i))) >= contrastThreshold && (0 > (pathPixelValueAfterFilter.at(i) - pathPixelValueAfterFilter.at(i - 1)) * (pathPixelValueAfterFilter.at(i + 1) - pathPixelValueAfterFilter.at(i))) ) { extremePoints.push_back(ExtremPointInfo(path.at(i), static_cast<int>(i), static_cast<int>(pathPixelValueAfterFilter.at(i)))); } } break; default: assert(false); break; }
这段代码是用于在图像中搜索极值点的,主要包括以下步骤:
1. 检查搜索路径像素数据是否为空;
2. 遍历滤波后的数据,查找极值点;
3. 根据极性类型分别处理不同的情况,包括不考虑极性、黑到白和白到黑;
4. 找到极值点后将其信息保存到 `extremePoints` 中。
其中,`pathPixelValueAfterFilter` 是经过滤波后的搜索路径像素数据,`contrastThreshold` 是对比度的阈值,`path` 是搜索路径的像素坐标,`polarity` 是极性类型。
阅读全文
相关推荐

















