Как распознать число с скриншота с помощью OpenCV?

Доброго времени суток. Мне нужно определять число из снимка экрана (оно четкое и символы одинаковые). Как мне решить с помощью OpenCV? Опыта решения задач такого рода у меня нет и поиск информации в интернете не помог. Пробовал с помощью Canny + findContours найти контуры чтобы потом сравнивать с шаблоном но уже и на этом застрял, потому что мне еще ​​контуром делало внешнюю тень (черную) цифр. Может есть какие-то примеры такого решения такой задачи? Как мне определять из этих контуров какое это число?

Спасибо заранее за помощь!

Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

Canny(img_gold, canny_output, thresh, thresh * 2, 3);

findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));


Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
	if (contourArea(contours[i]) < 100) continue;

	Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
	drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
}

imshow("zzz", drawing);


1704f8716dab4244ab3aec9319a53608.png
  • Вопрос задан
  • 4487 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Так а что не так то? findContours возвращает вам контуры, а вы фильтруете все контуры что меньше 100 по площади (то есть внутренние контуры у цифр будут удалены), что не правильно. Да и canny тут не нужен, тут просто стоит поиграться с порогом бинаризации (что бы оставались только белые числа на черном фоне).

Далее все так же находим связанные области и считаем их характеристики (периметр, площадь) и по ним уже проводим классификацию. Еще хороший способ классификации (а так же довольно простой) - по гистрограммам. То есть мы берем картинку, делаем бинаризацию (по цвету цифр, или, если цвета все же не равномерны, с небольшим допуском в сторону более темных цветов, тут можно поиграться) и строим гистограмму, учитывающую количество белых пикселей для каждой колонки, так можно сходу найти объекты (на вашем примере после бинаризации между каждой цифрой будут явные промежутки), то есть мы берем все промежутки, где количество белых пикселей в колонке будет равно нулю. Далее по тем же гистограммам можно проводить классификацию, для каждого символа гистограмма будет своя.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы