17f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 27f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 37f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 47f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * you may not use this file except in compliance with the License. 67f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * You may obtain a copy of the License at 77f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 87f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * 107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * See the License for the specific language governing permissions and 147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * limitations under the License. 157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- includes ----------------------------------------------------------- */ 187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h" 207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Math.h" 217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_ImageEm/Functions.h" 227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BitFeatureEm/LocalScanDetector.h" 237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** applies PCA mapping 357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Input and output clusters may be identical 367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */ 377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_pcaMap( struct bbs_Context* cpA, 387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbf_LocalScanDetector* ptrA, 397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_IdCluster2D* inClusterPtrA, 407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_IdCluster2D* outClusterPtrA ) 417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_DEF_fNameL( "bbf_LocalScanDetector_pcaMap" ) 437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Cluster2D* tmpCl1PtrL = ( struct bts_Cluster2D* )&ptrA->tmpCluster1E; 457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Cluster2D* tmpCl2PtrL = ( struct bts_Cluster2D* )&ptrA->tmpCluster2E; 467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_RBFMap2D* rbfPtrL = ( struct bts_RBFMap2D* )&ptrA->rbfMapE; 477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Flt16Alt2D altL; 487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 outBbpL = inClusterPtrA->clusterE.bbpE; 497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL, jL; 507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* setup two equivalent clusters holding the essential (alt-free) moves to be handled by PCA */ 527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_IdCluster2D_convertToEqivalentClusters( cpA, 537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project inClusterPtrA, 547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project &ptrA->pcaClusterE, 557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project tmpCl1PtrL, 567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project tmpCl2PtrL ); 577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project altL = bts_Cluster2D_alt( cpA, tmpCl1PtrL, tmpCl2PtrL, bts_ALT_RIGID ); 597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_transform( cpA, tmpCl1PtrL, altL ); 607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_RBFMap2D_compute( cpA, rbfPtrL, tmpCl2PtrL, tmpCl1PtrL ); 617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_RBFMap2D_mapCluster( cpA, rbfPtrL, &ptrA->pcaClusterE.clusterE, tmpCl1PtrL, 6/* ! */ ); 627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* PCA projection: cluster1 -> cluster1 */ 647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* mat elements: 8.8 */ 667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const int16* matPtrL = ptrA->pcaMatE.arrPtrE; 677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* same bbp as pca cluster */ 697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const int16* avgPtrL = ptrA->pcaAvgE.arrPtrE; 707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int16Vec2D* vecArrL = tmpCl1PtrL->vecArrE; 727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* projected vector */ 747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 prjVecL[ bpi_LOCAL_SCAN_DETECTOR_MAX_PCA_DIM ]; 757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* width of matrix */ 777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16 matWidthL = tmpCl1PtrL->sizeE * 2; 787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->pcaDimSubSpaceE > bpi_LOCAL_SCAN_DETECTOR_MAX_PCA_DIM ) 807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR1( "%s:\nbpi_RF_LANDMARKER_MAX_PCA_DIM exceeded", fNameL ); 827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return; 837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* forward trafo */ 867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->pcaDimSubSpaceE; iL++ ) 877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 sumL = 0; 897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project avgPtrL = ptrA->pcaAvgE.arrPtrE; 907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < tmpCl1PtrL->sizeE; jL++ ) 917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sumL += matPtrL[ 0 ] * ( vecArrL[ jL ].xE - avgPtrL[ 0 ] ); 937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sumL += matPtrL[ 1 ] * ( vecArrL[ jL ].yE - avgPtrL[ 1 ] ); 947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project avgPtrL += 2; 957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project matPtrL += 2; 967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project prjVecL[ iL ] = ( sumL + 128 ) >> 8; 987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project matPtrL = ptrA->pcaMatE.arrPtrE; 1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project avgPtrL = ptrA->pcaAvgE.arrPtrE; 1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecArrL = tmpCl1PtrL->vecArrE; 1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* backward trafo */ 1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( jL = 0; jL < tmpCl1PtrL->sizeE; jL++ ) 1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 sumL = 0; 1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->pcaDimSubSpaceE; iL++ ) 1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sumL += matPtrL[ iL * matWidthL + 0 ] * prjVecL[ iL ]; 1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecArrL[ jL ].xE = ( ( sumL + 128 ) >> 8 ) + avgPtrL[ 0 ]; 1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sumL = 0; 1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->pcaDimSubSpaceE; iL++ ) 1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sumL += matPtrL[ iL * matWidthL + 1 ] * prjVecL[ iL ]; 1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecArrL[ jL ].yE = ( ( sumL + 128 ) >> 8 ) + avgPtrL[ 1 ]; 1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project matPtrL += 2; 1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project avgPtrL += 2; 1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* ALT backtransformation */ 1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_IdCluster2D_copy( cpA, outClusterPtrA, &ptrA->pcaClusterE ); 1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_copyTransform( cpA, &outClusterPtrA->clusterE, tmpCl1PtrL, bts_Flt16Alt2D_inverted( &altL ), outBbpL ); 1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */ 1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_init( struct bbs_Context* cpA, 1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbf_LocalScanDetector* ptrA ) 1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_memset16( ptrA->ftrPtrArrE, 0, bbs_SIZEOF16( ptrA->ftrPtrArrE ) ); 1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_RBFMap2D_init( cpA, &ptrA->rbfMapE ); 1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_init( cpA, &ptrA->tmpCluster1E ); 1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_init( cpA, &ptrA->tmpCluster2E ); 1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_init( cpA, &ptrA->tmpCluster3E ); 1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_init( cpA, &ptrA->tmpCluster4E ); 1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_LocalScanner_init( cpA, &ptrA->scannerE ); 1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int32Arr_init( cpA, &ptrA->actArrE ); 1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_init( cpA, &ptrA->idxArrE ); 1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_UInt8Arr_init( cpA, &ptrA->workImageBufE ); 1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageWidthE = 0; 1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageHeightE = 0; 1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->patchWidthE = 0; 1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->patchHeightE = 0; 1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scanWidthE = 0; 1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scanHeightE = 0; 1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scaleExpE = 0; 1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->interpolatedWarpingE = TRUE; 1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->warpScaleThresholdE = 0; 1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_IdCluster2D_init( cpA, &ptrA->refClusterE ); 1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_init( cpA, &ptrA->scanClusterE ); 1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_UInt16Arr_init( cpA, &ptrA->ftrDataArrE ); 1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_BitParam_init( cpA, &ptrA->bitParamE ); 1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->outlierDistanceE = 0; 1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_IdCluster2D_init( cpA, &ptrA->pcaClusterE ); 1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_init( cpA, &ptrA->pcaAvgE ); 1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_init( cpA, &ptrA->pcaMatE ); 1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->pcaDimSubSpaceE = 0; 1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageWidthE = 0; 1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageHeightE = 0; 1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_exit( struct bbs_Context* cpA, 1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbf_LocalScanDetector* ptrA ) 1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16 iL; 1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) bbf_featureExit( cpA, ptrA->ftrPtrArrE[ iL ] ); 1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_memset16( ptrA->ftrPtrArrE, 0, bbs_SIZEOF16( ptrA->ftrPtrArrE ) ); 1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_RBFMap2D_exit( cpA, &ptrA->rbfMapE ); 1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_exit( cpA, &ptrA->tmpCluster1E ); 1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_exit( cpA, &ptrA->tmpCluster2E ); 1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_exit( cpA, &ptrA->tmpCluster3E ); 1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_exit( cpA, &ptrA->tmpCluster4E ); 1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_LocalScanner_exit( cpA, &ptrA->scannerE ); 1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int32Arr_exit( cpA, &ptrA->actArrE ); 1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_exit( cpA, &ptrA->idxArrE ); 1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_UInt8Arr_exit( cpA, &ptrA->workImageBufE ); 1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageWidthE = 0; 1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageHeightE = 0; 1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->patchWidthE = 0; 2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->patchHeightE = 0; 2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scanWidthE = 0; 2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scanHeightE = 0; 2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scaleExpE = 0; 2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->interpolatedWarpingE = TRUE; 2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->warpScaleThresholdE = 0; 2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_IdCluster2D_exit( cpA, &ptrA->refClusterE ); 2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_exit( cpA, &ptrA->scanClusterE ); 2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_UInt16Arr_exit( cpA, &ptrA->ftrDataArrE ); 2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_BitParam_exit( cpA, &ptrA->bitParamE ); 2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->outlierDistanceE = 0; 2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_IdCluster2D_exit( cpA, &ptrA->pcaClusterE ); 2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_exit( cpA, &ptrA->pcaAvgE ); 2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_exit( cpA, &ptrA->pcaMatE ); 2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->pcaDimSubSpaceE = 0; 2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageWidthE = 0; 2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageHeightE = 0; 2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */ 2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_LocalScanDetector_copy( struct bbs_Context* cpA, 2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbf_LocalScanDetector* ptrA, 2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbf_LocalScanDetector* srcPtrA ) 2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR0( "bbf_LocalScanDetector_copy:\n Function is not available" ); 2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_LocalScanDetector_equal( struct bbs_Context* cpA, 2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbf_LocalScanDetector* ptrA, 2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbf_LocalScanDetector* srcPtrA ) 2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR0( "bbf_LocalScanDetector_equal:\n Function is not available" ); 2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return TRUE; 2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */ 2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */ 2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */ 2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanDetector_memSize( struct bbs_Context* cpA, 2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbf_LocalScanDetector* ptrA ) 2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 memSizeL = bbs_SIZEOF16( uint32 ) + 2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_SIZEOF16( uint32 ); /* version */ 2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->patchWidthE ); 2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->patchHeightE ); 2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->scanWidthE ); 2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->scanHeightE ); 2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->scaleExpE ); 2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->interpolatedWarpingE ); 2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->warpScaleThresholdE ); 2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bts_IdCluster2D_memSize( cpA, &ptrA->refClusterE ); 2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bts_Cluster2D_memSize( cpA, &ptrA->scanClusterE ); 2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbf_BitParam_memSize( cpA, &ptrA->bitParamE ); 2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->outlierDistanceE ); 2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bts_IdCluster2D_memSize( cpA, &ptrA->pcaClusterE ); 2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_Int16Arr_memSize( cpA, &ptrA->pcaAvgE ); 2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_Int16Arr_memSize( cpA, &ptrA->pcaMatE ); 2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->pcaDimSubSpaceE ); 2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->maxImageWidthE ); 2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memSizeL += bbs_SIZEOF16( ptrA->maxImageHeightE ); 2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) memSizeL += bbf_featureMemSize( cpA, ptrA->ftrPtrArrE[ iL ] ); 2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return memSizeL; 3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanDetector_memWrite( struct bbs_Context* cpA, 3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbf_LocalScanDetector* ptrA, 3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* memPtrA ) 3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 memSizeL = bbf_LocalScanDetector_memSize( cpA, ptrA ); 3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &memSizeL, memPtrA ); 3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWriteUInt32( bbf_LOCAL_SCAN_DETECTOR_VERSION, memPtrA ); 3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->patchWidthE, memPtrA ); 3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->patchHeightE, memPtrA ); 3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->scanWidthE, memPtrA ); 3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->scanHeightE, memPtrA ); 3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->scaleExpE, memPtrA ); 3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->interpolatedWarpingE, memPtrA ); 3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->warpScaleThresholdE, memPtrA ); 3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bts_IdCluster2D_memWrite( cpA, &ptrA->refClusterE, memPtrA ); 3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bts_Cluster2D_memWrite( cpA, &ptrA->scanClusterE, memPtrA ); 3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbf_BitParam_memWrite( cpA, &ptrA->bitParamE, memPtrA ); 3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->outlierDistanceE, memPtrA ); 3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bts_IdCluster2D_memWrite( cpA, &ptrA->pcaClusterE, memPtrA ); 3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_Int16Arr_memWrite( cpA, &ptrA->pcaAvgE, memPtrA ); 3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_Int16Arr_memWrite( cpA, &ptrA->pcaMatE, memPtrA ); 3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->pcaDimSubSpaceE, memPtrA ); 3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->maxImageWidthE, memPtrA ); 3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memWrite32( &ptrA->maxImageHeightE, memPtrA ); 3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) memPtrA += bbf_featureMemWrite( cpA, ptrA->ftrPtrArrE[ iL ], memPtrA ); 3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return memSizeL; 3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_LocalScanDetector_memRead( struct bbs_Context* cpA, 3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbf_LocalScanDetector* ptrA, 3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* memPtrA, 3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_MemTbl* mtpA ) 3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 memSizeL, versionL; 3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_MemTbl memTblL = *mtpA; 3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_MemSeg* espL = bbs_MemTbl_segPtr( cpA, &memTblL, 0 ); 3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbs_MemSeg* sspL = bbs_MemTbl_sharedSegPtr( cpA, &memTblL, 0 ); 3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( bbs_Context_error( cpA ) ) return 0; 3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &memSizeL, memPtrA ); 3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memReadVersion32( cpA, &versionL, bbf_LOCAL_SCAN_DETECTOR_VERSION, memPtrA ); 3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->patchWidthE, memPtrA ); 3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->patchHeightE, memPtrA ); 3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->scanWidthE, memPtrA ); 3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->scanHeightE, memPtrA ); 3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->scaleExpE, memPtrA ); 3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->interpolatedWarpingE, memPtrA ); 3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->warpScaleThresholdE, memPtrA ); 3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bts_IdCluster2D_memRead( cpA, &ptrA->refClusterE, memPtrA, espL ); 3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bts_Cluster2D_memRead( cpA, &ptrA->scanClusterE, memPtrA, espL ); 3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbf_BitParam_memRead( cpA, &ptrA->bitParamE, memPtrA ); 3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->outlierDistanceE, memPtrA ); 3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bts_IdCluster2D_memRead( cpA, &ptrA->pcaClusterE, memPtrA, espL ); 3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_Int16Arr_memRead( cpA, &ptrA->pcaAvgE, memPtrA, espL ); 3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_Int16Arr_memRead( cpA, &ptrA->pcaMatE, memPtrA, espL ); 3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->pcaDimSubSpaceE, memPtrA ); 3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->maxImageWidthE, memPtrA ); 3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbs_memRead32( &ptrA->maxImageHeightE, memPtrA ); 3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* check features & allocate data buffer */ 3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* memPtrL = memPtrA; 3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 dataSizeL = 0; 3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) 3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project enum bbf_FeatureType typeL = ( enum bbf_FeatureType )bbs_memPeek32( memPtrL + 4 ); 3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dataSizeL += bbf_featureSizeOf16( cpA, typeL ); 3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrL += bbs_memPeek32( memPtrL ); 3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_UInt16Arr_create( cpA, &ptrA->ftrDataArrE, dataSizeL, espL ); 3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* load features & initialize pointers */ 3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* dataPtrL = ptrA->ftrDataArrE.arrPtrE; 3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < ptrA->scanClusterE.sizeE; iL++ ) 3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project enum bbf_FeatureType typeL = ( enum bbf_FeatureType )bbs_memPeek32( memPtrA + 4 ); 3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->ftrPtrArrE[ iL ] = ( struct bbf_Feature* )dataPtrL; 3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_featureInit( cpA, ptrA->ftrPtrArrE[ iL ], typeL ); 3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project memPtrA += bbf_featureMemRead( cpA, ptrA->ftrPtrArrE[ iL ], memPtrA, &memTblL ); 3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dataPtrL += bbf_featureSizeOf16( cpA, typeL ); 3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( memSizeL != bbf_LocalScanDetector_memSize( cpA, ptrA ) ) 3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_LocalScanDetector_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n" 4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project "size mismatch" ); 4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return 0; 4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->maxImageWidthE * ptrA->maxImageHeightE == 0 ) 4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_LocalScanDetector_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n" 4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project "maximum image width/height not set" ); 4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return 0; 4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* initialize internal data */ 4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* ought to be placed on shared memory later */ 4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_RBFMap2D_create( cpA, &ptrA->rbfMapE, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL ); 4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->rbfMapE.RBFTypeE = bts_RBF_LINEAR; 4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->rbfMapE.altTypeE = bts_ALT_RIGID; 4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_create( cpA, &ptrA->tmpCluster1E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL ); 4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_create( cpA, &ptrA->tmpCluster2E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL ); 4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_create( cpA, &ptrA->tmpCluster3E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL ); 4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_create( cpA, &ptrA->tmpCluster4E, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL ); 4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int32Arr_create( cpA, &ptrA->actArrE, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL ); 4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_create( cpA, &ptrA->idxArrE, bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE, sspL ); 4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* working image memory */ 4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* ought to be placed on shared memory later */ 4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_UInt8Arr_create( cpA, &ptrA->workImageBufE, ptrA->maxImageWidthE * ptrA->maxImageHeightE, sspL ); 4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* initialize local scanner (be aware of shared memory usage when moving this create function) */ 4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_LocalScanner_create( cpA, &ptrA->scannerE, 4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->patchWidthE, 4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->patchHeightE, 4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scaleExpE, 4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageWidthE, 4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->maxImageHeightE, 4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->scaleExpE, 4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->bitParamE.outerRadiusE, 4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project &memTblL ); 4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return memSizeL; 4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */ 4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbf_LocalScanDetector_process( struct bbs_Context* cpA, 4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bbf_LocalScanDetector* ptrA, 4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint8* imagePtrA, 4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 imageWidthA, 4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 imageHeightA, 4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_Int16Vec2D* offsPtrA, 4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const struct bts_IdCluster2D* inClusterPtrA, 4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_IdCluster2D* outClusterPtrA ) 4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_DEF_fNameL( "bbf_LocalScanDetector_process" ) 4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 pw0L = ptrA->patchWidthE; 4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 ph0L = ptrA->patchHeightE; 4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 pw1L = pw0L << ptrA->scaleExpE; 4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 ph1L = ph0L << ptrA->scaleExpE; 4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Cluster2D* wrkClPtrL = ( struct bts_Cluster2D* )&ptrA->tmpCluster1E; 4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Cluster2D* refClPtrL = ( struct bts_Cluster2D* )&ptrA->tmpCluster2E; 4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Cluster2D* dstClPtrL = ( struct bts_Cluster2D* )&ptrA->tmpCluster3E; 4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Cluster2D* tmpClPtrL = ( struct bts_Cluster2D* )&ptrA->tmpCluster4E; 4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_RBFMap2D* rbfPtrL = ( struct bts_RBFMap2D* )&ptrA->rbfMapE; 4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbf_LocalScanner* scnPtrL = ( struct bbf_LocalScanner* )&ptrA->scannerE; 4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* actArrL = ( int32* )ptrA->actArrE.arrPtrE; 4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int16* idxArrL = ( int16* )ptrA->idxArrE.arrPtrE; 4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 workImageWidthL, workImageHeightL; 4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Flt16Alt2D altL; 4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 confidenceL; 4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 sizeL = ptrA->scanClusterE.sizeE; 4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( sizeL > bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE ) 4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR1( "%s:\nScan cluster size exceeds bpi_LOCAL_SCAN_DETECTOR_MAX_CLUSTER_SIZE", fNameL ); 4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return 0; 4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* compute equivalent clusters (matching ids) from input and reference cluster */ 4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_IdCluster2D_convertToEqivalentClusters( cpA, inClusterPtrA, &ptrA->refClusterE, wrkClPtrL, refClPtrL ); 4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* altL: orig image -> normalized image */ 4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project altL = bts_Cluster2D_alt( cpA, wrkClPtrL, refClPtrL, bts_ALT_RIGID ); 5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* transorm work cluster to normalized image */ 5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_transformBbp( cpA, wrkClPtrL, altL, 6 ); 5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* map: ref cluster -> work cluster */ 5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_RBFMap2D_compute( cpA, rbfPtrL, refClPtrL, wrkClPtrL ); 5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* copy: scanClusterE -> work cluster */ 5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_copy( cpA, wrkClPtrL, &ptrA->scanClusterE ); 5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* copy: refClusterE -> ref cluster */ 5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_copy( cpA, refClPtrL, &ptrA->refClusterE.clusterE ); 5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* apply map to work cluster */ 5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_rbfTransform( cpA, wrkClPtrL, rbfPtrL ); 5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* apply map to ref cluster */ 5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_rbfTransform( cpA, refClPtrL, rbfPtrL ); 5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* analyze boundaries; get exact dimensions of working image */ 5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 workBorderWL = ( ( ptrA->scanWidthE + pw1L + 1 ) >> 1 ) + 1; /* add a pixel to ensure full search area */ 5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 workBorderHL = ( ( ptrA->scanHeightE + ph1L + 1 ) >> 1 ) + 1; /* add a pixel to ensure full search area */ 5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int16Rect workAreaL = bts_Cluster2D_boundingBox( cpA, wrkClPtrL ); 5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.x1E = workAreaL.x1E >> wrkClPtrL->bbpE; 5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.y1E = workAreaL.y1E >> wrkClPtrL->bbpE; 5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.x2E = workAreaL.x2E >> wrkClPtrL->bbpE; 5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.y2E = workAreaL.y2E >> wrkClPtrL->bbpE; 5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.x1E -= workBorderWL; 5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.y1E -= workBorderHL; 5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.x2E += workBorderWL; 5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workAreaL.y2E += workBorderHL; 5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workImageWidthL = workAreaL.x2E - workAreaL.x1E; 5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workImageHeightL = workAreaL.y2E - workAreaL.y1E; 5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* truncate if necessary (should not occur in normal operation) */ 5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workImageWidthL = workImageWidthL > ptrA->maxImageWidthE ? ptrA->maxImageWidthE : workImageWidthL; 5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workImageHeightL = workImageHeightL > ptrA->maxImageHeightE ? ptrA->maxImageHeightE : workImageHeightL; 5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* adjust ALT */ 5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project altL.vecE.xE -= workAreaL.x1E << altL.vecE.bbpE; 5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project altL.vecE.yE -= workAreaL.y1E << altL.vecE.bbpE; 5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* adjust work cluster */ 5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < wrkClPtrL->sizeE; iL++ ) 5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project wrkClPtrL->vecArrE[ iL ].xE -= workAreaL.x1E << wrkClPtrL->bbpE; 5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project wrkClPtrL->vecArrE[ iL ].yE -= workAreaL.y1E << wrkClPtrL->bbpE; 5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* adjust ref cluster */ 5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < wrkClPtrL->sizeE; iL++ ) 5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 5547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project refClPtrL->vecArrE[ iL ].xE -= workAreaL.x1E << refClPtrL->bbpE; 5557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project refClPtrL->vecArrE[ iL ].yE -= workAreaL.y1E << refClPtrL->bbpE; 5567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 5577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* transform image */ 5597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bim_filterWarp( cpA, 5607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->workImageBufE.arrPtrE, 5617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project imagePtrA, imageWidthA, imageHeightA, 5627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project offsPtrA, 5637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project &altL, 5647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project workImageWidthL, workImageHeightL, 5657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project NULL, 5667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->warpScaleThresholdE, 5677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ptrA->interpolatedWarpingE ); 5687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 5707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* scan over all positions of work cluster; target positions are stored in *dstClPtrL*/ 5727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 5737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 regionWHL = ( ptrA->scanWidthE + pw1L + 1 ) >> 1; 5747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 regionHHL = ( ptrA->scanHeightE + ph1L + 1 ) >> 1; 5757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int16Vec2D* srcVecArrL = wrkClPtrL->vecArrE; 5767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int16Vec2D* dstVecArrL = dstClPtrL->vecArrE; 5777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 vecBbpL = wrkClPtrL->bbpE; 5787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_size( cpA, dstClPtrL, sizeL ); 5797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstClPtrL->bbpE = vecBbpL; 5807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* initialize scanner */ 5827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project scnPtrL->patchWidthE = ptrA->patchWidthE; 5837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project scnPtrL->patchHeightE = ptrA->patchWidthE; 5847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project scnPtrL->scaleExpE = ptrA->scaleExpE; 5857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_LocalScanner_assign( cpA, scnPtrL, ptrA->workImageBufE.arrPtrE, workImageWidthL, workImageHeightL, &ptrA->bitParamE ); 5877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_memset32( actArrL, 0x80000000, sizeL ); 5897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project do 5917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 5927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) 5937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 5947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 bestActL = 0x80000000; 5957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 bestIdxL = 0; 5967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bbf_Feature* ftrPtrL = ptrA->ftrPtrArrE[ iL ]; 5977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 5987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* set scan region */ 5997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 x0L = ( ( wrkClPtrL->vecArrE[ iL ].xE >> ( wrkClPtrL->bbpE - 1 ) ) + 1 ) >> 1; 6017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 y0L = ( ( wrkClPtrL->vecArrE[ iL ].yE >> ( wrkClPtrL->bbpE - 1 ) ) + 1 ) >> 1; 6027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int16Rect scanRegionL = bts_Int16Rect_create( x0L - regionWHL, y0L - regionHHL, x0L + regionWHL, y0L + regionHHL ); 6037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_LocalScanner_origScanRegion( cpA, scnPtrL, &scanRegionL ); 6047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project do 6077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 actL = ftrPtrL->vpActivityE( ftrPtrL, bbf_LocalScanner_getPatch( scnPtrL ) ); 6097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( actL > bestActL ) 6117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bestActL = actL; 6137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bestIdxL = bbf_LocalScanner_scanIndex( scnPtrL ); 6147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( bbf_LocalScanner_next( cpA, scnPtrL ) ); 6177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 xL, yL; /* 16.16 */ 6207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_LocalScanner_idxPos( scnPtrL, bestIdxL, &xL, &yL ); 6217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project xL += pw1L << 15; 6227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project yL += ph1L << 15; 6237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( bestActL > actArrL[ iL ] ) 6247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstVecArrL[ iL ].xE = ( ( xL >> ( 15 - vecBbpL ) ) + 1 ) >> 1; 6267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstVecArrL[ iL ].yE = ( ( yL >> ( 15 - vecBbpL ) ) + 1 ) >> 1; 6277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project actArrL[ iL ] = bestActL; 6287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( bbf_LocalScanner_nextOffset( cpA, scnPtrL ) ); 6337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* outlier analysis: outliers are disabled by setting their similarity to -1 */ 6357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->outlierDistanceE > 0 ) 6367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* altL: work cluster -> ref cluster */ 6387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Flt16Alt2D localAltL = bts_Cluster2D_alt( cpA, wrkClPtrL, dstClPtrL, bts_ALT_RIGID ); 6397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* squared distance 16.16 */ 6417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 dist2L = ( ptrA->outlierDistanceE >> 8 ) * ( ptrA->outlierDistanceE >> 8 ); 6427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* analyze deviations */ 6447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) 6457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Flt16Vec2D vecL = bts_Flt16Vec2D_create32( srcVecArrL[ iL ].xE, srcVecArrL[ iL ].yE, vecBbpL ); 6477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 dev2L; /* squared deviation 16.16 */ 6487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL = bts_Flt16Alt2D_mapFlt( &localAltL, &vecL ); 6497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project vecL = bts_Flt16Vec2D_sub( vecL, bts_Flt16Vec2D_create32( dstVecArrL[ iL ].xE, dstVecArrL[ iL ].yE, vecBbpL ) ); 6507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dev2L = bbs_convertU32( bts_Flt16Vec2D_norm2( &vecL ), vecL.bbpE << 1, 16 ); 6517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( dev2L > dist2L ) actArrL[ iL ] = 0xF0000000; 6527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* remove undetected positions but keep at least 1/2 best positions */ 6567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project flag sortedL; 6587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* bubble sort (no speed issue in this case) */ 6607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) idxArrL[ iL ] = iL; 6617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project do 6637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sortedL = TRUE; 6657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 1; iL < sizeL; iL++ ) 6667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( actArrL[ idxArrL[ iL - 1 ] ] < actArrL[ idxArrL[ iL ] ] ) 6687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int16 tmpL = idxArrL[ iL - 1 ]; 6707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project idxArrL[ iL - 1 ] = idxArrL[ iL ]; 6717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project idxArrL[ iL ] = tmpL; 6727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sortedL = FALSE; 6737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project while( !sortedL ); 6777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = ( sizeL >> 1 ); iL < sizeL && actArrL[ idxArrL[ iL ] ] >= 0; iL++ ); 6797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 subSizeL = iL; 6827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* reorder clusters */ 6847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_size( cpA, tmpClPtrL, subSizeL ); 6857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project struct bts_Int16Vec2D* tmpVecArrL = tmpClPtrL->vecArrE; 6877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < subSizeL; iL++ ) tmpVecArrL[ iL ] = srcVecArrL[ idxArrL[ iL ] ]; 6887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < subSizeL; iL++ ) srcVecArrL[ iL ] = tmpVecArrL[ iL ]; 6897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < subSizeL; iL++ ) tmpVecArrL[ iL ] = dstVecArrL[ idxArrL[ iL ] ]; 6907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < subSizeL; iL++ ) dstVecArrL[ iL ] = tmpVecArrL[ iL ]; 6917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_size( cpA, wrkClPtrL, subSizeL ); 6937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_size( cpA, dstClPtrL, subSizeL ); 6947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 6967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 6977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* compute confidence */ 6987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 6997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int16* idxArrL = ptrA->idxArrE.arrPtrE; 7007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32* actArrL = ptrA->actArrE.arrPtrE; 7017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project int32 actSumL = 0; /* .20 */ 7027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeL; iL++ ) 7037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 7047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project float actL = ( actArrL[ idxArrL[ iL ] ] + 128 ) >> 8; 7057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( actL < 0 ) break; 7067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project actSumL += actL; 7077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 7087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* actSumL = average positive activity */ 7107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project actSumL = ( iL > 0 ) ? actSumL / iL : 0; 7117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project confidenceL = ( ( ( int32 )iL << 20 ) - ( ( ( int32 )1 << 20 ) - actSumL ) ) / sizeL; 7137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* adjust to 4.28 */ 7157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project confidenceL <<= 8; 7167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 7177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 7197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* map: wrkCluster -> dstCluster */ 7217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_RBFMap2D_compute( cpA, rbfPtrL, wrkClPtrL, dstClPtrL ); 7227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* apply map to ref cluster */ 7247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_rbfTransform( cpA, refClPtrL, rbfPtrL ); 7257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* copy ref cluster to outCluster */ 7277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_copy( cpA, &outClusterPtrA->clusterE, refClPtrL ); 7287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_Int16Arr_copy( cpA, &outClusterPtrA->idArrE, &ptrA->refClusterE.idArrE ); 7297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* PCA Mapping */ 7317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ptrA->pcaDimSubSpaceE > 0 ) 7327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 7337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbf_LocalScanDetector_pcaMap( cpA, ptrA, outClusterPtrA, outClusterPtrA ); 7347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 7357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* backtransform out cluster to original image */ 7377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bts_Cluster2D_transformBbp( cpA, &outClusterPtrA->clusterE, bts_Flt16Alt2D_inverted( &altL ), inClusterPtrA->clusterE.bbpE ); 7387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return confidenceL; 7407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 7417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 7437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 7447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 7457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 746