1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef bts_RBFMAP2D_EM_H 18#define bts_RBFMAP2D_EM_H 19 20/* ---- includes ----------------------------------------------------------- */ 21 22#include "b_BasicEm/Context.h" 23#include "b_BasicEm/Basic.h" 24#include "b_BasicEm/Int16Arr.h" 25#include "b_TensorEm/Int16Vec2D.h" 26#include "b_TensorEm/Flt16Vec2D.h" 27#include "b_TensorEm/Flt16Alt2D.h" 28#include "b_TensorEm/Functions.h" 29#include "b_TensorEm/Cluster2D.h" 30#include "b_TensorEm/Int32Mat.h" 31 32/* ---- related objects --------------------------------------------------- */ 33 34/* ---- typedefs ----------------------------------------------------------- */ 35 36/* ---- constants ---------------------------------------------------------- */ 37 38/* data format version number */ 39#define bts_IRBFMAP2D_VERSION 100 40 41/* ---- object definition -------------------------------------------------- */ 42 43/** 44 * radial basis function transformation (RBF). 45 * T( x ) = A( x ) + R( x ) where, 46 * T is the resulting overall tranformation 47 * A is a possibly linear tranformation of type altTypeE 48 * R is the rbf ( non-linear ) transformation of type typeE 49 * See member declaration for more information on typeE and altTypeE. 50 * See also 51 * 'Image Warping Using few Anchor Points and Radial Functions', 52 * Nur Arad and Daniel Reisfeld, 1994 53 */ 54struct bts_RBFMap2D 55{ 56 /* ---- private data --------------------------------------------------- */ 57 58 /* ---- public data ---------------------------------------------------- */ 59 60 /** type of radial basis function (enum bts_RBFType). 61 * one of: 62 * bts_RBF_IDENTITY : no rbf deformation 63 * bts_RBF_LINEAr : linear, i.e. ||r|| 64 */ 65 int32 RBFTypeE; 66 67 /** src cluster, part of the RBF trafo */ 68 struct bts_Cluster2D srcClusterE; 69 70 /** cluster of rbf coefficients, x and y */ 71 struct bts_Cluster2D rbfCoeffClusterE; 72 73 /** type of linear transformation (enum bts_AltType) */ 74 int32 altTypeE; 75 76 /** affine linear transformation */ 77 struct bts_Flt16Alt2D altE; 78 79 /** apply only affine lnear transformation */ 80 flag altOnlyE; 81 82 /* ---- temporary data ------------------------------------------------- */ 83 84 /** matrix needed for computation of rbf coefficients */ 85 struct bts_Int32Mat matE; 86 struct bts_Int32Mat tempMatE; 87 88 /** arrays needed for computation of rbf coefficients */ 89 struct bbs_Int32Arr inVecE; 90 struct bbs_Int32Arr outVecE; 91 struct bbs_Int32Arr tempVecE; 92}; 93 94/* ---- associated objects ------------------------------------------------- */ 95 96/* ---- external functions ------------------------------------------------- */ 97 98/* ---- \ghd{ constructor/destructor } ------------------------------------- */ 99 100/** initializes RBFMap */ 101void bts_RBFMap2D_init( struct bbs_Context* cpA, 102 struct bts_RBFMap2D* ptrA ); 103 104/** destroys RBFMap */ 105void bts_RBFMap2D_exit( struct bbs_Context* cpA, 106 struct bts_RBFMap2D* ptrA ); 107 108/* ---- \ghd{ operators } -------------------------------------------------- */ 109 110/** copies RBFMap */ 111void bts_RBFMap2D_copy( struct bbs_Context* cpA, 112 struct bts_RBFMap2D* ptrA, 113 const struct bts_RBFMap2D* srcPtrA ); 114 115/** compares RBFMap */ 116flag bts_RBFMap2D_equal( struct bbs_Context* cpA, 117 const struct bts_RBFMap2D* ptrA, 118 const struct bts_RBFMap2D* srcPtrA ); 119 120/* ---- \ghd{ query functions } -------------------------------------------- */ 121 122/* ---- \ghd{ modify functions } ------------------------------------------- */ 123 124/** allocates RBFMap */ 125void bts_RBFMap2D_create( struct bbs_Context* cpA, 126 struct bts_RBFMap2D* ptrA, 127 uint32 sizeA, 128 struct bbs_MemSeg* mspA ); 129 130/** computes rbf transform from 2 given clusters of same size and bbp */ 131void bts_RBFMap2D_compute( struct bbs_Context* cpA, 132 struct bts_RBFMap2D* ptrA, 133 const struct bts_Cluster2D* srcPtrA, 134 const struct bts_Cluster2D* dstPtrA ); 135 136/* ---- \ghd{ memory I/O } ------------------------------------------------- */ 137 138/** size object needs when written to memory */ 139uint32 bts_RBFMap2D_memSize( struct bbs_Context* cpA, 140 const struct bts_RBFMap2D* ptrA ); 141 142/** writes object to memory; returns number of bytes written */ 143uint32 bts_RBFMap2D_memWrite( struct bbs_Context* cpA, 144 const struct bts_RBFMap2D* ptrA, 145 uint16* memPtrA ); 146 147/** reads object from memory; returns number of bytes read */ 148uint32 bts_RBFMap2D_memRead( struct bbs_Context* cpA, 149 struct bts_RBFMap2D* ptrA, 150 const uint16* memPtrA, 151 struct bbs_MemSeg* mspA ); 152 153/* ---- \ghd{ exec functions } --------------------------------------------- */ 154 155/** vector map operation: apply rbf to a vector */ 156struct bts_Flt16Vec2D bts_RBFMap2D_mapVector( struct bbs_Context* cpA, 157 const struct bts_RBFMap2D* ptrA, 158 struct bts_Flt16Vec2D vecA ); 159 160/** cluster map operation: apply rbf to all vectors in cluster */ 161void bts_RBFMap2D_mapCluster( struct bbs_Context* cpA, 162 const struct bts_RBFMap2D* ptrA, 163 const struct bts_Cluster2D* srcPtrA, 164 struct bts_Cluster2D* dstPtrA, 165 int32 dstBbpA ); 166 167#endif /* bts_RBFMAP2D_EM_H */ 168 169