The algorithm behind Google's PhotoSphere on Android 4.3/4.4
Asked Answered
E

1

23

The camera app on Android 4.3/4.4 under the 'Sphere mode' can stitch photos from varied directions into one spherical panorama, with very good quality.

Results illustration:

What I'm going to do is to implement an application for iPad with exactly the same functionality.

I tried two approaches:

OpenCV 2.4.8

OpenCV 2.4.8 provides with an image stitching pipeline which seems very promising at first glance. However, it has two problems:

  1. The pipeline deals with unordered input photos, as far as I know it only uses image feature matching to locate the geometric relations between photos, and the pipeline performs poorly when image feature extraction fails on blank photos (eg. white wall, blue sky). However, iPad can provide the arbitrary spatial direction data of each taken photo (with noise though), but I don't know how to utilize these data in the OpenCV stitching pipeline.

  2. I couldn't find a way to generate a 180x360 degree panorama like PhotoSphere does using this pipeline. Feeding the pipeline with photos in all directions only produces a large panorama with curved image boundary.

PanoTools

I also tried the PanoTools/Hugin lib, although this lib supports predefined photo directions, the result is quite poor and unstable. Additionally I tried using the Focal(beta) app on Google Play, whose sphere mode is also based on PanoTools/Hugin, their results (in sphere mode) seems no better than ours.


My questions:

  1. Are there any libraries which can do what Google's PhotoSphere does? Since I don't develop for commercial use, any open-source libs are acceptable.
  2. Are there any good algorithms (or technical reports, scholar papers) available? If there are any, which one is the best?
  3. How Google implements their own PhotoSphere ? Any suggestion is appreciated.
Epiblast answered 10/2, 2014 at 16:25 Comment(5)
Hi, I am looking for the same. Did you make any advance?Loar
Have you found something to deal with photosphere?Sheehy
Here's a library for you: github.com/robbykraft/PanoramaSamaria
I get very unstable results using Google Camera, almost always some frames are very misaligned. I don't think it has some unique algorithm, although it has good UI that uses accelerometer and compass to determine when to take photo and to show sphere coverage.Alleviator
Has someone found any solution?Clathrate
K
3

I consider this answer not so much a solution, but a resource for further research.


To get a very general sense of what sort of algorithms were involved in this functionality, we can study the shared object (DLL if you prefer Windows lingo) responsible for it. By listing the function names and looking them up in our favorite search engine we get several interesting hits:

Readers of this post are encouraged to go over the list of functions below and learn about the various algorithms and transformations mentioned.


Below are the steps I followed to get this list:

  1. I found a port of the camera app to Samsung [src].
  2. Inside the archive I noticed a file called libjni_mosaic.so which (to my best guess) takes care of the mosaic stitching ("photosphere").
  3. I listed the functions in this file (using nm or llvm_objdump from the Android NDK; more info):
         U acos
00006f6d T AddFrame
         U __aeabi_atexit
         U __aeabi_idiv
         U __aeabi_uidivmod
         U __aeabi_unwind_cpp_pr0
         U __aeabi_unwind_cpp_pr1
000326a0 B AffineWarpPoint_BL_LUT_x
00032888 B AffineWarpPoint_BL_LUT_y
000322d0 B AffineWarpPoint_NN_LUT_x
000324b8 B AffineWarpPoint_NN_LUT_y
00008939 T AllocateTextureMemory
         U __android_log_print
         U asin
00031008 D blendingType
00031138 A __bss_start
00031488 B buffer
00031478 B c
         U calloc
         U ceil
000073ad T ConvertYVUAiToPlanarYVU
         U cos
         U __cxa_finalize
         U __cxa_pure_virtual
000072b9 T decodeYUV444SP
00032a70 B __dso_handle
00031138 A _edata
00032a80 A _end
         U fclose
00007019 T Finalize
00030d88 D __FINI_ARRAY__
         U floor
         U fopen
         U fprintf
         U fread
         U free
00009589 T FreeTextureMemory
         U fscanf
         U fwrite
00031f40 B gBuffer
00031df0 B gBufferInput
00032048 B gBufferInputYVU
00031474 B gCancelComputation
00031d88 B gCenterOffsetX
00031d90 B gCenterOffsetY
00031e68 B gCurrentFBOIndex
00031fb8 B g_dAffinetrans
00032198 B g_dAffinetransGL
00031010 D g_dAffinetransIdentGL
00031948 B g_dAffinetransPan
00031ca8 B g_dAffinetransPanGL
000310e0 D g_dAffinetransRotation90GL
00031068 D g_dIdent3x3
00032250 B g_dTranslationToFBOCenter
00031900 B g_dTranslationToFBOCenterGL
00006e89 T GenerateQuarterResImagePlanar
         U gettimeofday
00031120 D g_iIndices
00031128 D g_iIndices2
00031130 D g_iIndices3
00031050 D gIsLandscapeOrientation
00031d30 B gK
00032078 B gKinv
00031f70 B gKm
00031d98 B gKminv
         U glActiveTexture
00031ce8 B gLastH1t
00031d80 B gLastTx
         U glAttachShader
         U glBindFramebuffer
         U glBindTexture
         U glCheckFramebufferStatus
         U glClear
         U glClearColor
         U glCompileShader
         U glCreateProgram
         U glCreateShader
         U glDeleteProgram
         U glDeleteShader
         U glDisable
         U glDrawElements
         U glEnableVertexAttribArray
         U glFramebufferTexture2D
         U glGenFramebuffers
         U glGenTextures
         U glGetAttribLocation
         U glGetError
         U glGetProgramInfoLog
         U glGetProgramiv
         U glGetShaderInfoLog
         U glGetShaderiv
         U glGetUniformLocation
         U glLinkProgram
         U glPixelStorei
         U glReadPixels
         U glShaderSource
         U glTexImage2D
         U glTexParameterf
         U glTexParameteri
         U glUniform1i
         U glUniformMatrix4fv
         U glUseProgram
         U glVertexAttribPointer
         U glViewport
00031aa0 B gPanOffset
0003100c D gPanViewfinder
000319cc B gPreview
00032038 B gPreviewFBOHeight
000319c8 B gPreviewFBOWidth
00032040 B gPreviewImage
00031de8 B gPreviewImageHeight
000318fc B gPreviewImage_semaphore
00031d78 B gPreviewImageWidth
00031890 B gProgress
00031090 D gRotation90
00031de0 B gSurfaceTextureID
00031aa8 B gSurfTexRenderer
00031e20 B gThisH1t
00031940 B gThisTx
000318b8 B gTRS
00031058 D gUILayoutScalingX
00031060 D gUILayoutScalingY
00031e6c B gWarper1
000320c0 B gWarper2
000310d8 D gWarpImage
000321d8 B gYVURenderer
000318e8 B height
000318f8 B high_res
00006d39 T Init
00030ca4 D __INIT_ARRAY__
00007201 T Java_com_android_camera_Mosaic_allocateMosaicMemory
00007809 T Java_com_android_camera_Mosaic_createMosaic
0000728d T Java_com_android_camera_Mosaic_freeMosaicMemory
000079b9 T Java_com_android_camera_Mosaic_getFinalMosaic
00007b1d T Java_com_android_camera_Mosaic_getFinalMosaicNV21
000095e1 T Java_com_android_camera_MosaicRenderer_init
00009bed T Java_com_android_camera_MosaicRenderer_preprocess
000097b9 T Java_com_android_camera_MosaicRenderer_reset
00009f81 T Java_com_android_camera_MosaicRenderer_setWarping
00009e1d T Java_com_android_camera_MosaicRenderer_step
00009c4d T Java_com_android_camera_MosaicRenderer_transferGPUtoCPU
0000a09d T Java_com_android_camera_MosaicRenderer_updateMatrix
000077b5 T Java_com_android_camera_Mosaic_reportProgress
00007779 T Java_com_android_camera_Mosaic_reset
00007761 T Java_com_android_camera_Mosaic_setBlendingType
000075ad T Java_com_android_camera_Mosaic_setSourceImage
000073dd T Java_com_android_camera_Mosaic_setSourceImageFromGPU
0000776d T Java_com_android_camera_Mosaic_setStripType
000095b9 T JNI_OnLoad
000095d5 T JNI_OnUnload
         U log
         U malloc
         U memcpy
         U memmove
         U memset
00031480 B mosaic
00031470 B mosaicHeight
00031898 B mosaicWidth
0002cbdc T __on_dlclose
         U pow
         U printf
         U putchar
         U puts
00031888 B quarter_res
000318b0 B resultBGR
000318a8 B resultYVU
         U sem_destroy
         U sem_init
         U sem_post
         U sem_wait
         U __sF
         U sin
         U sqrt
00031140 B stripType
000318a0 B tHeight
00031000 D thresh_still
00031150 B tImage
000318f0 B tWidth
00008129 T UpdateWarpTransformation
0002c545 T vp_cascade_motion
0002c7c1 T vp_copy_motion
0002c4f5 T vp_invert_motion
0002c7d1 T vp_motion_cornerdiff
0002caf1 T vp_zoom_motion2d
00031144 B width
000070e1 T YUV420toYVU24
00007169 T YUV420toYVU24_NEW
00028b09 T db_SolveCubic(double*, int*, double, double, double, double)
00023ef1 T db_CopyImage_u(unsigned char**, unsigned char const* const*, int, int, int)
00023ed9 T db_FreeImage_f(float**, int)
00023ed9 T db_FreeImage_u(unsigned char**, int)
0000a385 T normProjMat33d(double (*) [3])
00023d99 T db_AllocImage_f(int, int, int)
00023e41 T db_AllocImage_u(int, int, int)
00028e61 T db_SolveQuartic(double*, int*, double, double, double, double, double)
00019a79 T db_FillBuckets_f(float*, float const* const*, db_Bucket_f**, int, int, int, int, int, double const*, double const*, int)
00019bb5 T db_FillBuckets_u(short*, unsigned char const* const*, db_Bucket_u**, int, int, int, int, int, double const*, double const*, int, int, int)
000198b9 T db_FreeBuckets_f(db_Bucket_f**, int, int)
00019915 T db_FreeBuckets_u(db_Bucket_u**, int, int)
00007f1d T ClearPreviewImage(int)
00024491 T db_AlignPointer_f(float*, unsigned long)
00024491 T db_AlignPointer_s(short*, unsigned long)
000195b1 T db_AllocBuckets_f(int, int, int)
00019629 T db_AllocBuckets_u(int, int, int)
000241a1 T db_Approx3DCalMat(double*, double*, int, int, double, int)
0001b729 W db_EigenVector4x4(double*, double, double const*)
00019a49 T db_EmptyBuckets_f(db_Bucket_f**, int, int)
00019a49 T db_EmptyBuckets_u(db_Bucket_u**, int, int)
0001aa39 T db_MatchBuckets_f(db_Bucket_f**, db_Bucket_f**, int, int, unsigned long, unsigned long)
0001ac1d T db_MatchBuckets_u(db_Bucket_u**, db_Bucket_u**, int, int, unsigned long, unsigned long, int, bool, int)
00023f1d T db_WarpImageLut_u(unsigned char const* const*, unsigned char**, int, int, float const* const*, float const* const*, int)
00007ec9 T bindSurfaceTexture(unsigned int)
00007e45 T checkGLErrorDetail(char const*, int, char const*)
00007ff9 T continuePanningFBO(double)
00024a79 T db_CholeskyBacksub(double*, double const* const*, double const*, int, double const*)
00024341 T db_LeanQuickSelect(double const*, long, long, double*)
0001af7d T db_CollectMatches_f(db_Bucket_f**, int, int, unsigned long, int*, int*, int*)
0001af7d T db_CollectMatches_u(db_Bucket_u**, int, int, unsigned long, int*, int*, int*)
00013bb1 T db_HarrisStrength_f(float**, float const* const*, int, int, float*, int)
00014051 T db_HarrisStrength_u(float**, unsigned char const* const*, int, int, int*)
00024f7d T db_Orthogonalize6x7(double*, int)
000261e5 T db_Orthogonalize8x9(double*, int)
000245b1 T db_CholeskyDecomp6x6(double*, double*)
00024141 T db_PrintDoubleMatrix(double*, long, long)
00024105 T db_PrintDoubleVector(double*, long)
00018521 T AffineWarpPointOffset(float&, float&, double*, int, int)
00024c91 T db_CholeskyBacksub3x3(double*, double const*, double const*, double const*)
00024d55 T db_CholeskyBacksub6x6(double*, double const*, double const*, double const*)
000244a9 W db_OrthogonalizePair9(double*, double const*, double)
00021d81 T db_RobImageHomography(double*, double*, double*, int, double*, double*, double*, int*, int, db_stat_struct*, int, int, double, int, int, int, double*, double*, double*, double*, int*)
00016071 W db_ScalarProduct128_s(short const*, short const*)
000290d9 T db_SolveQuarticForced(double*, int*, double, double, double, double, double)
00007d39 T checkFramebufferStatus(char const*)
00013b99 T db_FreeStrengthImage_f(float*, float**, int)
00007f81 T ConvertAffine3x3toGL4x4(double*, double*)
00013a51 T db_AllocStrengthImage_f(float**, int, int)
000242ed T db_LeanPartitionOnPivot(double, double*, double const*, long, long, long*, long*)
00014c71 T db_MaxImage_Aligned16_f(float**, int, int, int, int)
000096f5 T calculateUILayoutScaling(int, int, bool)
0001e9b9 T db_RobCamRotation_Polish(double*, int, double*, double*, double, int, double)
0001d509 T db_StitchSimilarity2DRaw(double*, double*, double*, double**, double**, int, int, int, int, int)
0001bf21 T db_StitchSimilarity3DRaw(double*, double*, double*, double**, double**, int, int, int, int, int)
0001a259 T db_FillBucketsPrewarped_f(float*, float const* const*, db_Bucket_f**, int, int, int, int, int, double const*, double const*, int, double const*)
0001a405 T db_FillBucketsPrewarped_u(short*, unsigned char const* const*, db_Bucket_u**, int, int, int, int, int, double const*, double const*, int, double const*)
00023c69 T db_SetupImageReferences_f(float*, int, int)
00023d09 T db_SetupImageReferences_u(unsigned char*, int, int)
0001cac1 T db_StitchAffine2D_3Points(double*, double*, double*, double*, double*, double*, double*)
00015139 T db_ExtractCornersSaturated(float**, int, int, int, int, int, int, unsigned long, float, double*, double*, double*, int*)
0001db19 W db_RobImageHomography_Cost(double*, int, double*, double*, double)
00027ea1 T db_NullVectorOrthonormal6x7(double*, double const*)
00028369 T db_NullVectorOrthonormal8x9(double*, double const*)
0001c2d9 T db_StitchProjective2D_4Points(double*, double*, double*, double*, double*, double*, double*, double*, double*)
00016b3d W db_ScalarProduct128Aligned16_f(float const*, float const*)
0001a5c9 T db_FillBucketsPrewarpedAffine_u(short*, unsigned char const* const*, db_Bucket_u**, int, int, int, int, int, double const*, double const*, int, double const*, double const*, int const*, int)
0001e061 W db_RobImageHomography_Jacobians(double*, double*, double*, int, double*, double*, double)
0001bbb9 W db_RotationFromMOuterProductSum(double*, double*, double*)
0001f169 T db_RobCamRotation_Polish_Generic(double*, int, int, double*, double*, double, int, double)
00024971 T db_CholeskyDecompSeparateDiagonal(double**, double*, int)
00024b5d T db_CholeskyDecomp3x3SeparateDiagonal(double*, double*)
00014e9d T db_MaxSuppressFilter_5x5_Aligned16_f(float**, float**, int, int, int, int, float*)
00018905 W db_SignedSquareNormCorr11x11_PreAlign_f(float*, float const* const*, int, int, float*, float*)
00017831 W db_SignedSquareNormCorr11x11_PreAlign_u(short*, unsigned char const* const*, int, int, float*, float*)
00018699 T db_SignedSquareNormCorr5x5Aligned_Post_s(short const*, short const*, float, float)
00018651 T db_SignedSquareNormCorr11x11Aligned_Post_s(short const*, short const*, float, float)
00018565 T db_SignedSquareNormCorr21x21Aligned_Post_s(short const*, short const*, float, float)
0001cf89 T db_StitchRotationCommonFocalLength_3Points(double*, double*, double*, double*, double*, double*, double*, double*, int)
0000a409 T det33d(double const (*) [3])
0000a459 T inv33d(double const (*) [3], double (*) [3])
000242d1 T db_Zero(double*, long)
0000a249 T mult33d(double (*) [3], double (*) [3], double (*) [3])
         U operator delete[](void*)
         U operator delete(void*)
