Как то мне в руки попало достаточно интересное тестовое задание. Академический интерес взял верх, и я решил посидеть над этой задачкой. Мое решение не претендует на оптимальность и правильность. Мне просто интересно было ее решить.
Исходные данные
Суть задания заключается в следующем - написать программу, которая по изображению снимков со сканера вен ладоней определяет приложена ли ладонь к сканеру. Исходные данные - несколько снимков с заранее известным результатом. Нужно скормить их программе, а программа, в свою очередь, должна сказать - приложена ладонь или нет.
Результат
Программа с графическим интерфейсом с возможностью выбора изображения из списка. После выбора изображение анализируется и после анализа выдается результат в виде надписи Good или Bad.
Алгоритм
Алгоритм анализа изображения довольно простой. Для начала создал класс ImageAnalyser со следующим интерфейсом
Внутри этого класса решил условно разделить изображение на 4 части для каждого источника света. И для каждого изображения расчитать среднюю яркость относительно осей Х и У. Наглядно это продемонстрировано на изображении ниже.
В результате получим восемь графиков со средним уровнем яркости.
Далее нужно произвести анализ этих графиков. Я решил использовать функцию корреляции сравнив полученные графики с некоторым “идеальным” графиком. Идеальный график в данном случае это просто прямоугольник, который я получаю следующим способом:
Для сравнения графиков и, соответственно, получения значения корреляции я использовал функцию gsl_stats_correlation, реализацию которого честно украл из GNU Scientific Library.
Далее нужно просто проанализировать значения корреляции. Я решил, что если хоть одно значение корреляции меньше 0,5 то ладонь к сенсору не приложена или приложена плохо.
Так же из кода видно, что производится анализ уровня яркости - если значение меньше 30, то так же считаем, что ладонь не приложена.
Стек используемых технологий
- C/C++
- Qt Creator
- QtCharts
- GNU Scientific Library