Correspondência de modelo baseada em forma (baseada em forma)

  • É chamado de correspondência com base no gradiente de direção da borda e é o algoritmo de correspondência de modelo mais comumente usado e de última geração.

(1) Pensamentos Fundamentais

  • Usando a correlação de gradiente da borda do objeto como critério de correspondência

(2) Princípio

  • Extraia recursos de borda no ROI, crie um modelo com base em informações em escala de cinza e gere um modelo de pirâmide de imagem de vários níveis com base nos requisitos de tamanho e clareza do modelo.

  • Em seguida, pesquise a imagem do modelo camada por camada na camada da pirâmide de imagens, de cima para baixo, até que a camada inferior seja pesquisada ou um resultado de correspondência confirmado seja obtido.

(3) Condições de uso

  • Este método usa recursos de borda para localizar objetos e é insensível a muitos fatores de interferência, como iluminação e alterações na escala de cinza da imagem. Ele pode até suportar modelos com perda local de borda, cenas desordenadas, ruído, fora de foco e leve deformação.

  • Além disso, pode até suportar vários modelos a serem pesquisados ​​simultaneamente.

  • Mas não é adequado para situações de grande rotação e dimensionamento

(4) Operador de correspondência de forma

 /*
 1.创建形状模型:create_shape_model()
 2.寻找形状模型:find_shpae_model()
 3.释放形状模型:clear_shape_model()
 */

(5) Exemplos

1. Crie a área ROI e prepare a imagem do modelo para criar o modelo (o modelo pode ser salvo após criá-lo)

  • Formas padrão: draw_rectangle1/2, draw_circle, draw_ellipse, draw_line

  • Formas arbitrárias: draw_region, draw_polygon

  • Gere ROI padrão: gen_rectangle1/2, gen_circle, gen_ellipse, gen_region_line

  • Crie AOI por meio de XLD: gen_region_contour_xld, gen_region_polygon_xld

  • Use area_center() para encontrar o centro desta área ROI

  • Obtenha esta área de ROI da imagem através de reduzir_domain()

2. Correção de ROI, melhorando a qualidade da imagem por meio de pré-processamento para encontrar um modelo de imagem mais adequado

  • Funções de correção: erosão (reduzir ROI), dilatação (expandir ROI), shape_trans (conversão de forma), limite (limite de nível de pixel), move_region (mover região para novo local)

  • Combinação: intersecção, diferença, união2 (união de duas áreas)

3. Crie modelos diretamente

 create_shape_model(Template , // 模板图像
                    NumLevels, // 金字塔层数
                    AngleStart, // 起始角度
                    AngleExtent, // 角度范围
                    AngleStep, // 角度步长
                    Optimization, // 设置模板优化和模板创建方法
                    Metric, // 匹配方法设置
                    Contrast, // 模板中前景与背景的对比度
                    MinContrast, // 被查找图片的最小对比度
                    ModelID) // 模板ID
 // 可缩放比例
 create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
                    
 create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 0, 0.8, 1.0, 0, ['none','no_pregeneration'], 'ignore_global_polarity', 40, 10, ModelID)
  • Use o operador determine_shape_model_params para obter o número de camadas da pirâmide e, em seguida, use o operador inspecionar_shape_model para testar se o valor de contraste é razoável.

  • Depois de criar o modelo, você precisa monitorar o modelo , o que é feito usando o operador inspecionar_shape_model para detectar a aplicabilidade dos parâmetros e encontrar parâmetros adequados.

  • Após a execução do operador, a imagem de classificação em pirâmide dos parâmetros predefinidos será exibida. Você pode avaliar se a seleção do parâmetro é razoável de acordo com suas necessidades. 

  inspect_shape_model(Image : // 输入参数,输入图像
                     ModelImages, // 输出参数,输出图像基于金字塔的影像
                     ModelRegions : // 输出参数,输出模型区域
                     NumLevels, // 输入参数,使用的金字塔层数。默认4,范围1~10
                     Contrast : ) // 输入参数,设置对比度。默认30,参考10,20,30,40,60,80,100,120,140,160

(1)Números

  • Começa com o primeiro nível e adiciona +1 a cada nível.

  • Quanto menor a pirâmide, mais informações detalhadas e posicionamento mais preciso, mas também consome mais tempo; quanto maior a pirâmide, menos tempo leva para encontrar uma correspondência.

  • Além disso, deve-se garantir que a imagem de nível superior contenha informações suficientes (pelo menos quatro pontos). Se a pirâmide for muito grande e o modelo não for fácil de identificar, você precisa definir os parâmetros MinScore e Greediness na função find_shape_model mais abaixo (preste atenção na solução aqui!!!)

  • Se houver poucas mensagens no nível mais alto da pirâmide, o algoritmo reduzirá automaticamente o número de níveis da pirâmide.

  • Se houver pouca informação na base da pirâmide, a função reportará um erro

  • Se definido como automático, o algoritmo calculará automaticamente o número de camadas da pirâmide . Podemosvisualizar o número de camadas da pirâmide por meio da função get_shape_model_params .

 // 根据创建的模型ID来查看形状模型的参数
 get_shape_model_params( : : ModelID : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)
 // ScaleMin, ScaleMax, ScaleStep是模型的最小比例、最大比例、缩放步长

(2)Contraste

  • O contraste é usado para medir a diferença local do valor de cinza entre o alvo e o fundo e entre diferentes partes do alvo.

  • Quando 1 elemento: 128, contraste, extraia as bordas diretamente

  • Quando existem 2 elementos: [100, 128], significa usar o algoritmo de limite de histerese para segmentar e extrair arestas.

  • Quando existem 3 elementos: [100, 128, 10], os dois primeiros parâmetros são iguais a 2 e o último parâmetro indica que o comprimento mínimo da aresta extraída é 10

  • O limite de contraste pode ser determinado automaticamente usando a função determine_shape_model_params ou o efeito pode ser verificado usando a função inspecionar_shape_mode antes de chamar create_shape_model

 determine_shape_model_params(Template, // 模板 
                              ‘auto’, // 金字塔层数
                              0, // 起始角度
                              rad(360), // 角度范围
                              0.9, // 缩小范围
                              1.1, // 放大范围
                              ‘auto’, // 减少像素的方法
                              ‘use_polarity’, // 极性
                              ‘auto’, // 对比度
                              ‘auto’, // 最小对比度
                              'all', // 需要自动确定的参数
                              ParameterName, // Name of values
                              ParameterValue) // Values

(3)AngleStart,AngleExtent,AngleStep

  • A seleção de AngleStep é baseada no tamanho do alvo. Se a imagem do modelo for muito pequena, ela não poderá gerar muitas imagens com diferentes ângulos discretos. Portanto, para imagens de modelo menores, AngleStep deve ser definido como maior.

  • Se AngleExtent não for um múltiplo inteiro de AngleStep, AngleStep será modificado de acordo.

  • Passo Ângulo

    • Critérios de seleção: Quanto maior for o modelo, menor será o passo angular; quanto menor for o modelo, maior será o passo angular.

    • Velocidade e memória: Quanto menor o tamanho do passo, mais memória é ocupada e mais lenta é a velocidade de posicionamento.

    • Se não houver requisitos especiais, selecione "automático" para permitir que o sistema faça a melhor escolha e defina automaticamente um passo angular apropriado com base no tamanho do modelo.

(4) Otimização

  • Configurar métodos de otimização e criação de modelos

  • Alguns modelos contêm muitos pixels, o que resulta em tamanho excessivo do modelo, aumento do tempo de execução e aumento dos requisitos de memória.

  • O parâmetro Otimização é utilizado para reduzir esses pontos. Nas mesmas condições, o tempo de execução é reduzido por sua vez.

    • nenhum, sem redução de pixels

    • point_reduction_low, cerca de meio ponto

    • point_reduction_medium, cerca de 1/3

    • point_reduction_high, cerca de 1/4

  • Para imagens de modelo particularmente grandes, é muito útil definir o parâmetro Otimização com um valor diferente de 'none' ; para modelos menores, reduzir o número de pontos do modelo não melhora a velocidade de pesquisa.

  • Se o número de pontos do modelo diminuir , o parâmetro Ganância deve ser definido com um valor relativamente pequeno na função find_shape_model ,  como: 0,7, 0,8

  • Se a Otimização estiver definida como 'auto', create_shape_model determinará automaticamente o número de pontos para o modelo

  • Além de reduzir pixels, este parâmetro também pode controlar a forma como os modelos são criados para escolher prioridade de memória ou prioridade de velocidade.

  • O segundo valor pode ser opcional entre os dois seguintes

    • 'pré-geração', o modelo é criado antecipadamente, sacrificando memória pela velocidade de pesquisa

    • 'no_pregeneration', cria os dados necessários apenas durante a pesquisa, ocupa menos memória

  • O padrão é a configuração do sistema

     set_system('pregenerate_shape_models','true'/'false')
  • Se não for definido, o padrão é

     set_system('pregenerate_shape_models','false')

(5)Métrica

  • Condições para correspondência de modelos em imagens

    • use_polarity: Os objetos na imagem têm o mesmo contraste do modelo (o primeiro plano é claro e o fundo é escuro, portanto, apenas os objetos que são mais brilhantes que o fundo podem ser encontrados)

    • ignore_global_polarity: O alvo também pode ser encontrado quando o contraste entre os dois é completamente oposto (o alvo também pode ser encontrado se o alvo for mais escuro que o fundo)

    • ignore_local_polarity: O modelo pode ser encontrado mesmo se o contraste local mudar (este modo é muito útil quando o alvo contém uma parte de cinza médio, e parte dele é mais clara e parte é mais escura)

  • Como o tempo de execução da função find_shape_model aumenta significativamente neste modo, a melhor abordagem é usar create_shape_model para criar vários modelos que reflitam as possíveis alterações de contraste do alvo e usar find_shape_models para combiná-los.

(6)MinContraste

  • Para separar o modelo do ruído da imagem, se a faixa de flutuação do valor de cinza for 10, então MinContrast = 10

  • As bordas da imagem do modelo não são necessariamente benéficas. Ruído e textura causarão bordas prejudiciais. Bordas prejudiciais levarão a posicionamento impreciso ou pesquisa errada, pontuações erradas e aumentarão ligeiramente o tempo de pesquisa.

  • O parâmetro MinContrast é usado para reduzir arestas "prejudiciais" ao procurar modelos.

  • Este valor pode ser determinado por meio da função estimativa_ruído, função inspecionar_forma_model e assistente

(7) Nota: Crie modelos através de arquivos Dxf (Format Exchange File)

  •  Os modelos podem ser criados diretamente a partir de contornos de pixels

create_scaled_shape_model_xld
create_aniso_shape_model_xld

4. É necessário obter o esboço deste modelo para posterior correspondência.

 get_shape_model_contours(ModelContours, // 输出形状模型的轮廓表示
                          ModelID, // 模型句柄
                          Level) // 金字塔层数

5. Correspondência de modelos para obter informações de posição, ângulo, valor de escala e pontuação

  • Encontre o modelo que melhor corresponde na imagem e retorne o comprimento, a largura e o ângulo de rotação de uma instância do modelo

 find_shape_model(Image, // 搜索图像
                  ModelID, // 模板句柄
                  AngleStart, // 搜索时的起始角度
                  AngleExtent, // 搜索时的角度范围,必须与创建模板时的有交集
                  MinScore, // 最小匹配值,输出的匹配的得分Score大于该值
                  NumMatches, // 定义要输出的匹配的最大个数
                  MaxOverlap, // 当找到的目标存在重叠时,且重叠大于该值时选择一个好的输出
                  SubPixel, // 计算精度的设置,五种模式,多选2,3
                  NumLevels, // 搜索时金字塔的层数
                  Greediness, // 贪婪度,搜索启发式,一般都设为0.9,越高速度快,容易出现找不到的情况
                  Row, Column, Angle, Score) // 输出匹配位置的行和列坐标、角度、得分(模板在搜索图像中可见比例的近似测量,如果模板的一半被遮挡,该值就不能超过0.5)
  • Os parâmetros afetam a velocidade e a precisão da correspondência

(1) Pontuação mínima

  • Qual é o coeficiente de qualidade mínimo necessário para que a correspondência de modelos encontre o modelo na imagem?

  • Quanto maior for o MinScore definido, mais semelhante ele será e mais rápida será a pesquisa.

  • Se o modelo não estiver ocluído na imagem, o MinScore pode ser definido como 0,8 ou até 0,9

(2)NumMatches

  • Encontre o número máximo de modelos na imagem

  • Se o número de destinos com um coeficiente de qualidade correspondente maior que MinScore for maior que NumMatches, somente os locais de destino NumMatches com os melhores coeficientes de qualidade serão retornados. Se os alvos correspondentes encontrados não forem NumMatches suficientes, apenas os poucos encontrados serão retornados.

  • O parâmetro MinScore é melhor que NumMatche

(3) Sobreposição Máxima

  • O parâmetro MaxOverlap está entre 0 e 1 e define o coeficiente máximo de sobreposição entre as duas áreas alvo encontradas, para que possam ser retornadas como duas áreas alvo diferentes.

  • Se as duas áreas alvo encontradas se sobrepuserem e forem maiores que MaxOverlap, somente aquela com o melhor efeito será retornada.

  • O método de cálculo da sobreposição baseia-se em encontrar o menor retângulo envolvente em qualquer direção da área alvo (ver menor_retângulo2). Se MaxOverlap=0, as áreas alvo encontradas não podem se sobrepor. Se MaxOverlap=1, todas as áreas alvo encontradas deverão ser retornadas.

(4)SubPixel

  • Determine se o alvo encontrado é extraído com precisão de subpixel, geralmente definido como interpolação

  • Modelo de controle de precisão

    • nenhum: nenhum subpixel é usado, o erro máximo é meio pixel

    • interpolação: a posição e o ângulo são precisos em subpixels. Neste modo, a posição do modelo é interpolada na função de coeficiente de massa, o que quase não leva tempo de cálculo e atinge uma precisão suficientemente alta.

    • mínimos_quadrados, mínimos_quadrados_alto, mínimo_quadrados_muito_alto: precisão de subpixel de mínimos quadrados

  • O impacto dos diferentes modos no tempo de execução: os dois primeiros levam o mesmo tempo, mas o método dos mínimos quadrados leva mais tempo

  • Este parâmetro pode afetar os seguintes resultados: Posição, Ângulo, Escala

(5) NumNíveis

  • Se NumLevels=0, use o número de níveis da pirâmide ao criar o modelo

  • NumLevels também pode conter um segundo parâmetro, que define o número mínimo de níveis de pirâmide nos quais os modelos correspondentes são encontrados.

  • Por exemplo, NumLevels=[4,2] significa que a correspondência começa no quarto nível da pirâmide e a correspondência é encontrada no segundo nível da pirâmide (o mais baixo é definido como 1)

  • Você pode usar este método para reduzir o tempo de execução da correspondência, mas a precisão da posição neste modo é menor do que no modo normal. O chamado modo normal é a correspondência na parte inferior da pirâmide.

  • Portanto, se for necessária maior precisão, o SubPixel deverá ser definido como pelo menos 'least_squares'. Se o nível mais baixo da pirâmide for definido como muito grande, a precisão desejada poderá não ser alcançada ou uma região de correspondência incorreta poderá ser encontrada. Isso ocorre porque os modelos em níveis mais altos da pirâmide não são específicos o suficiente para encontrar as melhores correspondências de modelos confiáveis. Neste caso, o número mínimo de níveis da pirâmide deve ser definido para o valor mínimo

(6) Ganância

  • Este parâmetro é utilizado para aceleração de posicionamento, o que afeta muito a velocidade de busca.

  • Se for 0, é uma busca heurística; se for 1, é uma busca insegura.

  • Quanto menor o valor, mais lenta é a velocidade; quanto maior o valor, maior a chance de perder o alvo.

  • Valor recomendado: 0,7 ~ 0,9

6. Converter após correspondência de modelo (não perfeito)

(1)vetor_ângulo_para_rígido()

  • Calcula uma transformação afim de corpo rígido a partir de um ponto e ângulo

(2)affine_trans_contour_xld()

 for i:=0 to |Score|-1 by 1
     // 得到对应匹配目标的旋转矩阵
     vector_angle_to_rigid (0, 0, 0, Row[i], Column[i], Angle[i], HomMat2DRotate)
     // 在旋转矩阵的基础上添加缩放量,生成新的矩阵
     hom_mat2d_scale (HomMat2DRotate, Scale[i], Scale[i], Row[i],Column[i], HomMat2DScale)
     // 矩阵变换(xld基础上)
     affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)
     // xld转换成region
     gen_region_contour_xld (ContoursAffineTrans, Region, 'filled')
     // 对区域,生成最小外接矩形
     smallest_rectangle1 (Region, Row1, Column1, Row2, Column2)
     // 使用绿色矩形框,框选匹配结果
     dev_set_color ('green')
     disp_rectangle1 (WindowHandle, Row1[0], Column1[0], Row2[0], Column2[0])
     // 使用红色勾画匹配结果轮廓
     dev_set_color ('red')
     dev_display (ContoursAffineTrans)
     // 显示各匹配结果提示语
     disp_message (WindowHandle, '第'+(i+1)+'个', 'window', Row1[0]-30, (Column1[0]+Column2[0])/2-10, 'green', 'false')
 endfor

7. Como acelerar a correspondência de pesquisa?

  • Contanto que a partida seja bem-sucedida, aumente o valor do parâmetro MinScore tanto quanto possível

  • Aumente o valor da Ganância até que uma partida falhe, enquanto diminua o valor do MinScore, se necessário

  • Ao criar uma imagem, aumente o número de níveis da pirâmide

  • Limite o intervalo de rotação permitido e o intervalo de tamanho e ajuste os parâmetros correspondentes ao chamar find_shape_model()

  • Tente limitar o valor da área de ROI de pesquisa

8. Exemplos

