opencvsharp4.6中 delta.X = deltaPoint.At<double>(0, 0); “MatExpr”未包含“At”的定义,并且找不到可接受第一个“MatExpr”类型参数的可访问扩展方法“At”(是否缺少 using 指令或程序集引用?)
时间: 2023-09-28 15:09:54 浏览: 42
这个问题可能是因为在OpenCvSharp 4.6中,MatExpr类不支持At方法。MatExpr类是用于OpenCV表达式的类,它不是用于访问像素值的类。
如果你想要访问像素值,请使用Mat类或其子类,例如Mat_<double>。你可以通过以下代码获取像素值:
```
delta.X = deltaPoint.At<double>(0, 0);
```
替换为:
```
delta.X = deltaPoint.Get<double>(0, 0);
```
这个方法是用于获取像素值的,它可以用于Mat类和Mat_<T>类的对象。
如果你确实需要使用MatExpr类,请确保你已经正确地包含OpenCvSharp库,并且使用了正确的命名空间。如果你仍然无法解决这个问题,请提供更多的代码和错误信息,以便我更好地帮助你解决问题。
相关问题
opencvsharp4.6中 delta.X = deltaPoint.At<double>(0, 0); 也不接受delta.X = deltaPoint.Get<double>(0, 0); “MatExpr”未包含“At”的定义,并且找不到可接受第一个“MatExpr”类型参数的可访问扩展方法“At”(是否缺少 using 指令或程序集引用?)
根据您提供的信息,我推测您可能是在使用OpenCvSharp 4.6的MatExpr类来访问像素值,但是MatExpr类并不支持At方法。实际上,MatExpr是一个用于OpenCV表达式计算的类,而不是用于像素操作的类。
如果您需要访问像素值,可以使用OpenCvSharp的Mat类或其子类,例如Mat_<T>。您可以使用以下代码来获取像素值:
```
delta.X = deltaPoint.Get<double>(0, 0);
```
如果上述代码仍然无法正常编译,请检查您的代码是否正确引用了OpenCvSharp库,并且使用了正确的命名空间。如果您仍然无法解决问题,请提供更多的代码和错误信息,以便我更好地帮助您解决问题。
// 极值点评分 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; } }//ExtremePointRating 基于opencvsharp4.6 请优化代码,生成新的函数
为了优化代码,可以考虑以下几个方面:
1. 减少不必要的类型转换
在原有代码中,存在如下的类型转换:
```
int halfLen = static_cast<int>(path.size() / 2);
```
可以改为使用整数除法运算符 `/`,避免类型转换的开销:
```
int halfLen = path.size() / 2;
```
2. 避免不必要的容器复制
在原有代码中,存在如下的容器复制操作:
```
std::vector<ExtremPointInfo> epf(extremePoints.begin(), extremePoints.begin() + 3);
```
可以改为直接使用 `std::array`,避免不必要的容器复制:
```
std::array<ExtremPointInfo, 3> epf = {extremePoints[0], extremePoints[1], extremePoints[2]};
```
3. 使用 lambda 表达式简化代码
在原有代码中,使用了函数指针作为 `sort` 函数的比较函数:
```
sort(extremePoints.begin(), extremePoints.end(), CompareExtremPointInfoBysocre);
sort(epf.begin(), epf.end(), CompareExtremPointInfoByPs);
```
可以改为使用 lambda 表达式,使代码更加简洁:
```
sort(extremePoints.begin(), extremePoints.end(), [](const ExtremPointInfo& a, const ExtremPointInfo& b) { return a.score > b.score; });
sort(epf.begin(), epf.end(), [](const ExtremPointInfo& a, const ExtremPointInfo& b) { return a.ps > b.ps; });
```
基于以上优化,可以得到如下的新函数:
```
void Caliper::ExtremePointRatingOptimized()
{
if (extremePoints.empty())
return;
// 评分: value * (1 - |i - 0.5 * le| / 0.5 * len)
int halfLen = 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(), [](const ExtremPointInfo& a, const ExtremPointInfo& b) { return a.score > b.score; });
result.peak = extremePoints[0].pt;
if (extremePoints.size() == 1)
{
result.center = result.front = result.back = extremePoints[0].pt;
return;
}
if (extremePoints.size() == 2)
{
int a = std::abs(extremePoints[0].ps - halfLen);
int b = std::abs(extremePoints[1].ps - halfLen);
if (a > b)
{
result.front = result.back = extremePoints[0].pt;
result.center = extremePoints[1].pt;
}
else
{
result.front = result.back = extremePoints[1].pt;
result.center = extremePoints[0].pt;
}
}
else
{
std::array<ExtremPointInfo, 3> epf = {extremePoints[0], extremePoints[1], extremePoints[2]};
// 降序
sort(epf.begin(), epf.end(), [](const ExtremPointInfo& a, const ExtremPointInfo& b) { return a.ps > b.ps; });
result.back = epf[0].pt;
result.center = epf[1].pt;
result.front = epf[2].pt;
}
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)