基于C++和OpenCV的中心线提取算法
基于C++和OpenCV的中心线提取算法加权平方灰度重心法介绍算法演示加权平方灰度重心法介绍详情见 https://blog.csdn.net/u010518385/article/details/101015604算法演示下面展示 函数-输入图像和阈值,输出点。void get_median_line(Mat& src, int thresh, vector<Point2d>
·
基于C++和OpenCV的中心线提取算法
加权平方灰度重心法介绍
详情见 https://blog.csdn.net/u010518385/article/details/101015604
算法演示
下面展示 函数-输入图像和阈值,输出点
。
void get_median_line(Mat& src, int thresh, vector<Point2d>& points){
if (src.empty())
return;
// 一、图像处理
Mat filterImg;
cvtColor(src, src, CV_BGR2GRAY); // 原图像如果是RGB3通道图像,需要变化为灰度图像
blur(src, filterImg, Size(5, 5), Point(-1, -1)); // 均值滤波
// 二、提取中心线
for (int j = 0; j < filterImg.cols; ++j){
double sum_value = 0.0;
double sum_value_coor = 0.0;
vector<double> current_value;
vector<double> current_value_coor;
for (int i = 0; i < filterImg.rows; ++i){
double current = filterImg.ptr<uchar>(i)[j];
// 将符合阈值的点的灰度值和纵坐标存入数组
if (current > thresh){
current_value.push_back(current);
current_value_coor.push_back(i);
}
}
// 计算灰度重心
for (int k = 0; k < current_value.size(); ++k){
sum_value_coor += pow(current_value[k], 2) * current_value_coor[k];
sum_value += pow(current_value[k], 2);
}
double y = sum_value_coor / sum_value;
Point2d point(j, 0); // 默认纵坐标为 0
if (y < filterImg.rows && y > 0){
point.y = y; // 纵坐标存在则存入 point
}
points.push_back(point);
current_value.clear(); // 清空临时数组
current_value_coor.clear();
}
}
更多推荐
所有评论(0)