Меня немного смущает, почему координата характерных точек является числом с плавающей запятой, а не целым числом. Поскольку все пиксели являются целыми числами, не было бы странно иметь точки с плавающей запятой?
Спасибо!
Например:
< cv2.KeyPoint >
special variables
function variables
angle: 313.130859375
class_id: -1
octave: 2
pt:
(516.9600219726562, 123.84000396728516)
response: 0.0013209185563027859
size: 44.6400032043457
Привет, Бен! Был ли ответ ниже полезен или вы искали другое объяснение?
Я вижу, где может возникнуть путаница. Вы правы: для людей пиксели определяются целыми числами — у вас либо есть пиксель, либо его нет; нет никакого промежуточного звена. Однако, если задуматься, компьютеры не обязаны воспринимать координаты как целые числа; они не осознают пиксели при выполнении операций. По их мнению, точки могут быть установлены в мире почти бесконечной точности с координатами с плавающей запятой. И только когда компьютеры выполняют свои расчеты, им приходится округлять их в большую или меньшую сторону, чтобы они соответствовали ограничениям наших экранов (т. е. умещать их в пикселях). Использование плавающих точек в качестве значений координат позволяет компьютерам повысить точность выполнения широкого спектра задач, начиная от выполнения крупных операций (например, преобразования изображения, масштабирования, вращения...) и заканчивая нормализацией координат (очень распространенная задача, выполняемая OpenCV). Сказав это, я должен признать, что хранение координат в виде плавающей точки требует больше вычислительной мощности, чем их целочисленный аналог.
Возможно, вы захотите взглянуть на документацию OpenCV по пунктам или на этот ответ на вопрос по той же теме . И наоборот, вы можете взглянуть на статью , в которой отстаивается превосходство целочисленных координат над координатами с плавающей запятой. В целом, выбор способа хранения координат в виде чисел с плавающей запятой или целых чисел во многом зависит от задачи, которую вы собираетесь выполнить, а также от баланса точности и эффективности, который вы хотите установить. В случае OpenCV (на момент написания этого ответа) они оценили подход с плавающей запятой как более разумный. Надеюсь это поможет! И да пребудет с вами код...
Потому что они работают с субпиксельной точностью. Центры объектов не имеют тенденцию лежать в целочисленной сетке. См., например, функцию
cv::cornerSubPix
.