(1) Linhas de grade

 // 关闭程序计数器,变量更新,图像窗口更新
 dev_update_off ()
 dev_close_window ()
 ​
 // 读取模版图像
 read_image (Image, 'wafer/wafer_mirror_dies_01')
 dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
 set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
 // 定义输出区域,轮廓的线宽
 dev_set_line_width (3)
 dev_display (Image)
 ​
 // 这个过程会在屏幕右下角显示“Click 'Run' to continue”。
 disp_continue_message (WindowHandle, 'black', 'true')
 stop()
 ​
 // 创建剪切矩形ROI作为模板图像
 gen_rectangle1 (Rectangle, 362, 212, 414, 262)
 reduce_domain (Image, Rectangle, ImageReduced)
 ​
 // 根据金字塔数和对比度获取输入图像的金字塔图像、金字塔区域
 inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)
 // 显示金字塔各层级的图像,以检查层数的合理性
 dev_display(ModelRegions)
 area_center(ModelRegions, AreaModelRegions, RowModelRegions, ColumnModelRegions)
 count_obj(ModelRegions, Number)
 // 确定金字塔的层级
 for i := 1 to Number by 1
     if(AreaModelRegions[i-1]>=10)
         NumLevels := i
     endif
 endfor
 ​
 // 创建形状模版
 create_shape_model (ImageReduced, NumLevels, rad(0), rad(1), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
 // 获得模型轮廓,中心点在原点位置
 get_shape_model_contours (ModelContours, ModelID, 1)
 ​
 // 开始在搜索图像中搜索模版
 for Index := 1 to 4 by 1
     read_image (Image, 'wafer/wafer_mirror_dies_' + Index$'02')
     // 计算当前过去的时间,单位是秒
     count_seconds (S1)
     // 使用匹配算子进行形状模板匹配
     find_shape_model (Image, ModelID, rad(0), rad(1), 0.5, 0, 0.0, 'least_squares', 2, 0.5, Row, Column, Angle, Score)
     // 计算当前过去的时间,单位是秒
     count_seconds (S2)
     Runtime := (S2 - S1) * 1000
 ​
     // 生成十字对象
     gen_cross_contour_xld (Cross, Row, Column, 6, rad(45))
     // 显示匹配结果,将匹配得到的实例以形状轮廓的形式绘制出来
     dev_display_shape_matching_results (ModelID, 'lime green', Row, Column, Angle, 1, 1, 0)
     // 设置输出对象的颜色
     dev_set_color ('orange')
     // 显示图像
     dev_display (Image)
     // 显示十字
     dev_display (Cross)
     stop ()
 ​
 endfor
 get_system ('border_shape_models', model)
 //  匹配结束,释放模板资源
 clear_shape_model (ModelID)
  • Processamento de limite

    • set_system('border_shape_models','falso')

    • O modelo deve estar dentro do ROI

    • As partes próximas às bordas serão cortadas

    • set_system('border_shape_models','true')

    • O modelo pode estar parcialmente fora do ROI

    • Nota: Os pontos serão reduzidos 

(2) Sinais de proteção ambiental

 dev_update_off ()
 dev_close_window ()
 ​
 // 定位模板
 // 读取图像
 read_image (Image, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/一个环保标志.png')
 // 获取图像的宽高
 get_image_size (Image, Width, Height)
 // 以合适的尺寸打开图像
 dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
 //显示图像、字体、填充方式、颜色、字宽
 dev_display (Image)
 set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
 dev_set_draw ('margin')
 dev_set_color ('red')
 dev_set_line_width (3)
 ​
 // 定义数组
 Message := '这个实例演示如何创建一个模板'
 Message[1] := '形状匹配模板建立与保存'
 Message[2] := '模板匹配的使用'
 // 显示数组话语
 disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
 // 继续提示语显示
 disp_continue_message (WindowHandle, 'black', 'true')
 // 执行断点处
 stop()
 ​
 // 预处理获得优质的模板图像
 threshold (Image, Regions, 0, 122)
 dev_set_colored(12)
 connection (Regions, ConnectedRegions)
 fill_up (ConnectedRegions, RegionFillUp)
 select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 14845, 57911.9)
 dilation_circle (SelectedRegions, RegionDilation, 3.5)
 reduce_domain (Image, RegionDilation, ImageReduced)
 ​
 // 生成模板
 determine_shape_model_params(ImageReduced, 'auto', -0.39, 0.79, 0.9, 1.1, 'auto', 'use_polarity', 'auto', 'auto', 'all', ParameterName, ParameterValue)
 // 监视模板
 inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 5, 40)
 ​
 // 创建形状模板
 // 使用用图像创建带有缩放的匹配模板
 create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 0, 0.8, 1.0, 0, ['none','no_pregeneration'], 'ignore_global_polarity', 40, 10, ModelID)
 // 保存模板
 write_shape_model (ModelID, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_huanbao.shm')
 // 清除模板
 clear_shape_model (ModelID)
  
 // 模板匹配
 // 获取检测目标图像
 read_image (Image1, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/三个环保标志.png')
 // 提示语定义与显示
 Message := '形状匹配步骤开始'
 disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
 // 读取形状模板
 read_shape_model ('E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_huanbao.shm', ModelID1)
 // 模板匹配,后面的几个参数是匹配图像的位置状态等参数
 find_scaled_shape_model (Image1, ModelID1, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
 // 返回一个轮廓模型的轮廓表示
 get_shape_model_contours (ModelContours, ModelID1, 1)
 ​
 dev_display (Image1)
 // 循环
 for i:=0 to |Score|-1 by 1
     // 得到对应匹配目标的旋转矩阵
     vector_angle_to_rigid (0, 0, 0, Row[i], Column[i], Angle[i], HomMat2DRotate)
     // 在旋转矩阵的基础上添加缩放量,生成新的矩阵
     hom_mat2d_scale (HomMat2DRotate, Scale[i], Scale[i], Row[i],Column[i], HomMat2DScale)
     // 矩阵变换(xld基础上)
     affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)
     // xld转换成region
     gen_region_contour_xld (ContoursAffineTrans, Region, 'filled')
     // 对区域,生成最小外接矩形
     smallest_rectangle1 (Region, Row1, Column1, Row2, Column2)
     // 使用绿色矩形框,框选匹配结果
     dev_set_color ('green')
     disp_rectangle1 (WindowHandle, Row1[0], Column1[0], Row2[0], Column2[0])
     // 使用红色勾画匹配结果轮廓
     dev_set_color ('red')
     dev_display (ContoursAffineTrans)
     // 显示各匹配结果提示语
     disp_message (WindowHandle, '第'+(i+1)+'个', 'window', Row1[0]-30, (Column1[0]+Column2[0])/2-10, 'green', 'false')
 endfor
 ​
 // 提示语定义与显示
 Message := '形状匹配结果如下:'
 disp_message (WindowHandle, Message, 'window', 12, 12, 'green', 'false')
 // 将窗口内容写入图像对象
 dump_window_image (Image2, WindowHandle)
 write_image (Image2, 'png', 0, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/环保标志结果.bmp.png')

(3) Luz da manhã

 dev_update_off()
 dev_close_window()
 // 读取图像
 read_image(Image, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/晨光模板图像.jpg')
 get_image_size(Image, Width, Height)
 rgb1_to_gray(Image, GrayImage)
 dev_open_window_fit_image(GrayImage, 0, 0, -1, -1, WindowHandle)
 dev_display(GrayImage)
 ​
 // 预处理
 binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
 connection(Region, ConnectedRegions)
 fill_up(ConnectedRegions, RegionFillUp)
 select_shape(RegionFillUp, SelectedRegions, 'area', 'and', 22500, 23000)
 dilation_circle(SelectedRegions, RegionDilation, 3.5)
 reduce_domain(GrayImage, RegionDilation, ImageReduced)
 ​
 // 获取金字塔层数,图像监视
 determine_shape_model_params(ImageReduced, 'auto', -0.39, 0.79, 0.9, 1.1, 'auto', 'use_polarity', 'auto', 'auto', 'all', ParameterName, ParameterValue)
 inspect_shape_model(ImageReduced, ModelImages, ModelRegions, 5, 20)
 ​
 dev_set_draw ('margin')
 dev_set_line_width(3)
 ​
 // 创建模板
 create_shape_model(ImageReduced, 'auto', rad(0), rad(1), 'auto', 'auto', 'use_polarity', 20, 3, ModelID)
 write_shape_model(ModelID, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_chenguang.shm')
 clear_shape_model(ModelID)
 ​
 // 在目标图像中寻找模板图像
 read_image(ImageTest, 'E:/Halcon/算法/11模板匹配/基于形状的模板匹配/晨光测试图像.jpg')
 message:= '查找模板'
 disp_message(WindowHandle, message, 'window', 16, 16, 'black', 'true')
 read_shape_model('E:/Halcon/算法/11模板匹配/基于形状的模板匹配/shapemodel_chenguang.shm',ModelID1)
 find_shape_model(ImageTest, ModelID1, rad(0), rad(1), 0.5, 0, 0, 'least_squares', 5, 0.8, Row, Column, Angle, Score)
 get_shape_model_contours(ModelContours, ModelID1, 1)
 dev_display(ImageTest)
 // 显示匹配结果,将匹配得到的实例以形状轮廓的形式绘制出来
 dev_display_shape_matching_results(ModelID1, 'red', Row, Column, Angle, 1, 1, 0)
 // 匹配结束,释放模板资源
 clear_shape_model (ModelID1)

Acho que você gosta

Origin blog.csdn.net/soaipipiop/article/details/127203517
Recomendado
Clasificación