13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Copyright (C) 2008 The Android Open Source Project 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Licensed under the Apache License, Version 2.0 (the "License"); 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * you may not use this file except in compliance with the License. 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * You may obtain a copy of the License at 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * http://www.apache.org/licenses/LICENSE-2.0 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Unless required by applicable law or agreed to in writing, software 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * distributed under the License is distributed on an "AS IS" BASIS, 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * See the License for the specific language governing permissions and 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * limitations under the License. 153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ---- includes ----------------------------------------------------------- */ 18de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "b_BasicEm/Functions.h" 203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "b_BasicEm/Math.h" 213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "b_BitFeatureEm/ScanDetector.h" 227ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */ 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */ 263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* */ 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ---- \ghd{ auxiliary functions } ---------------------------------------- */ 283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* */ 293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */ 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */ 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */ 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* */ 353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ---- \ghd{ constructor / destructor } ----------------------------------- */ 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* */ 373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */ 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */ 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid bbf_ScanDetector_init( struct bbs_Context* cpA, 423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy struct bbf_ScanDetector* ptrA ) 433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy uint32 iL; 454c08aed51c5899665ade97263692328eea4af106cristy 4699dc036190f292a67801dc4b141898bf18c96b36cristy ptrA->minScaleE = 0; 474c08aed51c5899665ade97263692328eea4af106cristy ptrA->maxScaleE = 0; 487d4aa38318c20a4309d855f45e3744c9f300f697cristy ptrA->maxImageWidthE = 0; 494c08aed51c5899665ade97263692328eea4af106cristy ptrA->maxImageHeightE = 0; 504c08aed51c5899665ade97263692328eea4af106cristy bbf_Scanner_init( cpA, &ptrA->scannerE ); 514c08aed51c5899665ade97263692328eea4af106cristy 524c08aed51c5899665ade97263692328eea4af106cristy ptrA->patchWidthE = 0; 534c08aed51c5899665ade97263692328eea4af106cristy ptrA->patchHeightE = 0; 544c08aed51c5899665ade97263692328eea4af106cristy ptrA->minDefScaleE = 0; 554c08aed51c5899665ade97263692328eea4af106cristy ptrA->maxDefScaleE = 0; 564c08aed51c5899665ade97263692328eea4af106cristy ptrA->scaleStepE = 0; 571042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy ptrA->overlapThrE = 0; 584c08aed51c5899665ade97263692328eea4af106cristy ptrA->borderWidthE = 0; 5999dc036190f292a67801dc4b141898bf18c96b36cristy ptrA->borderHeightE = 0; 604c08aed51c5899665ade97263692328eea4af106cristy ptrA->featuresE = 0; 614c08aed51c5899665ade97263692328eea4af106cristy for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_BitParam_init( cpA, &ptrA->bitParamArrE[ iL ] ); 62ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_Sequence_init( cpA, &ptrA->featureArrE[ iL ] ); 6334b78eacf3bef963cade67c70f5f12785b9fe702cristy bts_IdCluster2D_init( cpA, &ptrA->refClusterE ); 644c08aed51c5899665ade97263692328eea4af106cristy ptrA->refDistanceE = 10; 653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6656ed31cc763800a9fb1f0df96104c354b40d2cbccristy 673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */ 6847b022b2592e21e468c453ad44f550b62f77b2cbcristy 6947b022b2592e21e468c453ad44f550b62f77b2cbcristyvoid bbf_ScanDetector_exit( struct bbs_Context* cpA, 7047b022b2592e21e468c453ad44f550b62f77b2cbcristy struct bbf_ScanDetector* ptrA ) 7156ed31cc763800a9fb1f0df96104c354b40d2cbccristy{ 7247b022b2592e21e468c453ad44f550b62f77b2cbcristy uint32 iL; 7347b022b2592e21e468c453ad44f550b62f77b2cbcristy 744da3ba3eedd349b48f5c8bbb9f15faee04f6e09fcristy ptrA->minScaleE = 0; 7547b022b2592e21e468c453ad44f550b62f77b2cbcristy ptrA->maxScaleE = 0; 7647b022b2592e21e468c453ad44f550b62f77b2cbcristy ptrA->maxImageWidthE = 0; 7756ed31cc763800a9fb1f0df96104c354b40d2cbccristy ptrA->maxImageHeightE = 0; 7856ed31cc763800a9fb1f0df96104c354b40d2cbccristy bbf_Scanner_exit( cpA, &ptrA->scannerE ); 7947b022b2592e21e468c453ad44f550b62f77b2cbcristy 8047b022b2592e21e468c453ad44f550b62f77b2cbcristy ptrA->patchWidthE = 0; 8147b022b2592e21e468c453ad44f550b62f77b2cbcristy ptrA->patchHeightE = 0; 823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->minDefScaleE = 0; 833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->maxDefScaleE = 0; 843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->scaleStepE = 0; 853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->overlapThrE = 0; 863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->borderWidthE = 0; 873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->borderHeightE = 0; 883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->featuresE = 0; 89d3090f92b8f346df0a8191d5aa3f9d14be5a32d5cristy for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_BitParam_exit( cpA, &ptrA->bitParamArrE[ iL ] ); 903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for( iL = 0; iL < bbf_SCAN_DETECTOR_MAX_FEATURES; iL++ ) bbf_Sequence_exit( cpA, &ptrA->featureArrE[ iL ] ); 913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bts_IdCluster2D_exit( cpA, &ptrA->refClusterE ); 923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptrA->refDistanceE = 0; 933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy/* ------------------------------------------------------------------------- */ 963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */ 983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* */ 99bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy/* ---- \ghd{ operators } -------------------------------------------------- */ 1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* */ 1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */ 1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ------------------------------------------------------------------------- */ 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid bbf_ScanDetector_copy( struct bbs_Context* cpA, 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy struct bbf_ScanDetector* ptrA, 107790190d9d1e6f011220d0003ce5b51063f0ab417cristy const struct bbf_ScanDetector* srcPtrA ) 108790190d9d1e6f011220d0003ce5b51063f0ab417cristy{ 109790190d9d1e6f011220d0003ce5b51063f0ab417cristy bbs_ERROR0( "bbf_ScanDetector_copy:\n Function is not available" ); 110790190d9d1e6f011220d0003ce5b51063f0ab417cristy} 111790190d9d1e6f011220d0003ce5b51063f0ab417cristy 112790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ------------------------------------------------------------------------- */ 113790190d9d1e6f011220d0003ce5b51063f0ab417cristy 114790190d9d1e6f011220d0003ce5b51063f0ab417cristyflag bbf_ScanDetector_equal( struct bbs_Context* cpA, 115790190d9d1e6f011220d0003ce5b51063f0ab417cristy const struct bbf_ScanDetector* ptrA, 116790190d9d1e6f011220d0003ce5b51063f0ab417cristy const struct bbf_ScanDetector* srcPtrA ) 117790190d9d1e6f011220d0003ce5b51063f0ab417cristy{ 1184167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy bbs_ERROR0( "bbf_ScanDetector_equal:\n Function is not available" ); 1194167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy return TRUE; 120790190d9d1e6f011220d0003ce5b51063f0ab417cristy} 121790190d9d1e6f011220d0003ce5b51063f0ab417cristy 122790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ------------------------------------------------------------------------- */ 123790190d9d1e6f011220d0003ce5b51063f0ab417cristy 124790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ========================================================================= */ 1252e035cd272c0993d28f757f4a913070170095939Cristy/* */ 126790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ---- \ghd{ query functions } -------------------------------------------- */ 127790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* */ 128790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ========================================================================= */ 129790190d9d1e6f011220d0003ce5b51063f0ab417cristy 130220c4d505bfb9cf557e8ec1616d7cdc0596379b8cristy/* ------------------------------------------------------------------------- */ 131220c4d505bfb9cf557e8ec1616d7cdc0596379b8cristy 132790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ========================================================================= */ 133790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* */ 134790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ---- \ghd{ modify functions } ------------------------------------------- */ 135790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* */ 1361042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ========================================================================= */ 1371042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 1381042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ------------------------------------------------------------------------- */ 1391042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 1401042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ========================================================================= */ 1411042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* */ 1421042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ---- \ghd{ I/O } -------------------------------------------------------- */ 14334b78eacf3bef963cade67c70f5f12785b9fe702cristy/* */ 14434b78eacf3bef963cade67c70f5f12785b9fe702cristy/* ========================================================================= */ 14534b78eacf3bef963cade67c70f5f12785b9fe702cristy 1461042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ------------------------------------------------------------------------- */ 1471042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 1481042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristyuint32 bbf_ScanDetector_memSize( struct bbs_Context* cpA, 1491042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy const struct bbf_ScanDetector* ptrA ) 1501042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy{ 151790190d9d1e6f011220d0003ce5b51063f0ab417cristy uint32 iL; 15234b78eacf3bef963cade67c70f5f12785b9fe702cristy uint32 memSizeL = bbs_SIZEOF16( uint32 ) + 15334b78eacf3bef963cade67c70f5f12785b9fe702cristy bbs_SIZEOF16( uint32 ); /* version */ 15434b78eacf3bef963cade67c70f5f12785b9fe702cristy 155790190d9d1e6f011220d0003ce5b51063f0ab417cristy memSizeL += bbs_SIZEOF16( ptrA->patchWidthE ); 1561042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memSizeL += bbs_SIZEOF16( ptrA->patchHeightE ); 1571042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memSizeL += bbs_SIZEOF16( ptrA->minDefScaleE ); 15834919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memSizeL += bbs_SIZEOF16( ptrA->maxDefScaleE ); 15934919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memSizeL += bbs_SIZEOF16( ptrA->scaleStepE ); 160790190d9d1e6f011220d0003ce5b51063f0ab417cristy memSizeL += bbs_SIZEOF16( ptrA->overlapThrE ); 161790190d9d1e6f011220d0003ce5b51063f0ab417cristy memSizeL += bbs_SIZEOF16( ptrA->borderWidthE ); 162790190d9d1e6f011220d0003ce5b51063f0ab417cristy memSizeL += bbs_SIZEOF16( ptrA->borderHeightE ); 163790190d9d1e6f011220d0003ce5b51063f0ab417cristy memSizeL += bbs_SIZEOF16( ptrA->featuresE ); 164790190d9d1e6f011220d0003ce5b51063f0ab417cristy for( iL = 0; iL < ptrA->featuresE; iL++ ) memSizeL += bbf_BitParam_memSize( cpA, &ptrA->bitParamArrE[ iL ] ); 165790190d9d1e6f011220d0003ce5b51063f0ab417cristy for( iL = 0; iL < ptrA->featuresE; iL++ ) memSizeL += bbf_Sequence_memSize( cpA, &ptrA->featureArrE[ iL ] ); 166790190d9d1e6f011220d0003ce5b51063f0ab417cristy memSizeL += bts_IdCluster2D_memSize( cpA, &ptrA->refClusterE ); 167790190d9d1e6f011220d0003ce5b51063f0ab417cristy memSizeL += bbs_SIZEOF16( ptrA->refDistanceE ); 168790190d9d1e6f011220d0003ce5b51063f0ab417cristy 169790190d9d1e6f011220d0003ce5b51063f0ab417cristy return memSizeL; 170790190d9d1e6f011220d0003ce5b51063f0ab417cristy} 171e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy 172790190d9d1e6f011220d0003ce5b51063f0ab417cristy/* ------------------------------------------------------------------------- */ 173790190d9d1e6f011220d0003ce5b51063f0ab417cristy 174790190d9d1e6f011220d0003ce5b51063f0ab417cristyuint32 bbf_ScanDetector_memWrite( struct bbs_Context* cpA, 175e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy const struct bbf_ScanDetector* ptrA, 1761042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy uint16* memPtrA ) 1771042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy{ 1781042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy uint32 iL; 1791042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy uint32 memSizeL = bbf_ScanDetector_memSize( cpA, ptrA ); 1801042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memWrite32( &memSizeL, memPtrA ); 1811042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memWriteUInt32( bbf_SCAN_DETECTOR_VERSION, memPtrA ); 18234919ed07da683cc334cd74e3c9d9c29c8b79b98cristy 18334919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->patchWidthE, memPtrA ); 1841042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memWrite32( &ptrA->patchHeightE, memPtrA ); 18534919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->minDefScaleE, memPtrA ); 18634919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->maxDefScaleE, memPtrA ); 18734919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->scaleStepE, memPtrA ); 18834919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->overlapThrE, memPtrA ); 18934919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->borderWidthE, memPtrA ); 1902e035cd272c0993d28f757f4a913070170095939Cristy memPtrA += bbs_memWrite32( &ptrA->borderHeightE, memPtrA ); 19134919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->featuresE, memPtrA ); 19234919ed07da683cc334cd74e3c9d9c29c8b79b98cristy for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_BitParam_memWrite( cpA, &ptrA->bitParamArrE[ iL ], memPtrA ); 19334919ed07da683cc334cd74e3c9d9c29c8b79b98cristy for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_Sequence_memWrite( cpA, &ptrA->featureArrE[ iL ], memPtrA ); 19434919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bts_IdCluster2D_memWrite( cpA, &ptrA->refClusterE, memPtrA ); 19534919ed07da683cc334cd74e3c9d9c29c8b79b98cristy memPtrA += bbs_memWrite32( &ptrA->refDistanceE, memPtrA ); 19634919ed07da683cc334cd74e3c9d9c29c8b79b98cristy 19734919ed07da683cc334cd74e3c9d9c29c8b79b98cristy return memSizeL; 19834919ed07da683cc334cd74e3c9d9c29c8b79b98cristy} 199dc6589cac93cf46a2d9d7ee71c48df8c215f398fcristy 2001042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy/* ------------------------------------------------------------------------- */ 2011042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 2021042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristyuint32 bbf_ScanDetector_memRead( struct bbs_Context* cpA, 20334b78eacf3bef963cade67c70f5f12785b9fe702cristy struct bbf_ScanDetector* ptrA, 20434b78eacf3bef963cade67c70f5f12785b9fe702cristy const uint16* memPtrA, 20534b78eacf3bef963cade67c70f5f12785b9fe702cristy struct bbs_MemTbl* mtpA ) 20634b78eacf3bef963cade67c70f5f12785b9fe702cristy{ 2071042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy bbs_DEF_fNameL( "bbf_ScanDetector_memRead" ) 2081042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 2098dc6a07d751896a7c400a6d888a5964c538fad2dcristy /* debugging hint: set this flag to FALSE when you suspect a shared memory conflict */ 2108dc6a07d751896a7c400a6d888a5964c538fad2dcristy const flag maximizeSharedMemoryL = TRUE; 2118dc6a07d751896a7c400a6d888a5964c538fad2dcristy 2128dc6a07d751896a7c400a6d888a5964c538fad2dcristy uint32 iL; 2131042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy uint32 memSizeL, versionL; 2141042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy struct bbs_MemTbl memTblL = *mtpA; 2151042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy struct bbs_MemSeg* espL = bbs_MemTbl_segPtr( cpA, &memTblL, 0 ); 2161042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy if( bbs_Context_error( cpA ) ) return 0; 2171042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 2181042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &memSizeL, memPtrA ); 2191042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memReadVersion32( cpA, &versionL, bbf_SCAN_DETECTOR_VERSION, memPtrA ); 2201042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 2211042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->patchWidthE, memPtrA ); 2221042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->patchHeightE, memPtrA ); 2231042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->minDefScaleE, memPtrA ); 2241042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->maxDefScaleE, memPtrA ); 2251042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->scaleStepE, memPtrA ); 2261042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->overlapThrE, memPtrA ); 2271042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->borderWidthE, memPtrA ); 2284167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy memPtrA += bbs_memRead32( &ptrA->borderHeightE, memPtrA ); 2294167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy memPtrA += bbs_memRead32( &ptrA->featuresE, memPtrA ); 2301042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_BitParam_memRead( cpA, &ptrA->bitParamArrE[ iL ], memPtrA ); 2311042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy for( iL = 0; iL < ptrA->featuresE; iL++ ) memPtrA += bbf_Sequence_memRead( cpA, &ptrA->featureArrE[ iL ], memPtrA, &memTblL ); 2321042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bts_IdCluster2D_memRead( cpA, &ptrA->refClusterE, memPtrA, espL ); 2331042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy memPtrA += bbs_memRead32( &ptrA->refDistanceE, memPtrA ); 23405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk/* 23505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk if( memSizeL != bbf_ScanDetector_memSize( cpA, ptrA ) ) 23605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk { 23705d2ff7ebf21f659f5b11e45afb294e152f4330cdirk bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bbf_ScanDetector_memRead( struct bem_ScanGradientMove* ptrA, const uint16* memPtrA ):\n" 2381042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy "size mismatch" ); 2391042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy return 0; 24005d2ff7ebf21f659f5b11e45afb294e152f4330cdirk } 24105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk*/ 2421042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 2431042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy ptrA->minScaleE = ptrA->minDefScaleE; 2441042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy ptrA->maxScaleE = ptrA->maxDefScaleE; 2451042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 24634919ed07da683cc334cd74e3c9d9c29c8b79b98cristy /* initialize scanner; be aware of shared memory settings(!) */ 24734919ed07da683cc334cd74e3c9d9c29c8b79b98cristy { 2484167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy uint32 maxImageSizeL = ptrA->maxImageWidthE * ptrA->maxImageHeightE; 2494167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy 2504167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy /* estimate of maximal possible faces in image */ 2514167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy uint32 maxFacesL = maxImageSizeL / ( 768 << 1 ); 2524167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy 2534167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy uint32 maxRadiusL = 0; 2541042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 2551042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy if( maxImageSizeL == 0 ) 2561042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy { 2571042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy bbs_ERROR1( "%s:\nMaximum image size was not defined (size variables must be set before calling _memRead)", fNameL ); 2581042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy return memSizeL; 2591042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy } 2601042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 2611042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy for( iL = 0; iL < ptrA->featuresE; iL++ ) 2621042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy { 2639f654472e80883bb7c4ec299036733e0e23570d7cristy maxRadiusL = maxRadiusL > ptrA->bitParamArrE[ iL ].outerRadiusE ? maxRadiusL : ptrA->bitParamArrE[ iL ].outerRadiusE; 2649f654472e80883bb7c4ec299036733e0e23570d7cristy } 2659f654472e80883bb7c4ec299036733e0e23570d7cristy 2669f654472e80883bb7c4ec299036733e0e23570d7cristy if( maxFacesL < 1 ) maxFacesL = 1; 2679f654472e80883bb7c4ec299036733e0e23570d7cristy 268220c4d505bfb9cf557e8ec1616d7cdc0596379b8cristy bbf_Scanner_create( cpA, &ptrA->scannerE, 2699f654472e80883bb7c4ec299036733e0e23570d7cristy maximizeSharedMemoryL, 27019f7886e4423cd5ce3eef31092942f55ba770983cristy ptrA->maxImageWidthE, 27119f7886e4423cd5ce3eef31092942f55ba770983cristy ptrA->maxImageHeightE, 27219f7886e4423cd5ce3eef31092942f55ba770983cristy maxRadiusL, 27319f7886e4423cd5ce3eef31092942f55ba770983cristy ptrA->patchWidthE, 27419f7886e4423cd5ce3eef31092942f55ba770983cristy ptrA->patchHeightE, 27519f7886e4423cd5ce3eef31092942f55ba770983cristy ptrA->minScaleE, 2769f654472e80883bb7c4ec299036733e0e23570d7cristy ptrA->maxScaleE, 2779f654472e80883bb7c4ec299036733e0e23570d7cristy ptrA->scaleStepE, 2789f654472e80883bb7c4ec299036733e0e23570d7cristy ptrA->borderWidthE, 2799f654472e80883bb7c4ec299036733e0e23570d7cristy ptrA->borderHeightE, 2809f654472e80883bb7c4ec299036733e0e23570d7cristy maxFacesL * 20, /* bufferSizeA */ 2819f654472e80883bb7c4ec299036733e0e23570d7cristy &memTblL ); 2829f654472e80883bb7c4ec299036733e0e23570d7cristy } 2839f654472e80883bb7c4ec299036733e0e23570d7cristy 2849f654472e80883bb7c4ec299036733e0e23570d7cristy return memSizeL; 2859f654472e80883bb7c4ec299036733e0e23570d7cristy} 2869f654472e80883bb7c4ec299036733e0e23570d7cristy 2879f654472e80883bb7c4ec299036733e0e23570d7cristy/* ------------------------------------------------------------------------- */ 28834b78eacf3bef963cade67c70f5f12785b9fe702cristy 2899f654472e80883bb7c4ec299036733e0e23570d7cristy/* ========================================================================= */ 290857c8a100c50bd902586a902c27fccab271dce1dcristy/* */ 2919f654472e80883bb7c4ec299036733e0e23570d7cristy/* ---- \ghd{ exec functions } --------------------------------------------- */ 2929f654472e80883bb7c4ec299036733e0e23570d7cristy/* */ 293f46941ca310386db5b9939840c884c6f8a5c7189cristy/* ========================================================================= */ 294f46941ca310386db5b9939840c884c6f8a5c7189cristy 2958526a9763e0671ebad481fd00679fb857ce8d84acristy/* ------------------------------------------------------------------------- */ 2964ab069406391dd3d34359d17a6ab7333f7200729cristy 297f46941ca310386db5b9939840c884c6f8a5c7189cristyuint32 bbf_ScanDetector_process( struct bbs_Context* cpA, 298f46941ca310386db5b9939840c884c6f8a5c7189cristy struct bbf_ScanDetector* ptrA, 2999f654472e80883bb7c4ec299036733e0e23570d7cristy const void* imagePtrA, 3009f654472e80883bb7c4ec299036733e0e23570d7cristy uint32 imageWidthA, 30115b07b3f81434e5cee2ed16d51ec3f504949d992cristy uint32 imageHeightA, 30215b07b3f81434e5cee2ed16d51ec3f504949d992cristy const struct bts_Int16Rect* roiPtrA, 303f46941ca310386db5b9939840c884c6f8a5c7189cristy int32** outArrPtrPtrA ) 304f46941ca310386db5b9939840c884c6f8a5c7189cristy{ 305f46941ca310386db5b9939840c884c6f8a5c7189cristy /* best global values (used when no positives could be found) */ 306f46941ca310386db5b9939840c884c6f8a5c7189cristy int32 bestGlobalActL = ( int32 )0x80000000; 3074ab069406391dd3d34359d17a6ab7333f7200729cristy int32 bestGlobalXL = 0; 3084ab069406391dd3d34359d17a6ab7333f7200729cristy int32 bestGlobalYL = 0; 3099f654472e80883bb7c4ec299036733e0e23570d7cristy uint32 bestGlobalScaleL = 0; 3109f654472e80883bb7c4ec299036733e0e23570d7cristy 31119f7886e4423cd5ce3eef31092942f55ba770983cristy struct bbf_Scanner* scannerPtrL = &ptrA->scannerE; 31219f7886e4423cd5ce3eef31092942f55ba770983cristy 31319f7886e4423cd5ce3eef31092942f55ba770983cristy scannerPtrL->minScaleE = ptrA->minScaleE; 31419f7886e4423cd5ce3eef31092942f55ba770983cristy scannerPtrL->maxScaleE = ptrA->maxScaleE; 31519f7886e4423cd5ce3eef31092942f55ba770983cristy 31619f7886e4423cd5ce3eef31092942f55ba770983cristy *outArrPtrPtrA = NULL; 3179f654472e80883bb7c4ec299036733e0e23570d7cristy 3189f654472e80883bb7c4ec299036733e0e23570d7cristy if( bbs_Context_error( cpA ) ) return 0; 3194167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy if( ptrA->featuresE == 0 ) 3204167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy { 3214167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy bbs_ERROR0( "bbf_ScanDetector_process: detector has no features" ); 3224167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy return 0; 3234167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy } 3244167f3a934b7c75a501ac7b4f1ceaf3e1bb192fdcristy 3251042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy if( imageWidthA > ptrA->maxImageWidthE || imageHeightA > ptrA->maxImageHeightE ) 3261042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy { 3271042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy bbs_ERROR0( "bbf_ScanDetector_process: images size exceeds preallocated size" ); 3281042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy return 0; 3291042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy } 3301042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 3311042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy /* resets output positions */ 3321042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy bbf_Scanner_resetOutPos( cpA, scannerPtrL ); 3331042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 3341042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy /* assign image to scanner - reset scanner */ 3351042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy bbf_Scanner_assign( cpA, scannerPtrL, imagePtrA, imageWidthA, imageHeightA, roiPtrA, &ptrA->bitParamArrE[ 0 ] ); 3361042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 3371042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy while( bbf_Scanner_positions( scannerPtrL ) > 0 ) 3381042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy { 3391042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy int32 bestActL = ( int32 )0x80000000; 3401042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy uint32 bestIdxL = 0; 3411042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy uint32 bestLvlL = 0; 3421042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy uint32 iL; 3431042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 3441042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy const struct bbf_Feature* featurePtrL = ( const struct bbf_Feature* )&ptrA->featureArrE[ 0 ]; 3451042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy const struct bbf_BitParam* paramPtrL = &ptrA->bitParamArrE[ 0 ]; 3461042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy bbf_Scanner_bitParam( cpA, scannerPtrL, paramPtrL ); 3471042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 3481042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy /* resets internal positions */ 3491042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy bbf_Scanner_resetIntPos( cpA, scannerPtrL ); 3501042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy 3511042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy do 3521042ed2a43b6a660a6f6dd803e1ee79897da4c3fcristy { 353790190d9d1e6f011220d0003ce5b51063f0ab417cristy int32 actL = featurePtrL->vpActivityE( featurePtrL, bbf_Scanner_getPatch( scannerPtrL ) ); 354790190d9d1e6f011220d0003ce5b51063f0ab417cristy if( actL > 0 ) 355790190d9d1e6f011220d0003ce5b51063f0ab417cristy { 356790190d9d1e6f011220d0003ce5b51063f0ab417cristy bbf_Scanner_addIntPos( cpA, scannerPtrL, bbf_Scanner_scanIndex( scannerPtrL ), actL ); 357790190d9d1e6f011220d0003ce5b51063f0ab417cristy } 358790190d9d1e6f011220d0003ce5b51063f0ab417cristy 3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if( actL > bestActL ) 3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bestActL = actL; 3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bestIdxL = bbf_Scanner_scanIndex( scannerPtrL ); 3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while( bbf_Scanner_next( cpA, scannerPtrL ) ); 3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for( iL = 1; iL < ptrA->featuresE; iL++ ) 3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const struct bbf_Feature* featurePtrL = ( const struct bbf_Feature* )&ptrA->featureArrE[ iL ]; 3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const struct bbf_BitParam* paramPtrL = &ptrA->bitParamArrE[ iL ]; 3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy uint32* idxArrL = scannerPtrL->idxArrE.arrPtrE; 3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int32* actArrL = scannerPtrL->actArrE.arrPtrE; 3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy uint32 kL = 0; 3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy uint32 jL; 3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if( scannerPtrL->intCountE == 0 ) break; 3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bestActL = ( int32 )0x80000000; 3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bbf_Scanner_bitParam( cpA, scannerPtrL, paramPtrL ); 3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for( jL = 0; jL < scannerPtrL->intCountE; jL++ ) 3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int32 actL; 3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bbf_Scanner_goToIndex( cpA, scannerPtrL, idxArrL[ jL ] ); 3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy actL = featurePtrL->vpActivityE( featurePtrL, bbf_Scanner_getPatch( scannerPtrL ) ); 3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if( actL > 0 ) 3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 388c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy idxArrL[ kL ] = idxArrL[ jL ]; 389699ae5b6cbee363e53f58e0fedd414f282d07eddcristy actArrL[ kL ] = ( actArrL[ jL ] + actL ) >> 1; 3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy kL++; 3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 392699ae5b6cbee363e53f58e0fedd414f282d07eddcristy 3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if( actL > bestActL ) 3947d4aa38318c20a4309d855f45e3744c9f300f697cristy { 395699ae5b6cbee363e53f58e0fedd414f282d07eddcristy bestActL = actL; 3967d4aa38318c20a4309d855f45e3744c9f300f697cristy bestIdxL = idxArrL[ jL ]; 397c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy bestLvlL = iL; 398c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy } 399c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy } 400c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy 401bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy scannerPtrL->intCountE = kL; 4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if( scannerPtrL->intCountE == 0 ) 4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int32 xL, yL; 4072da0535a82cc655e5a48deac466bd6fcef1f4924cristy uint32 scaleL; 4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4092e035cd272c0993d28f757f4a913070170095939Cristy /* 8.24 */ 410699ae5b6cbee363e53f58e0fedd414f282d07eddcristy int32 actL = ( bestActL >> 4 ) + ( ( ( int32 )( bestLvlL + 1 - ptrA->featuresE ) << 24 ) / ( int32 )ptrA->featuresE ); 4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 412699ae5b6cbee363e53f58e0fedd414f282d07eddcristy /* 4.28 */ 4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy actL <<= 4; 414bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy 4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bbf_Scanner_idxPos( scannerPtrL, bestIdxL, &xL, &yL, &scaleL ); 4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 417bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if( actL > bestGlobalActL ) 4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 419bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy bestGlobalActL = actL; 4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bestGlobalXL = xL; 421bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy bestGlobalYL = yL; 4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bestGlobalScaleL = scaleL; 4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 424bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy } 4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 426bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy { 4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* remove overlaps for current scale */ 428699ae5b6cbee363e53f58e0fedd414f282d07eddcristy bbf_Scanner_removeIntOverlaps( cpA, scannerPtrL, ptrA->overlapThrE ); 429c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy 4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for( iL = 0; iL < scannerPtrL->intCountE; iL++ ) 431699ae5b6cbee363e53f58e0fedd414f282d07eddcristy { 432699ae5b6cbee363e53f58e0fedd414f282d07eddcristy int32 xL, yL; 433699ae5b6cbee363e53f58e0fedd414f282d07eddcristy uint32 scaleL; 4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy uint32* idxArrL = scannerPtrL->idxArrE.arrPtrE; 4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int32* actArrL = scannerPtrL->actArrE.arrPtrE; 4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 437bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy int32 actL = actArrL[ iL ]; 438699ae5b6cbee363e53f58e0fedd414f282d07eddcristy bbf_Scanner_idxPos( scannerPtrL, idxArrL[ iL ], &xL, &yL, &scaleL ); 4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* add external position */ 4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bbf_Scanner_addOutPos( cpA, scannerPtrL, xL, yL, scaleL, actL ); 4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 443bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy 4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* remove overlapping positions */ 4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bbf_Scanner_removeOutOverlaps( cpA, scannerPtrL, ptrA->overlapThrE ); 446c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy 447c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy } 448c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy 449c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy if( !bbf_Scanner_nextScale( cpA, scannerPtrL ) ) break; 4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4532e035cd272c0993d28f757f4a913070170095939Cristy uint32 iL; 454699ae5b6cbee363e53f58e0fedd414f282d07eddcristy printf( "\n-----------------------------------------------" ); 455699ae5b6cbee363e53f58e0fedd414f282d07eddcristy for( iL = 0; iL < scannerPtrL->outCountE; iL++ ) 4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf( "\n%02i: %6.1f %6.1f %6.2f %6.3f", 458bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy iL, 4596831e2f47f00e8b78275319e4aec01d120a3876fCristy ( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 0 ] / ( 1L << 16 ), 4603d04ed7ddc7a93c09476e84cc64412687bf5261acristy ( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 1 ] / ( 1L << 16 ), 461bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 2 ] / ( 1L << 20 ), 4626831e2f47f00e8b78275319e4aec01d120a3876fCristy ( float )scannerPtrL->outArrE.arrPtrE[ iL * 4 + 3 ] / ( 1L << 28 ) ); 4639b1d6c756cb32746846b038ccb0439db540ba509cristy 4643d04ed7ddc7a93c09476e84cc64412687bf5261acristy } 465bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy } 4666831e2f47f00e8b78275319e4aec01d120a3876fCristy*/ 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *outArrPtrPtrA = scannerPtrL->outArrE.arrPtrE; 4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if( scannerPtrL->outCountE == 0 ) 470c4ea4a479c90f81168aa2b99e7680c7b0459d415cristy { 471699ae5b6cbee363e53f58e0fedd414f282d07eddcristy /* no positive activities found: store best negative activity */ 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bbf_Scanner_addOutPos( cpA, scannerPtrL, bestGlobalXL, bestGlobalYL, bestGlobalScaleL, bestGlobalActL ); 473bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy return 0; 4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 4769d314ff2c17a77996c05413c2013880387e50f0ecristy { 4779d314ff2c17a77996c05413c2013880387e50f0ecristy return scannerPtrL->outCountE; 4789d314ff2c17a77996c05413c2013880387e50f0ecristy } 479bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy} 480bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy 481699ae5b6cbee363e53f58e0fedd414f282d07eddcristy/* ------------------------------------------------------------------------- */ 4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ========================================================================= */ 4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy