2014-11-06 6 views
0

У меня всегда есть квадратные/прямоугольные изображения, иногда мне тоже нужно сопоставлять изображения. Ниже приведены 2 изображения, например. Бал - это образ шаблона, а второй - это источник, где нужно искать шаблон. Я могу сделать фон шаблона прозрачным, но это дает ошибку, делая его белым, уменьшает счет матча, потому что, как вы видите на исходном изображении, вокруг шара нет белого. Это всего лишь 2 примера. У вас есть предложения/решения?Шаблон соответствия OpenCV для круглых изображений в Java

Template image to be searched

Source image

ответ

0

Если вы знаете, пиксели, принадлежащие к шаблону, вы можете написать согласовани

сумму абсолютных разностей проб (псевдокод)

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) 

и оптимизировать его с помощью многопоточности по строкам изображений

+0

Я не знаю python, если это python, я могу попробовать его :) Я написал это в berky. это очень простой, но мощный язык - и удивительный, как вы уже выяснили, - просто трудно привыкнуть. 8) – baci

+0

Вы правы, Python немного отличается. Если бы это был код Java, я бы добавил +1. – karlphillip

1

Это нормально, вы все еще можете использовать matchTemplate() и получить отличные результаты:

enter image description here

You can find a decent tutorial on OpenCV's documentation. Кстати, это результат демонстрации, которую там поделили.

+0

Соответствие шаблону находит лучший результат, оно будет отмечать квадрат, даже если шаблон не находится в исходном коде. Если искомое изображение действительно находится в источнике, то оценка будет равна 0,9987 ... но в этом случае с белыми оценка будет 0,7 ... Я сделаю, давайте скажем 1000 сравнений для разных изображений, некоторые из них будут зелеными, некоторые из них будут иметь синий, серый. Который всегда будет влиять на соответствующий счет. Im устанавливает пороговое значение в соответствии с найденным или не найденным для моего случая результатом оценки, и случайные пороги будут проблемой. Я знаю, что это будет всегда выше 0,6 ... но все же ... – Anarkie

2

Я думаю, вы также можете использовать для этого гистограмму. Там вы также можете использовать произвольную маска формы. Сконструируйте маску с обратным изображением, и вы обнаружите пик в области, где объект появляется на изображении, как показано на изображениях (отображается цвет и масштабируется) ниже.

backprojected:

enter image description here

свертке:

enter image description here

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); 
+0

Не могли бы вы привести пример с кодом, пожалуйста? или ссылку на учебник, где это сделано? – Anarkie

+0

Добавлен код. Я все еще экспериментирую. Я обновлю код или предоставил ссылку, если у меня появится возможность опубликовать это в моем будущем блоге. – dhanushka

+0

Я знаю C++, но работаю в Java правильно, не могли бы вы разместить его в Java?Или я попробую это после того, как вы полностью закончите. – Anarkie