- Princípio básico:
Use a imagem do modelo como núcleo de convolução, digitalize a imagem de amostra da esquerda para a direita e de cima para baixo, calcule o coeficiente de correlação e encontre objetos semelhantes ao modelo.
- método de correspondência
1. Método de correspondência de diferença quadrada (TM_SQDIFF) T é a imagem do modelo, I é a imagem correspondente; na posição (x, y) da imagem correspondente, x' para a direita e y' para baixo enquadram a área de reconhecimento, e quando
a correlação é completamente correspondida,
O valor calculado é 0; quanto maior o valor correspondente, menor a correlação.
2. Método de identificação de diferença quadrada normalizada (TM_SQDIFF_NORMED)
O cálculo da diferença quadrática é normalizado para que o resultado do cálculo seja de 0 a 1.
Quando a imagem corresponde completamente, o resultado do cálculo é 0; quando a imagem não corresponde completamente, o resultado do cálculo é 1.
3. Método de correspondência de correlação (TM_CCORR)
O modelo é multiplicado pela imagem correspondente. Quanto maior o resultado do cálculo, melhor será o resultado da correspondência.
Este método fará com que o resultado do cálculo mude devido a alterações no brilho global da imagem. Por exemplo, quando a imagem fica mais clara, o valor de cinza de cada pixel aumentará, o que fará com que o resultado do cálculo fique maior;
4. Método de correspondência de correlação normalizada (TM_CCORR_NORMED)
5. Método de correspondência de coeficiente de correlação (TM_CCOEFF)
Este método pré-processa a matriz do modelo e a área de reconhecimento antes de realizar a correspondência de correlação: subtraindo a média da matriz da matriz, este Este método resolve o impacto causado pela diferença de brilho entre a imagem do modelo e a imagem de reconhecimento. Pode-se observar pela lógica do resultado do cálculo que quanto maior o resultado do cálculo, melhor será o resultado correspondente.
6. Método de correspondência de coeficiente de correlação normalizado (TM_CCOEFF_NORMED)
Este método normaliza o método de correspondência do coeficiente de correlação. O resultado do cálculo é -1 ~ 1
para uma correspondência completa e -1 para uma incompatibilidade completa.
- API
public static void MatchTemplate(InputArray image, InputArray templ, OutputArray result, TemplateMatchModes method, InputArray? mask = null);
imagem: imagem de reconhecimento
modelo: modelo imagem
resultado: correspondência de modelo
método de resultado: método de correspondência
máscara: máscara de modelo correspondente, geralmente usando o valor padrão
- Demonstração
Mat templatePic = Cv2.ImRead(@"C:\Users\Aron\Desktop\01\A.jpg");
Mat testPic = Cv2.ImRead(@"C:\Users\Aron\Desktop\01\B.jpg");
Mat matchResul = new Mat();
//归一化相关系数匹配法
Cv2.MatchTemplate(testPic, templatePic, matchResul, TemplateMatchModes.CCoeffNormed);
//最大最小匹配对象的位置
Point minLoc = new Point(0, 0);
Point maxLoc = new Point(0, 0);
//最大最小配置值
double minVal;
double maxVal;
//查找最大最小值的位置及匹配的值
Cv2.MinMaxLoc(matchResul, out minVal, out maxVal, out minLoc, out maxLoc);
//框选出识别对象
//归一化相关系数匹配方法取最大值
Scalar scalar = new Scalar(0, 0, 255);
Cv2.Rectangle(testPic,maxLoc, new Point(maxLoc.X+templatePic.Cols,maxLoc.Y+templatePic.Rows), scalar, 7);
//显示相关性计算结果
Cv2.PutText(testPic, Math.Round(maxVal,4).ToString(), new Point(maxLoc.X, maxLoc.Y -50), HersheyFonts.HersheyDuplex, 2, scalar, 8);
picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(templatePic);
picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(testPic);
Notas adicionais:
A biblioteca OpenCV usada no .NET neste caso é OpenCvSharp4