summaryrefslogtreecommitdiffstats
path: root/jni_mosaic/feature_mos/src/mosaic/Blend.h
diff options
context:
space:
mode:
Diffstat (limited to 'jni_mosaic/feature_mos/src/mosaic/Blend.h')
-rw-r--r--jni_mosaic/feature_mos/src/mosaic/Blend.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/jni_mosaic/feature_mos/src/mosaic/Blend.h b/jni_mosaic/feature_mos/src/mosaic/Blend.h
new file mode 100644
index 000000000..2c7ee5c5f
--- /dev/null
+++ b/jni_mosaic/feature_mos/src/mosaic/Blend.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+///////////////////////////////////////////////////
+// Blend.h
+// $Id: Blend.h,v 1.23 2011/06/24 04:22:14 mbansal Exp $
+
+#ifndef BLEND_H
+#define BLEND_H
+
+#include "MosaicTypes.h"
+#include "Pyramid.h"
+#include "Delaunay.h"
+
+#define BLEND_RANGE_DEFAULT 6
+#define BORDER 8
+
+// Percent of total mosaicing time spent on each of the following operations
+const float TIME_PERCENT_ALIGN = 20.0;
+const float TIME_PERCENT_BLEND = 75.0;
+const float TIME_PERCENT_FINAL = 5.0;
+
+// This threshold determines the minimum separation between the image centers
+// of the input image frames for them to be accepted for blending in the
+// STRIP_TYPE_WIDE mode.
+const float STRIP_SEPARATION_THRESHOLD_PXLS = 10;
+
+// This threshold determines the number of pixels on either side of the strip
+// to cross-fade using the images contributing to each seam.
+const float STRIP_CROSS_FADE_WIDTH_PXLS = 2;
+// This specifies the maximum pyramid level to which cross-fading is applied.
+// The original image resolution is Level-0, half of that size is Level-1 and
+// so on. BLEND_RANGE_DEFAULT specifies the number of pyramid levels used by
+// the blending algorithm.
+const int STRIP_CROSS_FADE_MAX_PYR_LEVEL = 2;
+
+/**
+ * Class for pyramid blending a mosaic.
+ */
+class Blend {
+
+public:
+
+ static const int BLEND_TYPE_NONE = -1;
+ static const int BLEND_TYPE_FULL = 0;
+ static const int BLEND_TYPE_PAN = 1;
+ static const int BLEND_TYPE_CYLPAN = 2;
+ static const int BLEND_TYPE_HORZ = 3;
+
+ static const int STRIP_TYPE_THIN = 0;
+ static const int STRIP_TYPE_WIDE = 1;
+
+ static const int BLEND_RET_ERROR = -1;
+ static const int BLEND_RET_OK = 0;
+ static const int BLEND_RET_ERROR_MEMORY = 1;
+ static const int BLEND_RET_CANCELLED = -2;
+
+ Blend();
+ ~Blend();
+
+ int initialize(int blendingType, int stripType, int frame_width, int frame_height);
+
+ int runBlend(MosaicFrame **frames, MosaicFrame **rframes, int frames_size, ImageType &imageMosaicYVU,
+ int &mosaicWidth, int &mosaicHeight, float &progress, bool &cancelComputation);
+
+protected:
+
+ PyramidShort *m_pFrameYPyr;
+ PyramidShort *m_pFrameUPyr;
+ PyramidShort *m_pFrameVPyr;
+
+ PyramidShort *m_pMosaicYPyr;
+ PyramidShort *m_pMosaicUPyr;
+ PyramidShort *m_pMosaicVPyr;
+
+ CDelaunay m_Triangulator;
+ CSite *m_AllSites;
+
+ BlendParams m_wb;
+
+ // Height and width of individual frames
+ int width, height;
+
+ // Height and width of mosaic
+ unsigned short Mwidth, Mheight;
+
+ // Helper functions
+ void FrameToMosaic(double trs[3][3], double x, double y, double &wx, double &wy);
+ void MosaicToFrame(double trs[3][3], double x, double y, double &wx, double &wy);
+ void FrameToMosaicRect(int width, int height, double trs[3][3], BlendRect &brect);
+ void ClipBlendRect(CSite *csite, BlendRect &brect);
+ void AlignToMiddleFrame(MosaicFrame **frames, int frames_size);
+
+ int DoMergeAndBlend(MosaicFrame **frames, int nsite, int width, int height, YUVinfo &imgMos, MosaicRect &rect, MosaicRect &cropping_rect, float &progress, bool &cancelComputation);
+ void ComputeMask(CSite *csite, BlendRect &vcrect, BlendRect &brect, MosaicRect &rect, YUVinfo &imgMos, int site_idx);
+ void ProcessPyramidForThisFrame(CSite *csite, BlendRect &vcrect, BlendRect &brect, MosaicRect &rect, YUVinfo &imgMos, double trs[3][3], int site_idx);
+
+ int FillFramePyramid(MosaicFrame *mb);
+
+ // TODO: need to add documentation about the parameters
+ void ComputeBlendParameters(MosaicFrame **frames, int frames_size, int is360);
+ void SelectRelevantFrames(MosaicFrame **frames, int frames_size,
+ MosaicFrame **relevant_frames, int &relevant_frames_size);
+
+ int PerformFinalBlending(YUVinfo &imgMos, MosaicRect &cropping_rect);
+ void CropFinalMosaic(YUVinfo &imgMos, MosaicRect &cropping_rect);
+
+private:
+ static const float LIMIT_SIZE_MULTIPLIER = 5.0f * 2.0f;
+ static const float LIMIT_HEIGHT_MULTIPLIER = 2.5f;
+ int MosaicSizeCheck(float sizeMultiplier, float heightMultiplier);
+ void RoundingCroppingSizeToMultipleOf8(MosaicRect& rect);
+};
+
+#endif