[Bf-blender-cvs] [788e74f] libmv_prediction: Libmv: Support disabled color channels in trackign settings
Sergey Sharybin
noreply at git.blender.org
Thu Oct 30 18:05:49 CET 2014
Commit: 788e74f5b901541599e25bf9a0ddf5ac815863db
Author: Sergey Sharybin
Date: Thu Oct 30 22:03:19 2014 +0500
Branches: libmv_prediction
https://developer.blender.org/rB788e74f5b901541599e25bf9a0ddf5ac815863db
Libmv: Support disabled color channels in trackign settings
This was never ported to a new trackign pipeline and now it's done
using FrameAccessor::Transform routines. Quite striaghtforward, but
i've changed order of grayscale conversion in blender side with call
of transform callback. This way it's much easier to perform rescaling
in libmv side.
===================================================================
M extern/libmv/intern/tracksN.cc
M extern/libmv/intern/tracksN.h
M extern/libmv/libmv/autotrack/autotrack.cc
M extern/libmv/libmv/autotrack/frame_accessor.h
M extern/libmv/libmv/autotrack/marker.h
M source/blender/blenkernel/intern/tracking_auto.c
M source/blender/blenkernel/intern/tracking_util.c
===================================================================
diff --git a/extern/libmv/intern/tracksN.cc b/extern/libmv/intern/tracksN.cc
index 9d68bce..a573478 100644
--- a/extern/libmv/intern/tracksN.cc
+++ b/extern/libmv/intern/tracksN.cc
@@ -54,6 +54,7 @@ void libmv_apiMarkerToMarker(const libmv_Marker& libmv_marker,
marker->reference_frame = libmv_marker.reference_frame;
marker->model_type = (Marker::ModelType) libmv_marker.model_type;
marker->model_id = libmv_marker.model_id;
+ marker->visible_channels = libmv_marker.visible_channels;
}
void libmv_markerToApiMarker(const Marker& marker,
@@ -78,6 +79,7 @@ void libmv_markerToApiMarker(const Marker& marker,
libmv_marker->reference_frame = marker.reference_frame;
libmv_marker->model_type = (libmv_MarkerModelType) marker.model_type;
libmv_marker->model_id = marker.model_id;
+ libmv_marker->visible_channels = marker.visible_channels;
}
libmv_TracksN* libmv_tracksNewN(void) {
diff --git a/extern/libmv/intern/tracksN.h b/extern/libmv/intern/tracksN.h
index ea8b3e8..12549bd 100644
--- a/extern/libmv/intern/tracksN.h
+++ b/extern/libmv/intern/tracksN.h
@@ -60,6 +60,12 @@ typedef enum libmv_MarkerModelType {
LIBMV_MARKER_MODEL_TYPE_CUBE,
} libmv_MarkerModelType;
+enum libmv_MarkerChannel {
+ LIBMV_MARKER_CHANNEL_R = (1 << 0),
+ LIBMV_MARKER_CHANNEL_G = (1 << 1),
+ LIBMV_MARKER_CHANNEL_B = (1 << 2),
+};
+
typedef struct libmv_Marker {
int clip;
int frame;
@@ -75,6 +81,7 @@ typedef struct libmv_Marker {
int reference_frame;
libmv_MarkerModelType model_type;
int model_id;
+ int visible_channels;
} libmv_Marker;
#ifdef __cplusplus
diff --git a/extern/libmv/libmv/autotrack/autotrack.cc b/extern/libmv/libmv/autotrack/autotrack.cc
index ea5e2f7..4a02031 100644
--- a/extern/libmv/libmv/autotrack/autotrack.cc
+++ b/extern/libmv/libmv/autotrack/autotrack.cc
@@ -24,6 +24,7 @@
#include "libmv/autotrack/quad.h"
#include "libmv/autotrack/frame_accessor.h"
#include "libmv/autotrack/predict_tracks.h"
+#include "libmv/base/scoped_ptr.h"
#include "libmv/logging/logging.h"
#include "libmv/numeric/numeric.h"
@@ -31,6 +32,48 @@ namespace mv {
namespace {
+class DisableChannelsTransform : public FrameAccessor::Transform {
+ public:
+ DisableChannelsTransform(int visible_channels)
+ : visible_channels_(visible_channels) { }
+
+ int64_t key() const {
+ // We invert bits here so key is never null.
+ return !visible_channels_;
+ }
+
+ void run(const FloatImage& input, FloatImage* output) const {
+ bool disable_red = (visible_channels_ & Marker::CHANNEL_R) == 0,
+ disable_green = (visible_channels_ & Marker::CHANNEL_G) == 0,
+ disable_blue = (visible_channels_ & Marker::CHANNEL_B) == 0;
+
+ LG << "Disabling channels: "
+ << (disable_red ? "R " : "")
+ << (disable_green ? "G " : "")
+ << (disable_blue ? "B" : "");
+
+ // It's important to rescale the resultappropriately so that e.g. if only
+ // blue is selected, it's not zeroed out.
+ float scale = (disable_red ? 0.0f : 0.2126f) +
+ (disable_green ? 0.0f : 0.7152f) +
+ (disable_blue ? 0.0f : 0.0722f);
+
+ output->Resize(input.Width(), input.Height(), 1);
+ for (int y = 0; y < input.Height(); y++) {
+ for (int x = 0; x < input.Width(); x++) {
+ float r = disable_red ? 0.0f : input(x, y, 0);
+ float g = disable_green ? 0.0f : input(x, y, 1);
+ float b = disable_blue ? 0.0f : input(x, y, 2);
+ (*output)(x, y, 0) = (0.2126f * r + 0.7152f * g + 0.0722f * b) / scale;
+ }
+ }
+ }
+
+ private:
+ // Bitfield representing visible channels, bits are from Marker::Channel.
+ int visible_channels_;
+};
+
template<typename QuadT, typename ArrayT>
void QuadToArrays(const QuadT& quad, ArrayT* x, ArrayT* y) {
for (int i = 0; i < 4; ++i) {
@@ -56,12 +99,18 @@ FrameAccessor::Key GetImageForMarker(const Marker& marker,
// do rounding here.
// Ideally we would need to pass IntRegion to the frame accessor.
Region region = marker.search_region.Rounded();
+ libmv::scoped_ptr<FrameAccessor::Transform> transform = NULL;
+ if (marker.visible_channels != (Marker::CHANNEL_R |
+ Marker::CHANNEL_G |
+ Marker::CHANNEL_B)) {
+ transform.reset(new DisableChannelsTransform(marker.visible_channels));
+ }
return frame_accessor->GetImage(marker.clip,
marker.frame,
FrameAccessor::MONO,
0, // No downscale for now.
®ion,
- NULL,
+ transform.get(),
image);
}
diff --git a/extern/libmv/libmv/autotrack/frame_accessor.h b/extern/libmv/libmv/autotrack/frame_accessor.h
index e788bb8..8de5d86 100644
--- a/extern/libmv/libmv/autotrack/frame_accessor.h
+++ b/extern/libmv/libmv/autotrack/frame_accessor.h
@@ -41,6 +41,7 @@ using libmv::FloatImage;
// implementations to cache filtered image pieces).
struct FrameAccessor {
struct Transform {
+ virtual ~Transform() { }
// The key should depend on the transform arguments. Must be non-zero.
virtual int64_t key() const = 0;
diff --git a/extern/libmv/libmv/autotrack/marker.h b/extern/libmv/libmv/autotrack/marker.h
index dc73de8..394ec97 100644
--- a/extern/libmv/libmv/autotrack/marker.h
+++ b/extern/libmv/libmv/autotrack/marker.h
@@ -104,6 +104,15 @@ struct Marker {
// TODO(keir): Add a "int model_argument" to capture that e.g. a marker is on
// the 3rd face of a cube.
+ // Channels from the original frame which this marker is able to see.
+ enum Channel {
+ CHANNEL_R = (1 << 0),
+ CHANNEL_G = (1 << 1),
+ CHANNEL_B = (1 << 2),
+ };
+
+ int visible_channels;
+
// Offset everything (center, patch, search) by the given delta.
template<typename T>
void Offset(const T& offset) {
diff --git a/source/blender/blenkernel/intern/tracking_auto.c b/source/blender/blenkernel/intern/tracking_auto.c
index 2cd13a9..f344e60 100644
--- a/source/blender/blenkernel/intern/tracking_auto.c
+++ b/source/blender/blenkernel/intern/tracking_auto.c
@@ -183,6 +183,11 @@ static void dna_marker_to_libmv_marker(/*const*/ MovieTrackingTrack *track,
marker->framenr - 1 :
marker->framenr;
}
+
+ libmv_marker->visible_channels =
+ ((track->flag & TRACK_DISABLE_RED) ? 0 : LIBMV_MARKER_CHANNEL_R) |
+ ((track->flag & TRACK_DISABLE_GREEN) ? 0 : LIBMV_MARKER_CHANNEL_G) |
+ ((track->flag & TRACK_DISABLE_BLUE) ? 0 : LIBMV_MARKER_CHANNEL_B);
}
static void libmv_marker_to_dna_marker(libmv_Marker *libmv_marker,
diff --git a/source/blender/blenkernel/intern/tracking_util.c b/source/blender/blenkernel/intern/tracking_util.c
index 250b575..505f705 100644
--- a/source/blender/blenkernel/intern/tracking_util.c
+++ b/source/blender/blenkernel/intern/tracking_util.c
@@ -754,19 +754,6 @@ static ImBuf *accessor_get_ibuf(TrackingImageAccessor *accessor,
ibuf->y / (1 << downscale));
}
- if (input_mode == LIBMV_IMAGE_MODE_RGBA) {
- BLI_assert(ibuf->channels == 3 || ibuf->channels == 4);
- /* pass */
- }
- else /* if (input_mode == LIBMV_IMAGE_MODE_MONO) */ {
- ImBuf *grayscale_ibuf = make_grayscale_ibuf_copy(final_ibuf);
- if (final_ibuf != orig_ibuf) {
- /* We dereference original frame later. */
- IMB_freeImBuf(final_ibuf);
- }
- final_ibuf = grayscale_ibuf;
- }
-
if (transform != NULL) {
libmv_FloatImage input_image, output_image;
ibuf_to_float_image(final_ibuf, &input_image);
@@ -780,6 +767,21 @@ static ImBuf *accessor_get_ibuf(TrackingImageAccessor *accessor,
libmv_floatImageDestroy(&output_image);
}
+ if (input_mode == LIBMV_IMAGE_MODE_RGBA) {
+ BLI_assert(ibuf->channels == 3 || ibuf->channels == 4);
+ /* pass */
+ }
+ else /* if (input_mode == LIBMV_IMAGE_MODE_MONO) */ {
+ if (final_ibuf->channels != 1) {
+ ImBuf *grayscale_ibuf = make_grayscale_ibuf_copy(final_ibuf);
+ if (final_ibuf != orig_ibuf) {
+ /* We dereference original frame later. */
+ IMB_freeImBuf(final_ibuf);
+ }
+ final_ibuf = grayscale_ibuf;
+ }
+ }
+
/* it's possible processing stil didn't happen at this point,
* but we really need a copy of the buffer to be transformed
* and to be put to the cache.
More information about the Bf-blender-cvs
mailing list