У меня всегда есть квадратные/прямоугольные изображения, иногда мне тоже нужно сопоставлять изображения. Ниже приведены 2 изображения, например. Бал - это образ шаблона, а второй - это источник, где нужно искать шаблон. Я могу сделать фон шаблона прозрачным, но это дает ошибку, делая его белым, уменьшает счет матча, потому что, как вы видите на исходном изображении, вокруг шара нет белого. Это всего лишь 2 примера. У вас есть предложения/решения?Шаблон соответствия OpenCV для круглых изображений в Java
ответ
Если вы знаете, пиксели, принадлежащие к шаблону, вы можете написать согласовани
сумму абсолютных разностей проб (псевдокод)
Mat I, T // image and template
vector<Point> template_pixels
Rect sliding_window
vector<double> match_rates
for all rows in image
update sliding_window
for all cols in image
update sliding_window
Mat W = I(sliding_window)
sum = 0
for all rows in template
for all cols in template
if(template_pixels contains pixel i)
sum += abs(W(i) - T(i))
end for
end for
match_rates.pushback(sum)
end for
end for
minMaxLoc(match_rates)
и оптимизировать его с помощью многопоточности по строкам изображений
Это нормально, вы все еще можете использовать matchTemplate()
и получить отличные результаты:
You can find a decent tutorial on OpenCV's documentation. Кстати, это результат демонстрации, которую там поделили.
Соответствие шаблону находит лучший результат, оно будет отмечать квадрат, даже если шаблон не находится в исходном коде. Если искомое изображение действительно находится в источнике, то оценка будет равна 0,9987 ... но в этом случае с белыми оценка будет 0,7 ... Я сделаю, давайте скажем 1000 сравнений для разных изображений, некоторые из них будут зелеными, некоторые из них будут иметь синий, серый. Который всегда будет влиять на соответствующий счет. Im устанавливает пороговое значение в соответствии с найденным или не найденным для моего случая результатом оценки, и случайные пороги будут проблемой. Я знаю, что это будет всегда выше 0,6 ... но все же ... – Anarkie
Я думаю, вы также можете использовать для этого гистограмму. Там вы также можете использовать произвольную маска формы. Сконструируйте маску с обратным изображением, и вы обнаружите пик в области, где объект появляется на изображении, как показано на изображениях (отображается цвет и масштабируется) ниже.
backprojected:
свертке:
EDIT:
Это основано на этом paper. Я экспериментировал и надеялся опубликовать в блоге. Это на C++.
// model histogram: this is the football template
calcHist(&model32fc3, 1, (const int*)channels, modelMask, histModel, 3, (const int*)histSize, (const float**)ranges, true, false);
// image histogram
calcHist(&image32fc3, 1, (const int*)channels, Mat(), histImage, 3, (const int*)histSize, (const float**)ranges, true, false);
// ratio histogram
divide(histModel, histImage, histRatio);
cv::min(histRatio, 1.0, histRatio);
// backproject ratio histogram
calcBackProject(&image32fc3, 1, (const int*)channels, histRatio, backprj, (const float**)ranges);
// convolve the kernel with the backprojected image
filter2D(backprj, conv, CV_32F, modelMask);
Не могли бы вы привести пример с кодом, пожалуйста? или ссылку на учебник, где это сделано? – Anarkie
Добавлен код. Я все еще экспериментирую. Я обновлю код или предоставил ссылку, если у меня появится возможность опубликовать это в моем будущем блоге. – dhanushka
Я знаю C++, но работаю в Java правильно, не могли бы вы разместить его в Java?Или я попробую это после того, как вы полностью закончите. – Anarkie
Я не знаю python, если это python, я могу попробовать его :) Я написал это в berky. это очень простой, но мощный язык - и удивительный, как вы уже выяснили, - просто трудно привыкнуть. 8) – baci
Вы правы, Python немного отличается. Если бы это был код Java, я бы добавил +1. – karlphillip