/* * Copyright (C) 2008 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. */ #ifndef bts_RBFMAP2D_EM_H #define bts_RBFMAP2D_EM_H /* ---- includes ----------------------------------------------------------- */ #include "b_BasicEm/Context.h" #include "b_BasicEm/Basic.h" #include "b_BasicEm/Int16Arr.h" #include "b_TensorEm/Int16Vec2D.h" #include "b_TensorEm/Flt16Vec2D.h" #include "b_TensorEm/Flt16Alt2D.h" #include "b_TensorEm/Functions.h" #include "b_TensorEm/Cluster2D.h" #include "b_TensorEm/Int32Mat.h" /* ---- related objects --------------------------------------------------- */ /* ---- typedefs ----------------------------------------------------------- */ /* ---- constants ---------------------------------------------------------- */ /* data format version number */ #define bts_IRBFMAP2D_VERSION 100 /* ---- object definition -------------------------------------------------- */ /** * radial basis function transformation (RBF). * T( x ) = A( x ) + R( x ) where, * T is the resulting overall tranformation * A is a possibly linear tranformation of type altTypeE * R is the rbf ( non-linear ) transformation of type typeE * See member declaration for more information on typeE and altTypeE. * See also * 'Image Warping Using few Anchor Points and Radial Functions', * Nur Arad and Daniel Reisfeld, 1994 */ struct bts_RBFMap2D { /* ---- private data --------------------------------------------------- */ /* ---- public data ---------------------------------------------------- */ /** type of radial basis function (enum bts_RBFType). * one of: * bts_RBF_IDENTITY : no rbf deformation * bts_RBF_LINEAr : linear, i.e. ||r|| */ int32 RBFTypeE; /** src cluster, part of the RBF trafo */ struct bts_Cluster2D srcClusterE; /** cluster of rbf coefficients, x and y */ struct bts_Cluster2D rbfCoeffClusterE; /** type of linear transformation (enum bts_AltType) */ int32 altTypeE; /** affine linear transformation */ struct bts_Flt16Alt2D altE; /** apply only affine lnear transformation */ flag altOnlyE; /* ---- temporary data ------------------------------------------------- */ /** matrix needed for computation of rbf coefficients */ struct bts_Int32Mat matE; struct bts_Int32Mat tempMatE; /** arrays needed for computation of rbf coefficients */ struct bbs_Int32Arr inVecE; struct bbs_Int32Arr outVecE; struct bbs_Int32Arr tempVecE; }; /* ---- associated objects ------------------------------------------------- */ /* ---- external functions ------------------------------------------------- */ /* ---- \ghd{ constructor/destructor } ------------------------------------- */ /** initializes RBFMap */ void bts_RBFMap2D_init( struct bbs_Context* cpA, struct bts_RBFMap2D* ptrA ); /** destroys RBFMap */ void bts_RBFMap2D_exit( struct bbs_Context* cpA, struct bts_RBFMap2D* ptrA ); /* ---- \ghd{ operators } -------------------------------------------------- */ /** copies RBFMap */ void bts_RBFMap2D_copy( struct bbs_Context* cpA, struct bts_RBFMap2D* ptrA, const struct bts_RBFMap2D* srcPtrA ); /** compares RBFMap */ flag bts_RBFMap2D_equal( struct bbs_Context* cpA, const struct bts_RBFMap2D* ptrA, const struct bts_RBFMap2D* srcPtrA ); /* ---- \ghd{ query functions } -------------------------------------------- */ /* ---- \ghd{ modify functions } ------------------------------------------- */ /** allocates RBFMap */ void bts_RBFMap2D_create( struct bbs_Context* cpA, struct bts_RBFMap2D* ptrA, uint32 sizeA, struct bbs_MemSeg* mspA ); /** computes rbf transform from 2 given clusters of same size and bbp */ void bts_RBFMap2D_compute( struct bbs_Context* cpA, struct bts_RBFMap2D* ptrA, const struct bts_Cluster2D* srcPtrA, const struct bts_Cluster2D* dstPtrA ); /* ---- \ghd{ memory I/O } ------------------------------------------------- */ /** size object needs when written to memory */ uint32 bts_RBFMap2D_memSize( struct bbs_Context* cpA, const struct bts_RBFMap2D* ptrA ); /** writes object to memory; returns number of bytes written */ uint32 bts_RBFMap2D_memWrite( struct bbs_Context* cpA, const struct bts_RBFMap2D* ptrA, uint16* memPtrA ); /** reads object from memory; returns number of bytes read */ uint32 bts_RBFMap2D_memRead( struct bbs_Context* cpA, struct bts_RBFMap2D* ptrA, const uint16* memPtrA, struct bbs_MemSeg* mspA ); /* ---- \ghd{ exec functions } --------------------------------------------- */ /** vector map operation: apply rbf to a vector */ struct bts_Flt16Vec2D bts_RBFMap2D_mapVector( struct bbs_Context* cpA, const struct bts_RBFMap2D* ptrA, struct bts_Flt16Vec2D vecA ); /** cluster map operation: apply rbf to all vectors in cluster */ void bts_RBFMap2D_mapCluster( struct bbs_Context* cpA, const struct bts_RBFMap2D* ptrA, const struct bts_Cluster2D* srcPtrA, struct bts_Cluster2D* dstPtrA, int32 dstBbpA ); #endif /* bts_RBFMAP2D_EM_H */