Шаблон OpenCV Соответствующий результат - черный
Я получил следующий код, чтобы найти шаблон в исходном изображении:
private void button1_Click(object sender, EventArgs e)
{
toggleStatus();
using (Mat template = CvInvoke.Imread("C:\\Users\\Hendr\\Desktop\\temp.png", Emgu.CV.CvEnum.ImreadModes.Grayscale))
using (Mat source = CvInvoke.Imread("C:\\Users\\Hendr\\Desktop\\yVLsd.png", Emgu.CV.CvEnum.ImreadModes.Grayscale))
{
log("Image loaded into memory...");
// pictureBox1.Image = template.Bitmap;
pictureBox1.Image = source.Bitmap;
var width = source.Width - template.Width + 1;
var height = source.Height - template.Height + 1;
// Mat result = new Mat((new System.Drawing.Size(width,height), Emgu.CV.CvEnum.IplDepth.IplDepth32F, 1);
Mat result = new Mat(width, height, DepthType.Cv8U, 1);
CvInvoke.MatchTemplate(source, template, result ,Emgu.CV.CvEnum.TemplateMatchingType.SqdiffNormed);
var THRESHOLD = 0.0;
double minVal = 0, maxVal = 0;
System.Drawing.Point minLoc = new Point(), maxLoc = new Point();
CvInvoke.MinMaxLoc(result, ref minVal, ref maxVal, ref minLoc, ref maxLoc);
Rectangle rect = new Rectangle(minLoc.X,minLoc.Y, width,height);
var outlineColor = (minVal > THRESHOLD) ?Color.Green : Color.Red;
CvInvoke.Rectangle(result, rect, new MCvScalar(0,0,0));
log(rect.Location.ToString());
pictureBox1.Image = result.Bitmap;
}
foreach (object itemChecked in checkedListBox1.CheckedItems)
{
// Use the IndexOf method to get the index of an item.
MessageBox.Show("Item with title: \"" + itemChecked.ToString() +
"\", is checked. Checked state is: " +
checkedListBox1.GetItemCheckState(checkedListBox1.Items.IndexOf(itemChecked)).ToString() + ".");
}
}
Исходное изображение выглядит так:
Тем не менее, мой результат полностью затемнен:
Я проверил, что template
и source
Мат должным образом загружается в память. Увидеть pictureBox1.Image = source.Bitmap; ...
,
В конце концов, я не могу найти информацию из документа, почему мой result
Мат(pictureBox1.Image = result.Bitmap;
) черный. Кто-нибудь еще имел / имел эту проблему тоже и может дать мне ссылку или ссылку?
1 ответ
Убедитесь, что результат находится в диапазоне [0,255] с помощью такой нормализации:
normalize( result, result, 0, 255, NORM_MINMAX, CV_8UC1);
У меня была та же проблема при запуске того же примера для Java. Я решил это с помощью типа данных CV_32FC1. Для вашего кода C# я думаю, что это должно быть:
Mat result = new Mat(width, height, DepthType.Cv32F, 1);
Для полного объяснения того же самого примера соответствия шаблонов в C++, java и python, пожалуйста, проверьте:
https://docs.opencv.org/3.4/de/da9/tutorial_template_matching.html