diff options
-rw-r--r-- | extern/libmv/libmv-capi.cpp | 44 | ||||
-rw-r--r-- | extern/libmv/libmv-capi.h | 17 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_movieclip.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_tracking.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/movieclip.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 19 | ||||
-rw-r--r-- | source/blender/editors/include/ED_clip.h | 1 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_draw.c | 9 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_editor.c | 18 | ||||
-rw-r--r-- | source/blender/editors/space_clip/space_clip.c | 3 | ||||
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 5 |
11 files changed, 69 insertions, 62 deletions
diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp index 6b6ecf15908..00f140b31e6 100644 --- a/extern/libmv/libmv-capi.cpp +++ b/extern/libmv/libmv-capi.cpp @@ -261,7 +261,7 @@ static void saveBytesImage(unsigned char *data, int width, int height) } #endif -int libmv_regionTrackerTrack(libmv_RegionTracker *tracker, const float *ima1, const float *ima2, +int libmv_regionTrackerTrack(libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2, int width, int height, int half_window_size, double x1, double y1, double *x2, double *y2) { @@ -269,8 +269,8 @@ int libmv_regionTrackerTrack(libmv_RegionTracker *tracker, const float *ima1, co libmv::TrkltRegionTracker *trklt_region_tracker; libmv::FloatImage old_patch, new_patch; - trklt_region_tracker = tracker->trklt_region_tracker; - region_tracker = tracker->region_tracker; + trklt_region_tracker = libmv_tracker->trklt_region_tracker; + region_tracker = libmv_tracker->region_tracker; trklt_region_tracker->half_window_size = half_window_size; @@ -294,29 +294,29 @@ int libmv_regionTrackerTrack(libmv_RegionTracker *tracker, const float *ima1, co #endif } -void libmv_regionTrackerDestroy(libmv_RegionTracker *tracker) +void libmv_regionTrackerDestroy(libmv_RegionTracker *libmv_tracker) { - delete tracker->region_tracker; - delete tracker; + delete libmv_tracker->region_tracker; + delete libmv_tracker; } /* ************ Tracks ************ */ libmv_Tracks *libmv_tracksNew(void) { - libmv::Tracks *tracks = new libmv::Tracks(); + libmv::Tracks *libmv_tracks = new libmv::Tracks(); - return (libmv_Tracks *)tracks; + return (libmv_Tracks *)libmv_tracks; } -void libmv_tracksInsert(struct libmv_Tracks *tracks, int image, int track, double x, double y) +void libmv_tracksInsert(struct libmv_Tracks *libmv_tracks, int image, int track, double x, double y) { - ((libmv::Tracks*)tracks)->Insert(image, track, x, y); + ((libmv::Tracks*)libmv_tracks)->Insert(image, track, x, y); } -void libmv_tracksDestroy(libmv_Tracks *tracks) +void libmv_tracksDestroy(libmv_Tracks *libmv_tracks) { - delete (libmv::Tracks*)tracks; + delete (libmv::Tracks*)libmv_tracks; } /* ************ Reconstruction solver ************ */ @@ -406,7 +406,7 @@ int libmv_reporojectionCameraForImage(libmv_Reconstruction *libmv_reconstruction return 0; } -float libmv_reprojectionError(libmv_Reconstruction *libmv_reconstruction) +double libmv_reprojectionError(libmv_Reconstruction *libmv_reconstruction) { return libmv_reconstruction->error; } @@ -421,21 +421,21 @@ void libmv_destroyReconstruction(libmv_Reconstruction *libmv_reconstruction) struct libmv_Corners *libmv_detectCorners(unsigned char *data, int width, int height, int stride) { std::vector<libmv::Corner> detect= libmv::Detect(data, width, height, stride); - std::vector<libmv::Corner> *corners= new std::vector<libmv::Corner>(); + std::vector<libmv::Corner> *libmv_corners= new std::vector<libmv::Corner>(); - corners->insert(corners->begin(), detect.begin(), detect.end()); + libmv_corners->insert(libmv_corners->begin(), detect.begin(), detect.end()); - return (libmv_Corners *)corners; + return (libmv_Corners *)libmv_corners; } -int libmv_countCorners(struct libmv_Corners *corners) +int libmv_countCorners(struct libmv_Corners *libmv_corners) { - return ((std::vector<libmv::Corner> *)corners)->size(); + return ((std::vector<libmv::Corner> *)libmv_corners)->size(); } -void libmv_getCorner(struct libmv_Corners *corners, int number, float *x, float *y, float *score, float *size) +void libmv_getCorner(struct libmv_Corners *libmv_corners, int number, double *x, double *y, double *score, double *size) { - libmv::Corner corner = ((std::vector<libmv::Corner> *)corners)->at(number); + libmv::Corner corner = ((std::vector<libmv::Corner> *)libmv_corners)->at(number); *x = corner.x; *y = corner.y; @@ -443,9 +443,9 @@ void libmv_getCorner(struct libmv_Corners *corners, int number, float *x, float *size = corner.size; } -void libmv_destroyCorners(struct libmv_Corners *corners) +void libmv_destroyCorners(struct libmv_Corners *libmv_corners) { - delete (std::vector<libmv::Corner> *)corners; + delete (std::vector<libmv::Corner> *)libmv_corners; } /* ************ utils ************ */ diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h index 12881f9cb3e..c28b0f570d0 100644 --- a/extern/libmv/libmv-capi.h +++ b/extern/libmv/libmv-capi.h @@ -45,30 +45,29 @@ void libmv_setLoggingVerbosity(int verbosity); /* RegionTracker */ struct libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level, double tolerance); -int libmv_regionTrackerTrack(struct libmv_RegionTracker *tracker, const float *ima1, const float *ima2, +int libmv_regionTrackerTrack(struct libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2, int width, int height, int half_window_size, double x1, double y1, double *x2, double *y2); -void libmv_regionTrackerDestroy(struct libmv_RegionTracker *tracker); +void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker); /* Tracks */ struct libmv_Tracks *libmv_tracksNew(void); -void libmv_tracksInsert(struct libmv_Tracks *tracks, int image, int track, double x, double y); -void libmv_tracksDestroy(struct libmv_Tracks *tracks); +void libmv_tracksInsert(struct libmv_Tracks *libmv_tracks, int image, int track, double x, double y); +void libmv_tracksDestroy(struct libmv_Tracks *libmv_tracks); /* Reconstruction solver */ struct libmv_Reconstruction *libmv_solveReconstruction(struct libmv_Tracks *tracks, int keyframe1, int keyframe2, double focal_length, double principal_x, double principal_y, double k1, double k2, double k3); int libmv_reporojectionPointForTrack(struct libmv_Reconstruction *libmv_reconstruction, int track, double pos[3]); int libmv_reporojectionCameraForImage(struct libmv_Reconstruction *libmv_reconstruction, int image, double mat[4][4]); -float libmv_reprojectionError(struct libmv_Reconstruction *libmv_reconstruction); +double libmv_reprojectionError(struct libmv_Reconstruction *libmv_reconstruction); void libmv_destroyReconstruction(struct libmv_Reconstruction *libmv_reconstruction); /* feature detector */ - struct libmv_Corners *libmv_detectCorners(unsigned char *data, int width, int height, int stride); -int libmv_countCorners(struct libmv_Corners *corners); -void libmv_getCorner(struct libmv_Corners *corners, int number, float *x, float *y, float *score, float *size); -void libmv_destroyCorners(struct libmv_Corners *corners); +int libmv_countCorners(struct libmv_Corners *libmv_corners); +void libmv_getCorner(struct libmv_Corners *libmv_corners, int number, double *x, double *y, double *score, double *size); +void libmv_destroyCorners(struct libmv_Corners *libmv_corners); /* utils */ void libmv_applyCameraIntrinsics(double focal_length, double principal_x, double principal_y, double k1, double k2, double k3, diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h index 29a0a02c740..259e6ed2dca 100644 --- a/source/blender/blenkernel/BKE_movieclip.h +++ b/source/blender/blenkernel/BKE_movieclip.h @@ -50,6 +50,7 @@ void BKE_movieclip_reload(struct MovieClip *clip); struct ImBuf *BKE_movieclip_acquire_ibuf(struct MovieClip *clip, struct MovieClipUser *user); struct ImBuf *BKE_movieclip_acquire_stable_ibuf(struct MovieClip *clip, struct MovieClipUser *user, float loc[2], float *scale); void BKE_movieclip_acquire_size(struct MovieClip *clip, struct MovieClipUser *user, int *width, int *height); +void BKE_movieclip_aspect(struct MovieClip *clip, float *aspx, float *aspy); int BKE_movieclip_has_frame(struct MovieClip *clip, struct MovieClipUser *user); void BKE_movieclip_user_set_frame(struct MovieClipUser *user, int framenr); diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index a3df096f8d6..58425bb3b53 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -71,7 +71,7 @@ void BKE_tracking_sync(struct MovieTrackingContext *context); void BKE_tracking_sync_user(struct MovieClipUser *user, struct MovieTrackingContext *context); int BKE_tracking_next(struct MovieTrackingContext *context); -float BKE_tracking_solve_reconstruction(struct MovieTracking *tracking, int width, int height); +float BKE_tracking_solve_reconstruction(struct MovieTracking *tracking, int width, int height, float aspx, float aspy); void BKE_track_unique_name(struct MovieTracking *tracking, struct MovieTrackingTrack *track); struct MovieTrackingTrack *BKE_find_track_by_name(struct MovieTracking *tracking, const char *name); @@ -80,8 +80,8 @@ struct MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(struct Mo void BKE_get_tracking_mat(struct Scene *scene, float mat[4][4]); void BKE_tracking_projection_matrix(struct MovieTracking *tracking, int framenr, int winx, int winy, float mat[4][4]); -void BKE_tracking_apply_intrinsics(struct MovieTracking *tracking, float co[2], float width, float height, float nco[2]); -void BKE_tracking_invert_intrinsics(struct MovieTracking *tracking, float co[2], float width, float height, float nco[2]); +void BKE_tracking_apply_intrinsics(struct MovieTracking *tracking, float co[2], float nco[2]); +void BKE_tracking_invert_intrinsics(struct MovieTracking *tracking, float co[2], float nco[2]); void BKE_tracking_detect(struct MovieTracking *tracking, struct ImBuf *imbuf, int framenr); diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 4e1e42e0caa..40ab2273fbe 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -422,6 +422,14 @@ void BKE_movieclip_acquire_size(MovieClip *clip, MovieClipUser *user, int *width } } +void BKE_movieclip_aspect(MovieClip *clip, float *aspx, float *aspy) +{ + *aspx= *aspy= 1.0; + + /* x is always 1 */ + *aspy = clip->aspy/clip->aspx; +} + /* get segments of cached frames. useful for debugging cache policies */ void BKE_movieclip_get_cache_segments(MovieClip *clip, int *totseg_r, int **points_r) { diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 9c2a2247206..ab90bfad3b6 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -875,7 +875,7 @@ static struct libmv_Tracks *create_libmv_tracks(MovieTracking *tracking, int wid { int tracknr= 0; MovieTrackingTrack *track; - struct libmv_Tracks *tracks= libmv_tracksNew();; + struct libmv_Tracks *tracks= libmv_tracksNew(); track= tracking->tracks.first; while(track) { @@ -885,7 +885,8 @@ static struct libmv_Tracks *create_libmv_tracks(MovieTracking *tracking, int wid MovieTrackingMarker *marker= &track->markers[a]; if((marker->flag&MARKER_DISABLED)==0) - libmv_tracksInsert(tracks, marker->framenr, tracknr, marker->pos[0]*width, marker->pos[1]*height); + libmv_tracksInsert(tracks, marker->framenr, tracknr, + marker->pos[0]*width, marker->pos[1]*height); } track= track->next; @@ -988,15 +989,16 @@ static int retrive_libmv_reconstruct(MovieTracking *tracking, struct libmv_Recon #endif -float BKE_tracking_solve_reconstruction(MovieTracking *tracking, int width, int height) +float BKE_tracking_solve_reconstruction(MovieTracking *tracking, int width, int height, float aspx, float aspy) { #if WITH_LIBMV { MovieTrackingCamera *camera= &tracking->camera; - struct libmv_Tracks *tracks= create_libmv_tracks(tracking, width, height); + struct libmv_Tracks *tracks= create_libmv_tracks(tracking, width*aspx, height*aspy); struct libmv_Reconstruction *reconstruction = libmv_solveReconstruction(tracks, tracking->settings.keyframe1, tracking->settings.keyframe2, - camera->focal, camera->principal[0], camera->principal[1], + camera->focal, + camera->principal[0]*aspx, camera->principal[1]*aspy, camera->k1, camera->k2, camera->k3); float error= libmv_reprojectionError(reconstruction); @@ -1106,7 +1108,7 @@ void BKE_tracking_projection_matrix(MovieTracking *tracking, int framenr, int wi } else copy_m4_m4(mat, winmat); } -void BKE_tracking_apply_intrinsics(MovieTracking *tracking, float co[2], float width, float height, float nco[2]) +void BKE_tracking_apply_intrinsics(MovieTracking *tracking, float co[2], float nco[2]) { MovieTrackingCamera *camera= &tracking->camera; @@ -1126,7 +1128,7 @@ void BKE_tracking_apply_intrinsics(MovieTracking *tracking, float co[2], float w #endif } -void BKE_tracking_invert_intrinsics(MovieTracking *tracking, float co[2], float width, float height, float nco[2]) +void BKE_tracking_invert_intrinsics(MovieTracking *tracking, float co[2], float nco[2]) { MovieTrackingCamera *camera= &tracking->camera; @@ -1186,8 +1188,7 @@ void BKE_tracking_detect(MovieTracking *tracking, ImBuf *ibuf, int framenr) a= libmv_countCorners(corners); while(a--) { MovieTrackingTrack *track; - - float x, y, size, score; + double x, y, size, score; libmv_getCorner(corners, a, &x, &y, &score, &size); diff --git a/source/blender/editors/include/ED_clip.h b/source/blender/editors/include/ED_clip.h index 1d06b4709e6..13f222fb136 100644 --- a/source/blender/editors/include/ED_clip.h +++ b/source/blender/editors/include/ED_clip.h @@ -46,7 +46,6 @@ void ED_space_clip_set(struct bContext *C, struct SpaceClip *sc, struct MovieCli struct MovieClip *ED_space_clip(struct SpaceClip *sc); void ED_space_clip_size(struct SpaceClip *sc, int *width, int *height); void ED_space_clip_zoom(struct SpaceClip *sc, ARegion *ar, float *zoomx, float *zoomy); -void ED_clip_aspect(struct MovieClip *clip, float *aspx, float *aspy); void ED_space_clip_aspect(struct SpaceClip *sc, float *aspx, float *aspy); struct ImBuf *ED_space_clip_acquire_buffer(struct SpaceClip *sc); diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index a4ed17c3409..19114dcad6d 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -750,7 +750,7 @@ static void draw_distorion_grid(MovieTracking *tracking, int width, int height) for(y= 0; y<=n; y++) { for(x= 0; x<=n; x++) { - BKE_tracking_invert_intrinsics(tracking, pos, width, height, grid[y][x]); + BKE_tracking_invert_intrinsics(tracking, pos, grid[y][x]); grid[y][x][0]/= width; grid[y][x][1]/= height; @@ -870,12 +870,13 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip, } if(sc->flag&SC_SHOW_BUNDLES) { - float pos[4], vec[4], mat[4][4]; + float pos[4], vec[4], mat[4][4], aspx, aspy; glEnable(GL_POINT_SMOOTH); glPointSize(3.0f); - BKE_tracking_projection_matrix(tracking, framenr, width, height, mat); + BKE_movieclip_aspect(clip, &aspx, &aspy); + BKE_tracking_projection_matrix(tracking, framenr, width*aspx, height*aspy, mat); track= tracking->tracks.first; while(track) { @@ -891,7 +892,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip, pos[0]= (pos[0]/(pos[3]*2.0f)+0.5f)*width; pos[1]= (pos[1]/(pos[3]*2.0f)+0.5f)*height; - BKE_tracking_apply_intrinsics(tracking, pos, width, height, pos); + BKE_tracking_apply_intrinsics(tracking, pos, pos); vec[0]= (marker->pos[0]+track->offset[0])*width; vec[1]= (marker->pos[1]+track->offset[1])*height; diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c index ed8ac00beeb..6f6c08c3bf7 100644 --- a/source/blender/editors/space_clip/clip_editor.c +++ b/source/blender/editors/space_clip/clip_editor.c @@ -124,20 +124,14 @@ void ED_space_clip_zoom(SpaceClip *sc, ARegion *ar, float *zoomx, float *zoomy) *zoomy= (float)(ar->winrct.ymax - ar->winrct.ymin + 1)/(float)((ar->v2d.cur.ymax - ar->v2d.cur.ymin)*height); } -void ED_clip_aspect(MovieClip *clip, float *aspx, float *aspy) -{ - *aspx= *aspy= 1.0; - - if(clip == NULL || clip->aspx==0.0f || clip->aspy==0.0f) - return; - - /* x is always 1 */ - *aspy = clip->aspy/clip->aspx; -} - void ED_space_clip_aspect(SpaceClip *sc, float *aspx, float *aspy) { - ED_clip_aspect(ED_space_clip(sc), aspx, aspy); + MovieClip *clip= ED_space_clip(sc); + + if(clip) + BKE_movieclip_aspect(clip, aspx, aspy); + else + *aspx= *aspy= 1.f; } void ED_clip_update_frame(const Main *mainp, int cfra) diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index 86b65e59b39..597f0c32b60 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -391,6 +391,9 @@ static void clip_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "CLIP_OT_join_tracks", JKEY, KM_PRESS, KM_CTRL, 0); + kmi= WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); + RNA_string_set(kmi->ptr, "data_path", "space_data.use_mute_footage"); + transform_keymap_for_space(keyconf, keymap, SPACE_CLIP); } diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index eb5e34928d2..ef3bdc45e6f 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -1465,7 +1465,7 @@ static int solve_camera_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); MovieTracking *tracking= &clip->tracking; int width, height; - float error; + float error, aspx, aspy; if(!check_solve_track_count(tracking)) { BKE_report(op->reports, RPT_ERROR, "At least 10 tracks on both of keyframes are needed for reconstruction"); @@ -1474,8 +1474,9 @@ static int solve_camera_exec(bContext *C, wmOperator *op) /* could fail if footage uses images with different sizes */ BKE_movieclip_acquire_size(clip, NULL, &width, &height); + BKE_movieclip_aspect(clip, &aspx, &aspy); - error= BKE_tracking_solve_reconstruction(tracking, width, height); + error= BKE_tracking_solve_reconstruction(tracking, width, height, aspx, aspy); if(error<0) BKE_report(op->reports, RPT_WARNING, "Some data failed to reconstruct, see console for details"); |