21. Detecção de linha transformada em linha reta Hough

1. Conteúdo principal

  • Introdução à Transformação de Linha Hough
  • Aprendizado relacionado à API

2. Introdução à Transformação da Linha Hough

  • Hough Line Transform é usado para transformação linear

  • Detecção e conclusão de borda de pré-requisitos

  • Conversão do espaço plano para o espaço de coordenadas polares

  • Através da transformação de Hough, podemos detectar uma forma geométrica regular. O princípio é converter cada ponto de coordenadas retangulares em espaço de coordenadas polares através da mudança de coordenadas polares para formar uma curva.A posição da interseção das curvas na imagem, pensamos São os pontos na mesma linha reta e, em seguida, calculamos as coordenadas polares desses pontos para o espaço de coordenadas retangulares através da fórmula.
    Insira a descrição da imagem aqui

  • r é a distância. Com x0 e y0 inalterados, obtemos um valor de r para cada teta determinado. Nesse momento, obtemos a curva da relação entre cada ângulo e r 'na Figura 1.
    Insira a descrição da imagem aqui

  • Nesse momento, movemos x0, y0 um para a frente e, em seguida, localizamos as coordenadas polares da função, theta er, e repetimos a operação continuamente para obter o resultado mostrado na Figura 2. Essas curvas se cruzam em um ponto, indicando que todos os nossos pixels pertencem à mesma linha reta.
    Insira a descrição da imagem aqui

  • De acordo com a figura dois, o ângulo e o diâmetro polar do ponto de interseção da curva são levados à fórmula a seguir para calcular de volta ao espaço do plano, inserir x diferente e obter y diferente.
    Os pontos de coordenadas obtidos são retidos na imagem e excluídos se não estiverem na imagem.
    Insira a descrição da imagem aqui

  • Pergunta: Como você sabe que este é o ponto de interseção na imagem?
    Resposta: Adicione 1 aos dados pelos quais cada curva passa, porque os dados na interseção são os mais altos e o ponto é o mais brilhante.
    Insira a descrição da imagem aqui

  • Para todos os pontos em qualquer linha reta, transforme em coordenadas polares, do espaço [0 · 360], você pode obter o tamanho de r. Pontos pertencentes à mesma linha no espaço de coordenadas polares [r, theta] devem ter o sinal mais forte (a interseção) em um ponto, e as coordenadas de pixel de cada ponto na linha podem ser obtidas calculando-se inversamente as coordenadas do plano. Assim, obtendo uma linha reta.

  • Transformação de coordenadas planas em espaço Hough (coordenadas polares)
    Insira a descrição da imagem aqui

3. Aprendizado relacionado à API

  • A transformação Hough padrão cv :: HoughLines é convertida de coordenadas planas em espaço Hough, e a saída final é (threta, r) ​​representando um espaço de coordenadas polares.
  • Probabilidade de linha reta de transformação de Hough cv;; saída final HoughLinesP é dois pontos da linha reta (x0, y0, x1, y1)

4. Aprendizagem relevante da API

  • cv ;; HonghLines
cv::HoughLine(
    InputArray src,   //输入图像,必须8—bit的灰度图像
    OutputArray lines,//输出的极坐标来表示直线
    double rho, //生成极坐标的时候像素扫描步长(极坐标空间中r的最大值),一般取值1
    double theta,//生成极坐标的时候的角度扫描步长,一般取值CV_PI/180,每次移动一度
    int threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线
    double srn = 0,//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换(此处的多尺度参考图像金字塔的相关知识)
    double stn = 0.//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
    double min_theta = 0,//表示角度扫描范围0-180度之间,默认即可
    double max_theta = CV_PI
)//一般是有经验的开发者使用,需要自己反变换到平面空间
  • cv :: HonghLinesP
cv::HoughLineP(
    InputArray src,   //输入图像,必须8—bit的灰度图像
    OutputArray lines,//输出的极坐标来表示直线
    double rho, //生成极坐标的时候像素扫描步长
    double theta,//生成极坐标的时候的角度扫描步长,一般取值CV_PI/180
    int threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线
    double minlineLength = 0,//最小直线长度
    double maxLineGap = 0,//最大间隔,比较重要的一个参数
    )//自动反算到平面空间

Efeito de detecção HonghLinesP
Insira a descrição da imagem aqui

  • Código de demonstração
//先进行边缘检测
imshow("原图像",src);
Canny(src,src_gray,150,200,3);
cvtColor(src_gray,dst,CV_GRAY2BGR);
//霍夫直线检测
vector<Vec4f>plines;//将我们霍夫变换得到的结果存放到这个数据中
HonghLinesP(src_gray,plines,1,CV_PI/180,10,0,10);
for(size_t i = 0;i < plines.size();i++){
    Vec4f  h1 = plines[i];
    line(dst,Point(h1[0],h1[1]),Point(h1[2],h1[3]),Scalar(0,0,255),3,LINE_AA);
}  
imshow("输出图像",dst);

Função 5.line

void  line(
    Mat& img, //要绘制线段的图像
    Point pt1,//线段的起点
    Point pt2,//线段的终点
    const Scalar& color,//线段的颜色,通过一个Scalar对象定义
    int thickness = 1,//线条的宽度
    int linetType = 8,
    //线条的类型。可以取值8,4,和CV_AA,
    //分别代表8邻接连接线、4邻接连接线和反锯齿连接线
   // 默认值为8邻接连接线,为了获得更好的效果可以选用CV_AA(采用了高斯滤波)
    int shift = 0 //坐标点小数点位数
)

Exemplos:

line(frame,beginPoint,endPoint,Scalar(0,0,255),2)
//画一条直线,起点为beginPoint,终点为endPoint,颜色是红色,线宽为2,shift是默认值

6. Expansão extracurricular


A diferença entre o tipo de dados size_t OpenCV CV_RGB2GRAY e a instalação e uso do plug-in CV_BGR2GRAY
OpenCV Image Watch

Publicado 66 artigos originais · ganhou elogios 53 · vista 6812

Acho que você gosta

Origin blog.csdn.net/qq_43367829/article/details/105423785
Recomendado
Clasificación