opencv там очень много всего.
Если велосипед сделать, то: если нет проблем с эффективностью алгоритма, у вас все просто - найти все белые области (пороговое значение, строим монохромное, ставя цвет там где на изображении белый), вычисляем их размер, и начинаем поворачивать с шагом 1-3 градуса, после каждого поворота масштабируем до размера, в котором у вас хранятся шаблоны (лучше сделать поменьше размеры для ускорения, само собой у шаблонов логичнее выровнять размеры по одной стороне) и считаем количество совпадений (плюс к оценке) и несвопадений (минус к оценке), например делая xor (шаблоны и сравнение делать в монохромных версиях) и минимизируя количество (площадь) темных областей.
Если шаблонных изображений мало, можно вместо перебора всех углов, использовать дихотомию (поворачиваем в ту сторону, при которой оценка совпадения становится лучше, уменьшая шаг), в этом случае для каждого шаблона поворачивать придется по своему, в общем смотрите что эффективнее.
Это не очень эффективный алгоритм но зато очень простой.