Измерение высоты колоды игральных карт на изображении

Пишу модуль для программы наблюдения за казино.

Немного контекста:

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

Работает в настоящее время:

Я применил хитрое обнаружение краев и houghlines, чтобы получить высоту в пикселях двух колод. Также известны координаты всех углов передней части деки, поскольку она всегда находится в фиксированном положении с одинаковой ориентацией.

Проблема начинается, когда эталонная дека находится не на том же расстоянии, что и дека, которые я пытаюсь измерить, но ближе к камере. В этом случае, поскольку одна из колод находится ближе к камере, обе колоды могут иметь одинаковую высоту в пикселях, хотя та, что сзади, содержит больше карт.

Вот наглядный пример:

На самом деле в обеих колодах 52 карты, но у ближайшей к камере - 83 пикселя, а у задней - 63 пикселя.

Образец фотографии

Как я могу нормализовать значения, которые у меня есть для ссылки на колоду в фоновом режиме? Я нашел вопрос, который делает что-то похожее на вычисление размера при перемещении внутри изображения, но в нем используется openGL, с которым я не знаком (Как мне перевернуть 2D-точки в 3D?). Я пытаюсь добиться этого с помощью библиотеки компьютерного зрения / обработки изображений (в настоящее время я использую ImageMagick для четких краев и линий резкости) в Python (я открыт для предложений по использованию другого языка программирования, если вы считаете, что Python не подходит).

РЕДАКТИРОВАТЬ:

Подводя итог тому, чего я пытаюсь достичь: я хочу знать, как эти два объекта сравниваются по высоте. Как мне масштабировать один сзади, чтобы он был по размеру, если бы он находился рядом с тем, что спереди, чтобы я мог сравнить их?


person PU2014    schedule 20.12.2019    source источник
comment
Скорее всего, вы захотите масштабировать с помощью преобразования. Итак, если вы знаете оборотную сторону карт и можете найти пересадку на самолет, вы можете прикинуть расстояние до камеры. Примите расстояние как коэффициент нормализации. Для аффинных преобразований и автоматической подгонки посмотрите, например, Лукас-Канаде.   -  person Dschoni    schedule 20.12.2019
comment
@Dschoni Спасибо за ответ. Не могли бы вы подробнее рассказать о том, как найти передачу на плаву и оценить расстояние до камеры?   -  person PU2014    schedule 20.12.2019


Ответы (2)


Я не знаком с ImageMagick, поэтому не могу писать для вас коды, но я объяснил, что вы собираетесь делать:

Есть кое-что, в чем мы уверены: Реальный размер каждой карты! Вы знаете, что все карты имеют одинаковую ширину и высоту (в реальном мире), поэтому единственное, что вам нужно сделать, это найти ширину верхней карты в первой стопке, а также второй стопки на изображении. Поскольку эти два числа связаны друг с другом, теперь вы можете получить соотношение размеров колоды 1 и колоды 2.

С помощью этого соотношения вы можете нормализовать высоту колод и сравнивать эти числа друг с другом.

Например, представьте, что ширина каждой карты (красные стрелки) составляет 5 см, и эта ширина на изображении для первой колоды составляет 80 пикселей, а для второй колоды - 40 пикселей. Таким образом, соотношение равно 2. Теперь для сравнения этих черных линий просто умножьте длину второй строки на 2 и сравните полученное число с длиной первой строки.

введите описание изображения здесь

У вас есть множество способов оценить ширину каждой колоды карт. Извлечь ширину может быть сложно, поэтому я предлагаю сравнить ширину узоров (желтые стрелки), и для этого я бы использовал такой метод:

1- Сделайте хитрый рисунок (из-за рисунков на карте у вас будет много линий на поверхности карты)

2- Сделайте растяжение, чтобы наклеить все эти линии рисунка на поверхность карты и сделать единичный объект.

3- Сделайте эрозию, чтобы немного уменьшить этот объект, а затем уловите ширину этого объекта (это будет хорошей оценкой ширины карты)

person MH304    schedule 23.12.2019
comment
Спасибо за ваш ответ. Некоторые казино заказывают игральные карты, изготовленные на заказ, поэтому размер карт может быть нестандартным. Что делать в таком случае? а вы можете более подробно объяснить шаги 2 и 3? может несколько примеров? - person PU2014; 24.12.2019
comment
@ PU2014 Отредактировал ответ. Вам НЕ нужно знать реальную ширину всех карт во всех казино. Единственное, что вам нужно, это убедиться, что все карты в этом казино имеют одинаковый размер. Шаг 2 - создать единичный объект из рисунков на карточке, когда вы выполните шаг 1, вы поймете, почему я предлагаю это. - person MH304; 24.12.2019
comment
Это умное решение, но, к сожалению, также неверное. Две деки не имеют одинакового угла по отношению к камере, и, следовательно, относительные размеры по высоте, ширине и длине деки несопоставимы. Сначала вам нужно исправить проекционное искажение, что включает калибровку камеры, установленной на поверхности стола. И если у вас все равно есть эта калибровка, больше нет необходимости сравнивать, как предлагается здесь. - person Cris Luengo; 24.12.2019
comment
@CrisLuengo Спасибо за хорошее замечание. Конечно, как я уже упоминал, это «оценка», она не совсем точная, но помогает. Кроме того, мы знаем, что в реальном мире карты представляют собой чистый «прямоугольник», поэтому проекцию легко компенсировать без какой-либо калибровки (также с помощью горизонтальных размеров). (Все это оценка, даже с калибровкой невозможно найти точные значения трехмерных размеров изображения) - person MH304; 24.12.2019
comment
@Meisam, не могли бы вы дать псевдокод или объяснение, как добиться компенсации проекции без какой-либо калибровки? - person PU2014; 24.12.2019
comment
@ PU2014 Ты должен уделить этому немного времени. Но в качестве подсказки рассмотрим тот факт, что все карты имеют почти фиксированное соотношение высоты / ширины (что-то около 1,6). Теперь определите гипотетический прямоугольник (тот, который находится в вашей плоскости CCD) с этими точками: (0,0), (0,16), (10,0), (10,16). Затем найдите проекцию между этими точками и координатами каждой карты (cv.findHomography). Это позволяет приблизительно оценить калибровку. - person MH304; 25.12.2019

Я думаю, вам следует сравнить площадь вашей контрольной колоды с целевой колодой.
Но сначала вы должны рассчитать расстояние до контрольной и целевой колод.
Если ваш набор данных имеет метку или ваша проблема связана с контролем. < br> Я думаю, что если вы используете нейронную сеть, вы можете установить расстояние двух колод в качестве значения смещения.
Также я думаю, вы должны рассчитать расстояние двух ближайших пикселей двух колод как расстояние двух колод.

person Mehdi Hamzeloee    schedule 01.01.2020
comment
Привет @Mehdi, я исправляю грамматику вашего ответа, но я думаю, что последнее предложение неясно (по крайней мере, для меня). Может, ты лучше объяснишь последний пункт? Благодарность - person Alex 75; 01.01.2020