Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/tracking.c
| /* SPDX-License-Identifier: GPL-2.0-or-later | /* SPDX-License-Identifier: GPL-2.0-or-later | ||||
| * Copyright 2011 Blender Foundation. All rights reserved. */ | * Copyright 2011 Blender Foundation. All rights reserved. */ | ||||
| /** \file | /** \file | ||||
| * \ingroup bke | * \ingroup bke | ||||
| */ | */ | ||||
| #include <limits.h> | #include <limits.h> | ||||
| #include <math.h> | #include <math.h> | ||||
| #include <memory.h> | #include <memory.h> | ||||
| #include <stddef.h> | #include <stddef.h> | ||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| #include "DNA_anim_types.h" | #include "DNA_anim_types.h" | ||||
| #include "DNA_camera_types.h" | #include "DNA_camera_types.h" | ||||
| #include "DNA_defaults.h" | |||||
| #include "DNA_gpencil_types.h" | #include "DNA_gpencil_types.h" | ||||
| #include "DNA_movieclip_types.h" | #include "DNA_movieclip_types.h" | ||||
| #include "DNA_object_types.h" /* SELECT */ | #include "DNA_object_types.h" /* SELECT */ | ||||
| #include "DNA_scene_types.h" | #include "DNA_scene_types.h" | ||||
| #include "BLI_bitmap_draw_2d.h" | #include "BLI_bitmap_draw_2d.h" | ||||
| #include "BLI_ghash.h" | #include "BLI_ghash.h" | ||||
| #include "BLI_listbase.h" | #include "BLI_listbase.h" | ||||
| Show All 21 Lines | |||||
| #include "RNA_prototypes.h" | #include "RNA_prototypes.h" | ||||
| #include "libmv-capi.h" | #include "libmv-capi.h" | ||||
| #include "tracking_private.h" | #include "tracking_private.h" | ||||
| typedef struct MovieDistortion { | typedef struct MovieDistortion { | ||||
| struct libmv_CameraIntrinsics *intrinsics; | struct libmv_CameraIntrinsics *intrinsics; | ||||
| /* Parameters needed for coordinates normalization. */ | /* Parameters needed for coordinates normalization. */ | ||||
| float principal[2]; | float principal_px[2]; | ||||
| float pixel_aspect; | float pixel_aspect; | ||||
| float focal; | float focal; | ||||
| } MovieDistortion; | } MovieDistortion; | ||||
| static struct { | static struct { | ||||
| ListBase tracks; | ListBase tracks; | ||||
| } tracking_clipboard; | } tracking_clipboard; | ||||
| ▲ Show 20 Lines • Show All 2,035 Lines • ▼ Show 20 Lines | if ((tracking_object->flag & TRACKING_OBJECT_CAMERA) == 0) { | ||||
| scale_m4_fl(smat, 1.0f / tracking_object->scale); | scale_m4_fl(smat, 1.0f / tracking_object->scale); | ||||
| mul_m4_m4m4(mat, mat, smat); | mul_m4_m4m4(mat, mat, smat); | ||||
| } | } | ||||
| } | } | ||||
| void BKE_tracking_camera_shift_get( | void BKE_tracking_camera_shift_get( | ||||
| MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty) | MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty) | ||||
| { | { | ||||
| float principal_px[2]; | |||||
| tracking_principal_point_normalized_to_pixel( | |||||
| tracking->camera.principal_point, winx, winy, principal_px); | |||||
| /* Indeed in both of cases it should be winx - | /* Indeed in both of cases it should be winx - | ||||
| * it's just how camera shift works for blender's camera. */ | * it's just how camera shift works for blender's camera. */ | ||||
| *shiftx = (0.5f * winx - tracking->camera.principal[0]) / winx; | *shiftx = (0.5f * winx - principal_px[0]) / winx; | ||||
| *shifty = (0.5f * winy - tracking->camera.principal[1]) / winx; | *shifty = (0.5f * winy - principal_px[1]) / winx; | ||||
| } | } | ||||
| void BKE_tracking_camera_to_blender( | void BKE_tracking_camera_to_blender( | ||||
| MovieTracking *tracking, Scene *scene, Camera *camera, int width, int height) | MovieTracking *tracking, Scene *scene, Camera *camera, int width, int height) | ||||
| { | { | ||||
| float focal = tracking->camera.focal; | float focal = tracking->camera.focal; | ||||
| camera->sensor_x = tracking->camera.sensor_width; | camera->sensor_x = tracking->camera.sensor_width; | ||||
| ▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | void BKE_tracking_camera_get_reconstructed_interpolate(MovieTracking *UNUSED(tracking), | ||||
| } | } | ||||
| else { | else { | ||||
| copy_m4_m4(mat, cameras[a].mat); | copy_m4_m4(mat, cameras[a].mat); | ||||
| } | } | ||||
| reconstructed_camera_scale_set(tracking_object, mat); | reconstructed_camera_scale_set(tracking_object, mat); | ||||
| } | } | ||||
| void BKE_tracking_camera_principal_point_pixel_get(struct MovieClip *clip, | |||||
| float r_principal_point_pixel[2]) | |||||
| { | |||||
| const MovieTrackingCamera *camera = &clip->tracking.camera; | |||||
| int frame_width, frame_height; | |||||
| MovieClipUser user = *DNA_struct_default_get(MovieClipUser); | |||||
| BKE_movieclip_get_size(clip, &user, &frame_width, &frame_height); | |||||
| tracking_principal_point_normalized_to_pixel( | |||||
| camera->principal_point, frame_width, frame_height, r_principal_point_pixel); | |||||
| } | |||||
| void BKE_tracking_camera_principal_point_pixel_set(struct MovieClip *clip, | |||||
| const float principal_point_pixel[2]) | |||||
| { | |||||
| MovieTrackingCamera *camera = &clip->tracking.camera; | |||||
| int frame_width, frame_height; | |||||
| MovieClipUser user = *DNA_struct_default_get(MovieClipUser); | |||||
| BKE_movieclip_get_size(clip, &user, &frame_width, &frame_height); | |||||
| tracking_principal_point_pixel_to_normalized( | |||||
| principal_point_pixel, frame_width, frame_height, camera->principal_point); | |||||
| } | |||||
| /* -------------------------------------------------------------------- | /* -------------------------------------------------------------------- | ||||
| * (Un)distortion. | * (Un)distortion. | ||||
| */ | */ | ||||
| MovieDistortion *BKE_tracking_distortion_new(MovieTracking *tracking, | MovieDistortion *BKE_tracking_distortion_new(MovieTracking *tracking, | ||||
| int calibration_width, | int calibration_width, | ||||
| int calibration_height) | int calibration_height) | ||||
| { | { | ||||
| MovieDistortion *distortion; | MovieDistortion *distortion; | ||||
| libmv_CameraIntrinsicsOptions camera_intrinsics_options; | libmv_CameraIntrinsicsOptions camera_intrinsics_options; | ||||
| tracking_cameraIntrinscisOptionsFromTracking( | tracking_cameraIntrinscisOptionsFromTracking( | ||||
| tracking, calibration_width, calibration_height, &camera_intrinsics_options); | tracking, calibration_width, calibration_height, &camera_intrinsics_options); | ||||
| distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); | distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); | ||||
| distortion->intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); | distortion->intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); | ||||
| const MovieTrackingCamera *camera = &tracking->camera; | const MovieTrackingCamera *camera = &tracking->camera; | ||||
| copy_v2_v2(distortion->principal, camera->principal); | tracking_principal_point_normalized_to_pixel(tracking->camera.principal_point, | ||||
| calibration_width, | |||||
| calibration_height, | |||||
| distortion->principal_px); | |||||
| distortion->pixel_aspect = camera->pixel_aspect; | distortion->pixel_aspect = camera->pixel_aspect; | ||||
| distortion->focal = camera->focal; | distortion->focal = camera->focal; | ||||
| return distortion; | return distortion; | ||||
| } | } | ||||
| void BKE_tracking_distortion_update(MovieDistortion *distortion, | void BKE_tracking_distortion_update(MovieDistortion *distortion, | ||||
| MovieTracking *tracking, | MovieTracking *tracking, | ||||
| int calibration_width, | int calibration_width, | ||||
| int calibration_height) | int calibration_height) | ||||
| { | { | ||||
| libmv_CameraIntrinsicsOptions camera_intrinsics_options; | libmv_CameraIntrinsicsOptions camera_intrinsics_options; | ||||
| tracking_cameraIntrinscisOptionsFromTracking( | tracking_cameraIntrinscisOptionsFromTracking( | ||||
| tracking, calibration_width, calibration_height, &camera_intrinsics_options); | tracking, calibration_width, calibration_height, &camera_intrinsics_options); | ||||
| const MovieTrackingCamera *camera = &tracking->camera; | const MovieTrackingCamera *camera = &tracking->camera; | ||||
| copy_v2_v2(distortion->principal, camera->principal); | tracking_principal_point_normalized_to_pixel(tracking->camera.principal_point, | ||||
| calibration_width, | |||||
| calibration_height, | |||||
| distortion->principal_px); | |||||
| distortion->pixel_aspect = camera->pixel_aspect; | distortion->pixel_aspect = camera->pixel_aspect; | ||||
| distortion->focal = camera->focal; | distortion->focal = camera->focal; | ||||
| libmv_cameraIntrinsicsUpdate(&camera_intrinsics_options, distortion->intrinsics); | libmv_cameraIntrinsicsUpdate(&camera_intrinsics_options, distortion->intrinsics); | ||||
| } | } | ||||
| void BKE_tracking_distortion_set_threads(MovieDistortion *distortion, int threads) | void BKE_tracking_distortion_set_threads(MovieDistortion *distortion, int threads) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | |||||
| void BKE_tracking_distortion_distort_v2(MovieDistortion *distortion, | void BKE_tracking_distortion_distort_v2(MovieDistortion *distortion, | ||||
| const float co[2], | const float co[2], | ||||
| float r_co[2]) | float r_co[2]) | ||||
| { | { | ||||
| const float aspy = 1.0f / distortion->pixel_aspect; | const float aspy = 1.0f / distortion->pixel_aspect; | ||||
| /* Normalize coords. */ | /* Normalize coords. */ | ||||
| float inv_focal = 1.0f / distortion->focal; | float inv_focal = 1.0f / distortion->focal; | ||||
| double x = (co[0] - distortion->principal[0]) * inv_focal, | double x = (co[0] - distortion->principal_px[0]) * inv_focal, | ||||
| y = (co[1] - distortion->principal[1] * aspy) * inv_focal; | y = (co[1] - distortion->principal_px[1] * aspy) * inv_focal; | ||||
| libmv_cameraIntrinsicsApply(distortion->intrinsics, x, y, &x, &y); | libmv_cameraIntrinsicsApply(distortion->intrinsics, x, y, &x, &y); | ||||
| /* Result is in image coords already. */ | /* Result is in image coords already. */ | ||||
| r_co[0] = x; | r_co[0] = x; | ||||
| r_co[1] = y; | r_co[1] = y; | ||||
| } | } | ||||
| void BKE_tracking_distortion_undistort_v2(MovieDistortion *distortion, | void BKE_tracking_distortion_undistort_v2(MovieDistortion *distortion, | ||||
| const float co[2], | const float co[2], | ||||
| float r_co[2]) | float r_co[2]) | ||||
| { | { | ||||
| double x = co[0], y = co[1]; | double x = co[0], y = co[1]; | ||||
| libmv_cameraIntrinsicsInvert(distortion->intrinsics, x, y, &x, &y); | libmv_cameraIntrinsicsInvert(distortion->intrinsics, x, y, &x, &y); | ||||
| const float aspy = 1.0f / distortion->pixel_aspect; | const float aspy = 1.0f / distortion->pixel_aspect; | ||||
| r_co[0] = (float)x * distortion->focal + distortion->principal[0]; | r_co[0] = (float)x * distortion->focal + distortion->principal_px[0]; | ||||
| r_co[1] = (float)y * distortion->focal + distortion->principal[1] * aspy; | r_co[1] = (float)y * distortion->focal + distortion->principal_px[1] * aspy; | ||||
| } | } | ||||
| void BKE_tracking_distortion_free(MovieDistortion *distortion) | void BKE_tracking_distortion_free(MovieDistortion *distortion) | ||||
| { | { | ||||
| libmv_cameraIntrinsicsDestroy(distortion->intrinsics); | libmv_cameraIntrinsicsDestroy(distortion->intrinsics); | ||||
| MEM_freeN(distortion); | MEM_freeN(distortion); | ||||
| } | } | ||||
| void BKE_tracking_distort_v2( | void BKE_tracking_distort_v2( | ||||
| MovieTracking *tracking, int image_width, int image_height, const float co[2], float r_co[2]) | MovieTracking *tracking, int image_width, int image_height, const float co[2], float r_co[2]) | ||||
| { | { | ||||
| const MovieTrackingCamera *camera = &tracking->camera; | const MovieTrackingCamera *camera = &tracking->camera; | ||||
| const float aspy = 1.0f / tracking->camera.pixel_aspect; | const float aspy = 1.0f / tracking->camera.pixel_aspect; | ||||
| libmv_CameraIntrinsicsOptions camera_intrinsics_options; | libmv_CameraIntrinsicsOptions camera_intrinsics_options; | ||||
| tracking_cameraIntrinscisOptionsFromTracking( | tracking_cameraIntrinscisOptionsFromTracking( | ||||
| tracking, image_width, image_height, &camera_intrinsics_options); | tracking, image_width, image_height, &camera_intrinsics_options); | ||||
| libmv_CameraIntrinsics *intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); | libmv_CameraIntrinsics *intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); | ||||
| float principal_px[2]; | |||||
| tracking_principal_point_normalized_to_pixel( | |||||
| tracking->camera.principal_point, image_width, image_height, principal_px); | |||||
| /* Normalize coordinates. */ | /* Normalize coordinates. */ | ||||
| double x = (co[0] - camera->principal[0]) / camera->focal, | double x = (co[0] - principal_px[0]) / camera->focal, | ||||
| y = (co[1] - camera->principal[1] * aspy) / camera->focal; | y = (co[1] - principal_px[1] * aspy) / camera->focal; | ||||
| libmv_cameraIntrinsicsApply(intrinsics, x, y, &x, &y); | libmv_cameraIntrinsicsApply(intrinsics, x, y, &x, &y); | ||||
| libmv_cameraIntrinsicsDestroy(intrinsics); | libmv_cameraIntrinsicsDestroy(intrinsics); | ||||
| /* Result is in image coords already. */ | /* Result is in image coords already. */ | ||||
| r_co[0] = x; | r_co[0] = x; | ||||
| r_co[1] = y; | r_co[1] = y; | ||||
| } | } | ||||
| void BKE_tracking_undistort_v2( | void BKE_tracking_undistort_v2( | ||||
| MovieTracking *tracking, int image_width, int image_height, const float co[2], float r_co[2]) | MovieTracking *tracking, int image_width, int image_height, const float co[2], float r_co[2]) | ||||
| { | { | ||||
| const MovieTrackingCamera *camera = &tracking->camera; | const MovieTrackingCamera *camera = &tracking->camera; | ||||
| const float aspy = 1.0f / tracking->camera.pixel_aspect; | const float aspy = 1.0f / tracking->camera.pixel_aspect; | ||||
| libmv_CameraIntrinsicsOptions camera_intrinsics_options; | libmv_CameraIntrinsicsOptions camera_intrinsics_options; | ||||
| tracking_cameraIntrinscisOptionsFromTracking( | tracking_cameraIntrinscisOptionsFromTracking( | ||||
| tracking, image_width, image_height, &camera_intrinsics_options); | tracking, image_width, image_height, &camera_intrinsics_options); | ||||
| libmv_CameraIntrinsics *intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); | libmv_CameraIntrinsics *intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); | ||||
| double x = co[0], y = co[1]; | double x = co[0], y = co[1]; | ||||
| libmv_cameraIntrinsicsInvert(intrinsics, x, y, &x, &y); | libmv_cameraIntrinsicsInvert(intrinsics, x, y, &x, &y); | ||||
| libmv_cameraIntrinsicsDestroy(intrinsics); | libmv_cameraIntrinsicsDestroy(intrinsics); | ||||
| r_co[0] = (float)x * camera->focal + camera->principal[0]; | float principal_px[2]; | ||||
| r_co[1] = (float)y * camera->focal + camera->principal[1] * aspy; | tracking_principal_point_normalized_to_pixel( | ||||
| tracking->camera.principal_point, image_width, image_height, principal_px); | |||||
| r_co[0] = (float)x * camera->focal + principal_px[0]; | |||||
| r_co[1] = (float)y * camera->focal + principal_px[1] * aspy; | |||||
| } | } | ||||
| ImBuf *BKE_tracking_undistort_frame(MovieTracking *tracking, | ImBuf *BKE_tracking_undistort_frame(MovieTracking *tracking, | ||||
| ImBuf *ibuf, | ImBuf *ibuf, | ||||
| int calibration_width, | int calibration_width, | ||||
| int calibration_height, | int calibration_height, | ||||
| float overscan) | float overscan) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 1,035 Lines • Show Last 20 Lines | |||||