Transformações Afins 2D no Halcon: Implementação Prática

O processo típico envolve:

  1. Inicializar uma matriz identidade usando o operador hom_mat2d_identity, que gera a matriz padrão [1.0, 0.0, 0.0, 0.0, 1.0, 0.0];
  2. Aplicar transformações específicas como hom_mat2d_translate, hom_mat2d_rotate ou hom_mat2d_scale para modificar a matriz, permitindo combinações ou repetições;
  3. Executar a transformação resultante em imagens, regiões ou contornos XLD usando operadroes como affine_trans_image, affine_trans_region ou affine_trans_contour_xld.

Os operadores principais têm as seguintes assinaturas:

  • hom_mat2d_translate( : : MatrizEntrada, DeslocamentoX, DeslocamentoY : MatrizSaida)
  • hom_mat2d_rotate( : : MatrizEntrada, Angulo, CentroX, CentroY : MatrizSaida)
  • hom_mat2d_scale( : : MatrizEntrada, FatorEscalaX, FatorEscalaY, CentroX, CentroY : MatrizSaida)

Abaixo, um exemplo demonstra a aplicação desses operadores em uma imagem de teste. O código inclui comentários explicativos sobre cada etapa.

read_image (Imagem, 'exemplo.jpg') threshold (Imagem, Area, 0, 200) opening_circle (Area, Area, 1.5) connection (Area, RegioesConectadas) select_shape_std (RegioesConectadas, RegiaoSelecionada, 'max_area', 70) area_center (RegiaoSelecionada, Atributo, LinhaRef, ColunaRef) dev_set_draw ('margin')

  • Aplicação de translação: deslocamento em Linha e Coluna dev_display (Imagem) disp_cross (3600, LinhaRef, ColunaRef, 10, 40) hom_mat2d_identity (MatrizBase) hom_mat2d_translate (MatrizBase, 30, 150, MatrizTranslacao) affine_trans_region (Area, AreaTransformada, MatrizTranslacao, 'nearest_neighbor')

  • Aplicação de rotação: ângulo em radianos, centro em (LinhaRef, ColunaRef) dev_display (Imagem) disp_cross (3600, LinhaRef, ColunaRef, 10, 40) hom_mat2d_rotate (MatrizBase, rad(20), LinhaRef, ColunaRef, MatrizRotacao) affine_trans_region (Area, AreaTransformada, MatrizRotacao, 'nearest_neighbor')

  • Aplicação de escala: fatores em Linha e Coluna, centro em (LinhaRef, ColunaRef) dev_display (Imagem) disp_cross (3600, LinhaRef, ColunaRef, 10, 40) hom_mat2d_scale (MatrizBase, 2.0, 1.05, LinhaRef, ColunaRef, MatrizEscala) affine_trans_region (Area, AreaTransformada, MatrizEscala, 'nearest_neighbor')


</div>O operador `vector_angle_to_rigid` oferece uma abordagem alternativa, combinando rotação e translação em uma única chamada. Sua assinatura é:

`vector_angle_to_rigid( : : OrigemLinha, OrigemColuna, AnguloOrigem, DestinoLinha, DestinoColuna, AnguloDestino : MatrizResultado)`

Este operador primeiro rotaciona a imagem em torno de (OrigemLinha, OrigemColuna) pelo ângulo (AnguloDestino - AnguloOrigem), e depois translada o ponto de origem para (DestinoLinha, DestinoColuna). Se os pontos de origem e destino coincidirem, equivale a uma rotação pura.

<div>```

read_image (Imagem, 'exemplo.jpg')
PontoLinha := 100
PontoColuna := 200
dev_display (Imagem)

for Iteracao := 1 to 150 by 1
    vector_angle_to_rigid (PontoLinha, PontoColuna, 0, PontoLinha, PontoColuna, rad(10), Matriz)
    disp_cross (3600, 100, 200, 10, 40)
    affine_trans_image (Imagem, ImagemRotacionada, Matriz, 'nearest_neighbor', 'false')
    copy_image (ImagemRotacionada, Imagem)
endfor

read_image (Imagem, 'dinamico.png') binary_threshold (Imagem, Regiao, 'max_separability', 'dark', Usado) dev_set_draw ('margin') connection (Regiao, RegioesConectadas) select_shape_std (RegioesConectadas, RegiaoPrincipal, 'max_area', 70) area_center (Imagem, AtributoImg, LinhaImg, ColunaImg)

rotate_image (Imagem, ImagemRotacionada, -90, 'constant') area_center (ImagemRotacionada, AtributoRot, LinhaRot, ColunaRot)

hom_mat2d_identity (MatrizInicial) hom_mat2d_rotate (MatrizInicial, -rad(90), LinhaImg, ColunaImg, MatrizRotacao) hom_mat2d_translate (MatrizRotacao, LinhaRot - LinhaImg, ColunaRot - ColunaImg, MatrizFinal) affine_trans_region (RegiaoPrincipal, RegiaoAjustada, MatrizFinal, 'constant')


</div>Observação: ao usar `rotate_image` com ângulos que não são múltiplos de 90°, apenas a rotação é aplicada sem translação adicional.

</div>

Tags: Halcon transformações afins processamento de imagens matrizes homogêneos operadores de geometria

Publicado em 6-28 09:49