优秀的zhang-suen细化+灰度重心法
先用zhang-suen细化对激光光条做细化,然后在使用灰度重心法可以达到亚像素提取,精度还是可以的,但是对我的数据集不是很友好,代码是看其他博主的,代码可以参考代码连接----------论文连接
上代码
#include<opencv2/core/core.hpp>
#include<opencv2/calib3d/calib3d.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
using namespace cv;
//-------------------------------------------zhang细化算法----------------------------------------------//
void zhang(Mat& input, Mat& output)
{
Mat copymat;
input.copyTo(copymat);
int k = 0;
//防止溢出
while (1)
{
k++;
bool stop = false;
//step1
for (int i = 1; i < input.cols - 1; i++)
for (int j = 1; j < input.rows - 1; j++)
{
if (input.at<uchar>(j, i) > 0)
{
int p1 = int(input.at<uchar>(j, i)) > 0 ? 1 : 0;
int p2 = int(input.at<uchar>(j - 1, i)) > 0 ? 1 : 0;
int p3 = int(input.at<uchar>(j - 1, i + 1)) > 0 ? 1 : 0;
int p4 = int(input.at<uchar>(j, i + 1)) > 0 ? 1 : 0;
int p5 = int(input.at<uchar>(j + 1, i + 1)) > 0 ? 1 : 0;
int p6 = int(input.at<uchar>(j + 1, i)) > 0 ? 1 : 0;
int p7 = int(input.at<uchar>(j + 1, i - 1)) > 0 ? 1 : 0;
int p8 = int(input.at<uchar>(j, i - 1)) > 0 ? 1 : 0;
int p9 = int(input.at<uchar>(j - 1, i - 1)) > 0 ? 1 : 0;
int np1 = p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9;
int sp2 = (p2 == 0 && p3 == 1) ? 1 : 0;
int sp3 = (p3 == 0 && p4 == 1)