Android 4.3/4.4 上 Google PhotoSphere 背后的算法

2024-03-09

Android 4.3/4.4上的相机应用程序在“球形模式”下可以将不同方向的照片拼接成一张球形全景图,质量非常好。

结果说明:

  • http://i-cdn.phonearena.com/images/articles/73441-image/google-nexus-4-photo-sphere.jpg http://i-cdn.phonearena.com/images/articles/73441-image/google-nexus-4-photo-sphere.jpg
  • http://www.studio8apps.com/wp-content/uploads/2013/05/glass_team_pano_resized.jpg http://www.studio8apps.com/wp-content/uploads/2013/05/glass_team_pano_resized.jpg

我要做的是为 iPad 实现一个具有完全相同功能的应用程序。

我尝试了两种方法:

OpenCV 2.4.8

OpenCV 2.4.8 提供了一个图像拼接管道,乍一看似乎非常有前途。然而,它有两个问题:

  1. 该管道处理无序的输入照片,据我所知,它仅使用图像特征匹配来定位照片之间的几何关系,并且当对空白照片(例如白墙、蓝天)进行图像特征提取失败时,该管道表现不佳。然而,iPad可以提供每张拍摄照片的任意空间方向数据(尽管有噪声),但我不知道如何在OpenCV拼接管道中利用这些数据。

  2. 我找不到像 PhotoSphere 使用此管道生成 180x360 度全景图的方法。向管道提供各个方向的照片只会产生具有弯曲图像边界的大全景。

全景工具

我还尝试了PanoTools/Hugin lib,虽然这个lib支持预定义的照片方向,但结果很差且不稳定。另外我尝试使用焦点(测试版) https://github.com/xplodwild/android_packages_apps_Focal app ,其球体模式也基于 PanoTools/Hugin,他们的结果(在球体模式下)似乎并不比我们的好。


我的问题:

  1. 是否有任何库可以完成 Google PhotoSphere 的功能?由于我不为商业用途而开发,因此任何开源库都是可以接受的。
  2. 有什么好的算法(或者技术报告、学者论文)可用吗?如果有的话,哪一个最好?
  3. Google 如何实现自己的 PhotoSphere?任何建议表示赞赏。

我认为这个答案与其说是一个解决方案,不如说是进一步研究的资源。


为了大致了解此功能涉及哪种算法,我们可以研究负责它的共享对象(DLL,如果您更喜欢 Windows 术语)。通过列出函数名称并在我们最喜欢的搜索引擎中查找它们,我们得到了一些有趣的结果:

  • The 相关源文件 https://android.googlesource.com/platform/packages/apps/Camera/+/master/jni/feature_mos/src/mosaic/在提到的存储库中在之前的回答中 https://stackoverflow.com/a/23561949/3372061。具体参见Mosaic.h https://android.googlesource.com/platform/packages/apps/Camera/+/master/jni/feature_mos/src/mosaic/Mosaic.h
  • 受此代码启发的其他项目,例如Mozilla 的全景相机设计 https://wiki.mozilla.org/PanoramaCameraDesign.

我们鼓励本文的读者仔细阅读下面的函数列表,并了解提到的各种算法和转换。


以下是我获取此列表所遵循的步骤:

  1. 我找到了三星相机应用程序的端口[src] https://nerdschalk.com/photo-sphere-camera-ported-galaxy-camera/.
  2. 在档案中我注意到一个名为libjni_mosaic.so(据我最好的猜测)它负责马赛克拼接(“光球层”)。
  3. 我列出了这个文件中的函数(使用nm or llvm_objdump来自安卓NDK https://developer.android.com/ndk; 更多信息 https://stackoverflow.com/a/34796/3372061):
         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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 4.3/4.4 上 Google PhotoSphere 背后的算法 的相关文章

  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
  • 加密成本高,解密成本低

    我希望该用户 攻击者加密数据并发送给服务器 现在我想要一种与标准算法完全相反的算法 使用快 难以解密 即很难使用服务器发送的密钥来加密密码等数据 以防止随机攻击 但很容易解密这样服务器在验证用户时消耗的时间非常少 但是对于攻击者来说 每次使
  • 按百分比减少多边形面积

    我有一个由点 x y 组成的多边形 我想做的是将其减少一个百分比 请记住 我不想只是扩大规模 多边形应该有一种内部边界 其宽度取决于百分比 该内部边界被多边形切断 谁知道可以实现这一目标的算法 输入 点数组 百分比 输出 点数组 你所寻求的
  • Exposé 布局算法

    我正在制作一些项目 其布局类似于 Mac OS X 在 Expos 中对窗口所做的操作 它适应项目的长宽比和可用区域的长宽比 基本上 可用区域分为行和列 每个单元格 行和列的交集 中放置一个项目 这些项目必须保持其纵横比 此处width h
  • 字符串排序真的是 O(n^2logn) 吗? [复制]

    这个问题在这里已经有答案了 我读了以下内容 排序需要 O NlogN 那么它怎么是 O N 2logN 我们在这里想念的是 两个字符串的比较不是 O 1 在最坏的情况下 需要 在 所以最终的复杂度是O N 2logN 它是否正确 我一直认为
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想

随机推荐