000105cd T ImageUtils::allocateImage(int, int, int, short)
00010451 T ImageUtils::readBinaryPPM(char const*, int&, int&)
00010525 T ImageUtils::writeBinaryPPM(unsigned char*, char const*, int, int, int)
00010151 T ImageUtils::imageTypeToRowPointers(unsigned char*, int, int)
0000ff09 T ImageUtils::rgb2yvu(unsigned char*, unsigned char*, int, int)
00010319 T ImageUtils::yvu2bgr(unsigned char*, unsigned char*, int, int)
000101e1 T ImageUtils::yvu2rgb(unsigned char*, unsigned char*, int, int)
00010019 T ImageUtils::rgb2gray(unsigned char*, int, int)
000100c1 T ImageUtils::rgb2gray(unsigned char*, unsigned char*, int, int)
0000fe09 T ImageUtils::rgba2yvu(unsigned char*, unsigned char*, int, int)
000105e1 T ImageUtils::freeImage(unsigned char*)
000123e1 T FrameBuffer::CreateBuffers()
0001226d T FrameBuffer::InitializeGLContext()
000122ad T FrameBuffer::Init(int, int, unsigned int)
00012255 T FrameBuffer::Reset()
00012231 T FrameBuffer::FrameBuffer()
00012231 T FrameBuffer::FrameBuffer()
00012219 T FrameBuffer::~FrameBuffer()
00012209 T FrameBuffer::~FrameBuffer()
00012209 T FrameBuffer::~FrameBuffer()
00012129 T YVURenderer::DrawTexture()
00012035 T YVURenderer::InitializeGLProgram()
00012111 T YVURenderer::YVURenderer()
00012111 T YVURenderer::YVURenderer()
000120f1 T YVURenderer::~YVURenderer()
000120d9 T YVURenderer::~YVURenderer()
000120d9 T YVURenderer::~YVURenderer()
0001b449 T db_Matcher_f::Init(int, int, double, int)
0001b40d T db_Matcher_f::Clean()
0001b5a1 T db_Matcher_f::Match(float const* const*, float const* const*, double const*, double const*, int, double const*, double const*, int, int*, int*, int*, double const*)
0001b3c1 T db_Matcher_f::db_Matcher_f()
0001b3c1 T db_Matcher_f::db_Matcher_f()
0001b3cd T db_Matcher_f::~db_Matcher_f()
0001b3cd T db_Matcher_f::~db_Matcher_f()
0001b71d T db_Matcher_u::IsAllocated()
000196a1 T db_Matcher_u::Init(int, int, double, int, double, bool, int)
00019971 T db_Matcher_u::Clean()
0001b019 T db_Matcher_u::Match(unsigned char const* const*, unsigned char const* const*, double const*, double const*, int, double const*, double const*, int, int*, int*, int*, double const*, int)
0001b6e5 T db_Matcher_u::operator=(db_Matcher_u const&)
0001b6a1 T db_Matcher_u::db_Matcher_u(db_Matcher_u const&)
0001b675 T db_Matcher_u::db_Matcher_u()
0001b6a1 T db_Matcher_u::db_Matcher_u(db_Matcher_u const&)
0001b675 T db_Matcher_u::db_Matcher_u()
00019a01 T db_Matcher_u::~db_Matcher_u()
000199b1 T db_Matcher_u::~db_Matcher_u()
000199b1 T db_Matcher_u::~db_Matcher_u()
00010c51 T PyramidShort::calcStorage(unsigned short, unsigned short, unsigned short, int, int*)
0001113d T PyramidShort::BorderExpand(PyramidShort*, int, int)
00011529 T PyramidShort::BorderReduce(PyramidShort*, int)
00010c89 T PyramidShort::BorderSpread(PyramidShort*, int, int, int, int)
00010be5 T PyramidShort::allocateImage(unsigned short, unsigned short, unsigned short)
00010d89 T PyramidShort::BorderExpandOdd(PyramidShort*, PyramidShort*, PyramidShort*, int)
000111cd T PyramidShort::BorderReduceOdd(PyramidShort*, PyramidShort*, PyramidShort*)
00010b25 T PyramidShort::allocatePyramidPacked(unsigned short, unsigned short, unsigned short, unsigned short)
00010c49 T PyramidShort::freeImage(PyramidShort*)
00011b71 T WarpRenderer::DrawTexture(float*)
00011af1 T WarpRenderer::SetScalingMatrix(float, float)
00011a39 T WarpRenderer::SetViewportMatrix(int, int, int, int)
0001190d T WarpRenderer::InitializeGLProgram()
00011a21 T WarpRenderer::WarpRenderer()
00011a21 T WarpRenderer::WarpRenderer()
00011a01 T WarpRenderer::~WarpRenderer()
000119e9 T WarpRenderer::~WarpRenderer()
000119e9 T WarpRenderer::~WarpRenderer()
00015781 T db_CornerDetector_f::Init(int, int, int, int, int, double, double)
0001574d T db_CornerDetector_f::Clean()
000158b9 T db_CornerDetector_f::Start(int, int, int, int, unsigned long, double, double, int)
00015709 T db_CornerDetector_f::db_CornerDetector_f()
00015709 T db_CornerDetector_f::db_CornerDetector_f()
00015715 T db_CornerDetector_f::~db_CornerDetector_f()
00015715 T db_CornerDetector_f::~db_CornerDetector_f()
00013a0d T db_CornerDetector_u::ExtractCorners(float**, double*, double*, int*)
00015f31 T db_CornerDetector_u::Init(int, int, int, int, int, double, double)
00012645 T db_CornerDetector_u::Clean()
00015ea9 T db_CornerDetector_u::Start(int, int, int, int, unsigned long, double, double)
00015ff1 T db_CornerDetector_u::operator=(db_CornerDetector_u const&)
0001602d T db_CornerDetector_u::db_CornerDetector_u(db_CornerDetector_u const&)
00015e91 T db_CornerDetector_u::db_CornerDetector_u()
0001602d T db_CornerDetector_u::db_CornerDetector_u(db_CornerDetector_u const&)
00015e91 T db_CornerDetector_u::db_CornerDetector_u()
0001267d T db_CornerDetector_u::~db_CornerDetector_u()
000126c9 T db_CornerDetector_u::~db_CornerDetector_u()
000126c9 T db_CornerDetector_u::~db_CornerDetector_u()
00011f39 T SurfaceTextureRenderer::DrawTexture(float*)
00011f31 T SurfaceTextureRenderer::SetSTMatrix(float*)
00011eb1 T SurfaceTextureRenderer::SetScalingMatrix(float, float)
00011df9 T SurfaceTextureRenderer::SetViewportMatrix(int, int, int, int)
00011c9d T SurfaceTextureRenderer::InitializeGLProgram()
00011dc1 T SurfaceTextureRenderer::SurfaceTextureRenderer()
00011dc1 T SurfaceTextureRenderer::SurfaceTextureRenderer()
00011da1 T SurfaceTextureRenderer::~SurfaceTextureRenderer()
00011d89 T SurfaceTextureRenderer::~SurfaceTextureRenderer()
00011d89 T SurfaceTextureRenderer::~SurfaceTextureRenderer()
0002b4f1 T db_StabilizationSmoother::smoothMotion(VP_MOTION*, VP_MOTION*)
0002b6f9 T db_StabilizationSmoother::smoothMotion(VP_MOTION*, VP_MOTION*, double)
0002bcf1 T db_StabilizationSmoother::smoothMotion1(VP_MOTION*, VP_MOTION*, VP_MOTION*, VP_MOTION*, double)
0002be8d T db_StabilizationSmoother::is_point_in_rect(double, double, double, double, double, double)
0002b8b1 T db_StabilizationSmoother::smoothMotionAdaptive(int, int, VP_MOTION*, VP_MOTION*)
0002aa45 T db_StabilizationSmoother::Init()
0002b4e5 T db_StabilizationSmoother::db_StabilizationSmoother()
0002b4e5 T db_StabilizationSmoother::db_StabilizationSmoother()
0000ecb9 T db_StabilizationSmoother::~db_StabilizationSmoother()
0000ecb9 T db_StabilizationSmoother::~db_StabilizationSmoother()
0002a1d9 T db_FrameToReferenceRegistration::SmoothMotion()
00029c89 T db_FrameToReferenceRegistration::ComputeInliers(double*)
00029f09 T db_FrameToReferenceRegistration::SelectOutliers()
0002a479 T db_FrameToReferenceRegistration::UpdateReference(unsigned char const* const*, bool, bool)
00029efd T db_FrameToReferenceRegistration::ComputeCostArray()
0002991d T db_FrameToReferenceRegistration::Get_H_dref_to_ins(double*)
000298d1 T db_FrameToReferenceRegistration::Get_H_dref_to_ref(double*)
00029a89 T db_FrameToReferenceRegistration::Set_H_dref_to_ins(double*)
00029c51 T db_FrameToReferenceRegistration::NeedReferenceUpdate()
0002a141 T db_FrameToReferenceRegistration::SetOutlierThreshold()
0002a071 T db_FrameToReferenceRegistration::ComputeCostHistogram()
00029c19 T db_FrameToReferenceRegistration::ResetDisplayReference()
00029f9d T db_FrameToReferenceRegistration::EstimateSecondaryModel(double*)
0002a379 T db_FrameToReferenceRegistration::GenerateQuarterResImage(unsigned char const* const*)
00029669 T db_FrameToReferenceRegistration::Init(int, int, int, int, bool, bool, double, unsigned int, bool, double, int, int, int, double, bool, int, int)
00029539 T db_FrameToReferenceRegistration::Clean()
00029ce5 T db_FrameToReferenceRegistration::Polish(int*, int&)
0002a62d T db_FrameToReferenceRegistration::AddFrame(unsigned char const* const*, double*, bool, bool)
00029425 T db_FrameToReferenceRegistration::db_FrameToReferenceRegistration()
00029425 T db_FrameToReferenceRegistration::db_FrameToReferenceRegistration()
00029641 T db_FrameToReferenceRegistration::~db_FrameToReferenceRegistration()
00029641 T db_FrameToReferenceRegistration::~db_FrameToReferenceRegistration()
0000ab05 T Align::getLastTRS(double (*) [3])
0000a619 T Align::initialize(int, int, bool, float)
0000aae1 T Align::addFrameRGB(unsigned char*)
0000a611 T Align::getRegProfileString()
0000a7b1 T Align::addFrame(unsigned char*)
0000a545 T Align::Align()
0000a545 T Align::Align()
0000a5f9 T Align::~Align()
0000a5f9 T Align::~Align()
0000ac6d T Blend::initialize(int, int, int, int)
0000b301 T Blend::ComputeMask(CSite*, BlendRect&, BlendRect&, MosaicRect&, YUVinfo&, int)
0000c429 T Blend::ClipBlendRect(CSite*, BlendRect&)
0000c2a1 T Blend::FrameToMosaic(double (*) [3], double, double, double&, double&)
0000b54d T Blend::MosaicToFrame(double (*) [3], double, double, double&, double&)
0000af4d T Blend::CropFinalMosaic(YUVinfo&, MosaicRect&)
0000c5d9 T Blend::DoMergeAndBlend(MosaicFrame**, int, int, int, YUVinfo&, MosaicRect&, MosaicRect&, float&, bool&)
0000ad71 T Blend::MosaicSizeCheck(float, float)
0000ae05 T Blend::FillFramePyramid(MosaicFrame*)
0000ca39 T Blend::FrameToMosaicRect(int, int, double (*) [3], BlendRect&)
0000ad25 T Blend::AlignToMiddleFrame(MosaicFrame**, int)
0000affd T Blend::PerformFinalBlending(YUVinfo&, MosaicRect&)
0000cc81 T Blend::SelectRelevantFrames(MosaicFrame**, int, MosaicFrame**, int&)
0000e181 T Blend::ComputeBlendParameters(MosaicFrame**, int, int)
0000b6a9 T Blend::ProcessPyramidForThisFrame(CSite*, BlendRect&, BlendRect&, MosaicRect&, YUVinfo&, double (*) [3], int)
0000b2dd T Blend::RoundingCroppingSizeToMultipleOf8(MosaicRect&)
0000ce01 T Blend::runBlend(MosaicFrame**, MosaicFrame**, int, unsigned char*&, int&, int&, float&, bool&)
0000ac2d T Blend::Blend()
0000ac2d T Blend::Blend()
0000ac45 T Blend::~Blend()
0000ac45 T Blend::~Blend()
000107a1 T Mosaic::initialize(int, int, int, int, int, bool, float)
0001098d T Mosaic::addFrameRGB(unsigned char*)
00010ac1 T Mosaic::createMosaic(float&, bool&)
000109f1 T Mosaic::balanceRotations()
000108ed T Mosaic::addFrame(unsigned char*)
000109d9 T Mosaic::getMosaic(int&, int&)
000106e9 T Mosaic::Mosaic()
000106e9 T Mosaic::Mosaic()
00010721 T Mosaic::~Mosaic()
00010721 T Mosaic::~Mosaic()
000105e5 T YUVinfo::allocateImage(unsigned short, unsigned short)
00010695 T YUVinfo::mapYUVInfoToImage(YUVinfo*, unsigned char*)
000115fd T Renderer::loadShader(unsigned int, char const*)
00011691 T Renderer::createProgram(char const*, char const*)
00011791 T Renderer::SetupGraphics(int, int)
000117fd T Renderer::SetupGraphics(FrameBuffer*)
000118d5 T Renderer::GetTextureName()
000118b1 T Renderer::InitializeGLContext()
000118d9 T Renderer::SetInputTextureName(unsigned int)
000118dd T Renderer::SetInputTextureType(unsigned int)
000118e1 T Renderer::SetInputTextureDimensions(int, int)
00011879 T Renderer::Clear(float, float, float, float)
000115b9 T Renderer::Renderer()
000115b9 T Renderer::Renderer()
000115a1 T Renderer::~Renderer()
00011591 T Renderer::~Renderer()
00011591 T Renderer::~Renderer()
0000ee45 T CDelaunay::deleteEdge(short)
0000eef9 T CDelaunay::freeMemory()
0000eec1 T CDelaunay::allocMemory(int)
0000ed81 T CDelaunay::connectLeft(short, short)
0000fd59 T CDelaunay::triangulate(SEdgeVector**, int, int, int)
0000ede5 T CDelaunay::connectRight(short, short)
0000fc41 T CDelaunay::constructList(short, int, int)
0000fd91 T CDelaunay::linkNeighbors(SEdgeVector*, int, int)
0000ef0d T CDelaunay::deleteAllEdges()
0000ef49 T CDelaunay::consolidateEdges()
0000faf1 T CDelaunay::buildTriangulation(int)
0000f4d9 T CDelaunay::ccw(short, short, short)
0000f8cd T CDelaunay::build(int, int, short*, short*, int)
0000e771 T CDelaunay::cmpev(int, int)
0000e7e9 T CDelaunay::copyev(int, int)
0000e7fd T CDelaunay::copysp(int, int)
0000ed2d T CDelaunay::splice(short, short)
0000e7c1 T CDelaunay::swapev(int, int)
0000e781 T CDelaunay::swapsp(int, int)
0000e8b1 T CDelaunay::xcmpsp(int, int)
0000e825 T CDelaunay::ycmpsp(int, int)
0000f529 T CDelaunay::doMerge(short*, short, short, short*)
0000f0fd T CDelaunay::rcssort(int, int, int, int (CDelaunay::*)(int, int), void (CDelaunay::*)(int, int), void (CDelaunay::*)(int, int))
0000f035 T CDelaunay::spsortx(short*, int, int)
0000f099 T CDelaunay::spsorty(short*, int, int)
0000ef39 T CDelaunay::freeEdge(short)
0000f439 T CDelaunay::incircle(short, short, short, short)
0000ecbd T CDelaunay::makeEdge(short, short)
0000ef19 T CDelaunay::allocEdge()
0000ecb9 T CDelaunay::CDelaunay()
0000ecb9 T CDelaunay::CDelaunay()
0000ecb9 T CDelaunay::~CDelaunay()
0000ecb9 T CDelaunay::~CDelaunay()
         U operator new[](unsigned int)
000118d5 T FrameBuffer::GetTextureName() const
00012411 T FrameBuffer::GetFrameBufferName() const
00012419 T FrameBuffer::GetWidth() const
00012415 T FrameBuffer::GetFormat() const
0001241d T FrameBuffer::GetHeight() const
0001201d T YVURenderer::VertexShaderSource() const
00012029 T YVURenderer::FragmentShaderSource() const
000118f5 T WarpRenderer::VertexShaderSource() const
00011901 T WarpRenderer::FragmentShaderSource() const
00015971 T db_CornerDetector_f::DetectCorners(float const* const*, double*, double*, int*) const
00012cc5 T db_CornerDetector_u::DetectCorners(unsigned char const* const*, double*, double*, int*, unsigned char const* const*, unsigned char) const
00011c85 T SurfaceTextureRenderer::VertexShaderSource() const
00011c91 T SurfaceTextureRenderer::FragmentShaderSource() const
         U operator new(unsigned int)
00030d30 D vtable for FrameBuffer
00030d10 D vtable for YVURenderer
00030d68 D vtable for db_Matcher_u
00030cd0 D vtable for WarpRenderer
00030d40 D vtable for db_CornerDetector_u
00030cf0 D vtable for SurfaceTextureRenderer
00030cb0 D vtable for Renderer
Kneel answered 21/3, 2023 at 15:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.