7
Изменить размер гораздопроще чем Вы думаете. Чип сенсора как стоял в плоскости физического фокуса так и стоит. Просто отключаются не используются пиксели с края сенсора. Это сделать просто изменив приделы счётчика который перебирает пиксели камеры во время чтения. Когда как масштабирование требует заблюрить соседние пиксели и произвести децимацию оставив к примеру через один каждый второй пиксель. Вот только обычно масштабирование идёт не кратно 2 а через дробные значения к 3/2. Что требует уже усложнения чипов камеры.
Так вот при изменении используемой области камеры меняется угол обзора. В математической модели это приводит к изменению математического фокуса.
Известно что бочкообразые и подушкообразные искажения определяются параметрами линзы k1, k3 (внутренние параметры камеры) а они в свою очередь зависят от математического фокуса камеры, то они тоже уплывут.
А вот ничего подобного. Там два случая. Изменени плотности и изменение размера матрицы. Как правило задействуется последний что вносит геометрические искажения. В зависимости от формы линзы(рыбий глаз) мы ещё и зум можем поиметь(полу цифровой зум)
Ну, оптика тут остается та же, меняется только плотность пикселей, поэтому думается достаточно будет поменять fx, fy, cx, cy.
Дальше все как с исходной матрицей.
Как раз лучше когда не в одной плоскости.
По поводу PnP есть неплохой пример здесь: https://learnopencv.com/head-pose-estimation-using-opencv-and-dlib/
Для плоских объектов лучше использовать что то вроде: https://github.com/arthur1026/RobustPlanarPose
Вот, как то делал что то такое: MarkerTracker.rar
Как я понял из описания:
Функция возвращает ROI с корректными пикселями в параметре validPixROI .
Alpha -задает порог по используемым пикселям, допустим пиксели ценные (сильные угловые точки), то они пройдут высокий порог, а на однотонном гладком участке точки будут малоценными и будут давать большую погрешность при сопоставлении, их ценность близка к 0. Вот из alpha и отсечет в зависимости от значения.