diff options
Diffstat (limited to 'source/blender/blenkernel/intern/tracking.c')
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 128 |
1 files changed, 93 insertions, 35 deletions
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 9368e58d467..3b76e456ff7 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -64,13 +64,15 @@ #include "RNA_access.h" -#include "raskter.h" - #include "libmv-capi.h" #include "tracking_private.h" typedef struct MovieDistortion { struct libmv_CameraIntrinsics *intrinsics; + /* Parameters needed for coordinates normalization. */ + float principal[2]; + float pixel_aspect; + float focal; } MovieDistortion; static struct { @@ -810,38 +812,54 @@ static bGPDlayer *track_mask_gpencil_layer_get(MovieTrackingTrack *track) return NULL; } +typedef struct TrackMaskSetPixelData { + float *mask; + int mask_width; + int mask_height; +} TrackMaskSetPixelData; + +static void track_mask_set_pixel_cb(int x, int x_end, int y, void *user_data) +{ + TrackMaskSetPixelData *data = (TrackMaskSetPixelData *)user_data; + size_t index = (size_t)y * data->mask_width + x; + size_t index_end = (size_t)y * data->mask_width + x_end; + do { + data->mask[index] = 1.0f; + } while (++index != index_end); +} + static void track_mask_gpencil_layer_rasterize(int frame_width, int frame_height, MovieTrackingMarker *marker, bGPDlayer *layer, float *mask, int mask_width, int mask_height) { bGPDframe *frame = layer->frames.first; + TrackMaskSetPixelData data; + + data.mask = mask; + data.mask_width = mask_width; + data.mask_height = mask_height; while (frame) { bGPDstroke *stroke = frame->strokes.first; while (stroke) { bGPDspoint *stroke_points = stroke->points; - float *mask_points, *fp; - int i; - if (stroke->flag & GP_STROKE_2DSPACE) { - fp = mask_points = MEM_callocN(2 * stroke->totpoints * sizeof(float), + int *mask_points, *point; + point = mask_points = MEM_callocN(2 * stroke->totpoints * sizeof(int), "track mask rasterization points"); - - for (i = 0; i < stroke->totpoints; i++, fp += 2) { - fp[0] = (stroke_points[i].x - marker->search_min[0]) * frame_width / mask_width; - fp[1] = (stroke_points[i].y - marker->search_min[1]) * frame_height / mask_height; + for (int i = 0; i < stroke->totpoints; i++, point += 2) { + point[0] = (stroke_points[i].x - marker->search_min[0]) * frame_width; + point[1] = (stroke_points[i].y - marker->search_min[1]) * frame_height; } - /* TODO: add an option to control whether AA is enabled or not */ - PLX_raskterize((float (*)[2])mask_points, stroke->totpoints, mask, mask_width, mask_height); - + fill_poly_v2i_n(0, 0, mask_width, mask_height, + (const int (*)[2])mask_points, stroke->totpoints, + track_mask_set_pixel_cb, &data); MEM_freeN(mask_points); } - stroke = stroke->next; } - frame = frame->next; } } @@ -1864,6 +1882,11 @@ MovieDistortion *BKE_tracking_distortion_new(MovieTracking *tracking, distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); distortion->intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); + const MovieTrackingCamera *camera = &tracking->camera; + copy_v2_v2(distortion->principal, camera->principal); + distortion->pixel_aspect = camera->pixel_aspect; + distortion->focal = camera->focal; + return distortion; } @@ -1877,6 +1900,11 @@ void BKE_tracking_distortion_update(MovieDistortion *distortion, MovieTracking * calibration_height, &camera_intrinsics_options); + const MovieTrackingCamera *camera = &tracking->camera; + copy_v2_v2(distortion->principal, camera->principal); + distortion->pixel_aspect = camera->pixel_aspect; + distortion->focal = camera->focal; + libmv_cameraIntrinsicsUpdate(&camera_intrinsics_options, distortion->intrinsics); } @@ -1890,7 +1918,7 @@ MovieDistortion *BKE_tracking_distortion_copy(MovieDistortion *distortion) MovieDistortion *new_distortion; new_distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); - + *new_distortion = *distortion; new_distortion->intrinsics = libmv_cameraIntrinsicsCopy(distortion->intrinsics); return new_distortion; @@ -1948,6 +1976,36 @@ ImBuf *BKE_tracking_distortion_exec(MovieDistortion *distortion, MovieTracking * return resibuf; } +void BKE_tracking_distortion_distort_v2(MovieDistortion *distortion, + const float co[2], + float r_co[2]) +{ + const float aspy = 1.0f / distortion->pixel_aspect; + + /* Normalize coords. */ + float inv_focal = 1.0f / distortion->focal; + double x = (co[0] - distortion->principal[0]) * inv_focal, + y = (co[1] - distortion->principal[1] * aspy) * inv_focal; + + libmv_cameraIntrinsicsApply(distortion->intrinsics, x, y, &x, &y); + + /* Result is in image coords already. */ + r_co[0] = x; + r_co[1] = y; +} + +void BKE_tracking_distortion_undistort_v2(MovieDistortion *distortion, + const float co[2], + float r_co[2]) +{ + double x = co[0], y = co[1]; + libmv_cameraIntrinsicsInvert(distortion->intrinsics, x, y, &x, &y); + + const float aspy = 1.0f / distortion->pixel_aspect; + r_co[0] = (float)x * distortion->focal + distortion->principal[0]; + r_co[1] = (float)y * distortion->focal + distortion->principal[1] * aspy; +} + void BKE_tracking_distortion_free(MovieDistortion *distortion) { libmv_cameraIntrinsicsDestroy(distortion->intrinsics); @@ -1957,40 +2015,43 @@ void BKE_tracking_distortion_free(MovieDistortion *distortion) void BKE_tracking_distort_v2(MovieTracking *tracking, const float co[2], float r_co[2]) { - MovieTrackingCamera *camera = &tracking->camera; + const MovieTrackingCamera *camera = &tracking->camera; + const float aspy = 1.0f / tracking->camera.pixel_aspect; libmv_CameraIntrinsicsOptions camera_intrinsics_options; - double x, y; - float aspy = 1.0f / tracking->camera.pixel_aspect; - tracking_cameraIntrinscisOptionsFromTracking(tracking, 0, 0, &camera_intrinsics_options); + libmv_CameraIntrinsics *intrinsics = + libmv_cameraIntrinsicsNew(&camera_intrinsics_options); - /* normalize coords */ - x = (co[0] - camera->principal[0]) / camera->focal; - y = (co[1] - camera->principal[1] * aspy) / camera->focal; + /* Normalize coordinates. */ + double x = (co[0] - camera->principal[0]) / camera->focal, + y = (co[1] - camera->principal[1] * aspy) / camera->focal; - libmv_cameraIntrinsicsApply(&camera_intrinsics_options, x, y, &x, &y); + libmv_cameraIntrinsicsApply(intrinsics, x, y, &x, &y); + libmv_cameraIntrinsicsDestroy(intrinsics); - /* result is in image coords already */ + /* Result is in image coords already. */ r_co[0] = x; r_co[1] = y; } void BKE_tracking_undistort_v2(MovieTracking *tracking, const float co[2], float r_co[2]) { - MovieTrackingCamera *camera = &tracking->camera; + const MovieTrackingCamera *camera = &tracking->camera; + const float aspy = 1.0f / tracking->camera.pixel_aspect; libmv_CameraIntrinsicsOptions camera_intrinsics_options; - double x = co[0], y = co[1]; - float aspy = 1.0f / tracking->camera.pixel_aspect; - tracking_cameraIntrinscisOptionsFromTracking(tracking, 0, 0, &camera_intrinsics_options); + libmv_CameraIntrinsics *intrinsics = + libmv_cameraIntrinsicsNew(&camera_intrinsics_options); - libmv_cameraIntrinsicsInvert(&camera_intrinsics_options, x, y, &x, &y); + double x = co[0], y = co[1]; + libmv_cameraIntrinsicsInvert(intrinsics, x, y, &x, &y); + libmv_cameraIntrinsicsDestroy(intrinsics); r_co[0] = (float)x * camera->focal + camera->principal[0]; r_co[1] = (float)y * camera->focal + camera->principal[1] * aspy; @@ -2577,7 +2638,6 @@ static void tracking_dopesheet_calc_coverage(MovieTracking *tracking) int frames, start_frame = INT_MAX, end_frame = -INT_MAX; int *per_frame_counter; int prev_coverage, last_segment_frame; - int i; /* find frame boundaries */ for (track = tracksbase->first; track; track = track->next) { @@ -2592,9 +2652,7 @@ static void tracking_dopesheet_calc_coverage(MovieTracking *tracking) /* find per-frame markers count */ for (track = tracksbase->first; track; track = track->next) { - int i; - - for (i = 0; i < track->markersnr; i++) { + for (int i = 0; i < track->markersnr; i++) { MovieTrackingMarker *marker = &track->markers[i]; /* TODO: perhaps we need to add check for non-single-frame track here */ @@ -2611,7 +2669,7 @@ static void tracking_dopesheet_calc_coverage(MovieTracking *tracking) if (!per_frame_counter[0]) prev_coverage = TRACKING_COVERAGE_OK; - for (i = 1; i < frames; i++) { + for (int i = 1; i < frames; i++) { int coverage = coverage_from_count(per_frame_counter[i]); /* means only disabled tracks in the end, could be ignored */ |