void Caliper::SearchCaliperPath() { assert(!input_image_.empty() && input_image_.channels() == 1); //1. 初始化卡尺路径直线方程 angle = std::atan(k); // b = y - kx b = center.y - k * center.x; //2. 求取搜索起始点 min_x = center.x - len * std::cos(angle) * 0.5; if (min_x < 0) return; max_x = center.x + len * std::cos(angle) * 0.5; //3. 从起始点搜索,保存卡尺路径点集 path.clear(); pathPixelValue.clear(); // y = kx + b; double y = 0; for (int i = static_cast<int>(min_x); i < static_cast<int>(max_x); ++i) { y = i * k + b; path.push_back(cv::Point2d(i, y)); pathPixelValue.push_back(input_image_.at<uchar>(static_cast<int>(y), i)); } }//SearchCaliperPath 用opencvsharp4.6编写函数
时间: 2024-02-14 11:35:43 浏览: 74
这是一个使用 OpenCVSharp 4.6 编写的函数,用于搜索卡尺路径。具体来说:
1. 首先检查输入图像是否为空且通道数为1。
2. 初始化卡尺路径的直线方程,其中 k 表示斜率,b 表示截距。斜率 k 的计算采用 std::atan 函数,截距 b 的计算采用中心点坐标和斜率 k。
3. 求取搜索起始点,即卡尺路径的左右端点。左端点 min_x 的计算采用中心点坐标、卡尺长度 len 和角度 angle 计算得出。如果 min_x 小于0,则直接返回。右端点 max_x 的计算与 min_x 相似。
4. 从起始点开始搜索卡尺路径,保存路径点集和像素值。具体来说,从 min_x 到 max_x 循环,对于每个 x 坐标,计算出对应的 y 坐标(y = kx + b),然后将该点加入路径点集 path 中,并在输入图像中取出该点的像素值,加入 pathPixelValue 中。
注意,函数中使用的 Point2d 和 uchar 类型都是 OpenCVSharp 中定义的数据类型。
相关问题
void Caliper::DifferenceFilter(const size_t &_filterSize) { std::vector<int> filter(2 * _filterSize + 1, 1); for (size_t i = 0; i < _filterSize; ++i) { filter[i] = -1; filter[2 * _filterSize - i] = -1; } filter[_filterSize] = 0; pathPixelValueAfterFilter.assign(pathPixelValue.begin(), pathPixelValue.end()); for (size_t j = _filterSize; j < pathPixelValue.size() - _filterSize; ++j) { double sum = 0.0; for (size_t i = 0; i < filter.size(); ++i) { sum += pathPixelValue.at(j - _filterSize + i) * filter.at(i); } pathPixelValueAfterFilter.at(j) = static_cast<int>(sum); } }请用 OpenCvSharp4.6来编写成c#代码
以下是使用 OpenCvSharp4.6 编写的 C# 代码版本:
```csharp
using OpenCvSharp;
using System.Collections.Generic;
class Caliper
{
public List<int> pathPixelValue;
public List<int> pathPixelValueAfterFilter;
public void DifferenceFilter(int filterSize)
{
List<int> filter = new List<int>(2 * filterSize + 1);
for (int i = 0; i < filterSize; ++i)
{
filter.Add(-1);
filter.Add(1);
}
filter.Add(0);
pathPixelValueAfterFilter = new List<int>(pathPixelValue);
for (int j = filterSize; j < pathPixelValue.Count - filterSize; ++j)
{
double sum = 0.0;
for (int i = 0; i < filter.Count; ++i)
{
sum += pathPixelValue[j - filterSize + i] * filter[i];
}
pathPixelValueAfterFilter[j] = (int)sum;
}
}
}
```
这段代码与原始代码的实现基本一致,主要区别在语法上。C# 中的 List 类似于 C++ 中的 vector,但是需要使用 new 进行实例化。C# 中没有自动类型转换,需要使用强制类型转换,例如 `(int)sum`。此外,在 C# 中,变量名需要使用驼峰命名法。
使用 OpenCvSharp4.6 实现的代码 差分滤波 void Caliper::DifferenceFilter(const size_t &_filterSize) { //1. 构造滤波核: [-1,-1...0...1,1] std::vector<int> filter(2 * _filterSize + 1, 1); for (size_t i = 0; i < _filterSize; ++i) { filter[i] = -1; } filter[_filterSize] = 0; //2. 滤波核滑动滤波,逐一相乘求和(省去反转的一维卷积) pathPixelValueAfterFilter.clear(); pathPixelValueAfterFilter.assign(pathPixelValue.begin(), pathPixelValue.end()); for (size_t j = _filterSize; j < pathPixelValue.size() - _filterSize; ++j) { double sum = 0.0; for (size_t i = 0; i < filter.size(); ++i) { sum += pathPixelValue.at(j - _filterSize + i) * filter.at(i); } pathPixelValueAfterFilter.at(j) = static_cast<int>(sum); } };//DifferenceFilter
这段代码实现了差分滤波(Difference Filter),使用了 OpenCvSharp4.6 库。具体实现过程如下:
1. 构造滤波核,该滤波核是一个长度为 2*_filterSize+1 的一维向量,向量中心是 0,左边是 -1,右边是 1。
2. 对输入的数据 pathPixelValue 进行滤波,滤波过程是滑动滤波,即从第 _filterSize 个元素开始,逐一将滤波核与数据相乘,再求和,得到滤波后的结果,将结果存储在 pathPixelValueAfterFilter 向量中。
需要注意的是,在滤波过程中,为了避免在边缘处出现“越界”的情况,只对 pathPixelValue 的第 _filterSize 到第 pathPixelValue.size() - _filterSize 个元素进行滤波。
阅读全文
相关推荐















