Reimplemented from Impala::Core::Tracking::SearcherBase. Definition at line 41 of file SearcherPyramid.h. References Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::CH(), Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::CW(), Impala::Core::Array::Pattern::FuncGenConv2dDispatch(), Impala::Core::Tracking::ImagePyramid::GetLevel(), Impala::Core::Tracking::ImagePyramid::GetSize(), Impala::Core::Tracking::ImagePyramid::Levels(), max, Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::mBH, Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::mBW, Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::mCH, Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::mCW, mInputPyramid, Impala::Core::Tracking::SearcherBase::mLastPos, mTemplatePyramid, Impala::Core::Array::Pattern::PatInOutOp(), Impala::Core::Array::Pattern::PatSet(), Impala::Core::Tracking::ImagePyramid::PropagateBaseChanges(), Impala::Core::Tracking::Position::size, Impala::Core::Tracking::Position::translation, Impala::Core::Tracking::Point::x, and Impala::Core::Tracking::Point::y. 00042 { 00043 if(mTemplatePyramid == 0) 00044 return; 00045 00046 mInputPyramid->PropagateBaseChanges(); 00047 mTemplatePyramid->PropagateBaseChanges(); 00048 00049 //search in the highest level in both pyramids (template is always the 00050 //smaller) 00051 int level = mTemplatePyramid->Levels()-1; 00052 Point searchSize(mInputPyramid->GetSize(level)); 00053 Point searchPos(0, 0); 00054 Point searchBorder(mInputPyramid->GetSize(0)); 00055 00056 Array::Array2dVec3Real64* searchArea; 00057 Array::Array2dVec3Real64* searchResult; 00058 searchArea = 00059 new Array::Array2dVec3Real64(searchSize.x + 2*searchBorder.x, 00060 searchSize.y + 2*searchBorder.y, 0, 0, 0); 00061 searchResult = 00062 new Array::Array2dVec3Real64(searchSize.x + 2*searchBorder.x, 00063 searchSize.y + 2*searchBorder.y, 0, 0, 0); 00064 00065 Array::Trait::FuncExportMinMax<Array::Vec3Real64, 00066 Array::Array2dVec3Real64> minmax; 00067 Array::Trait::FuncBpoManhatDist dist; 00068 Array::Trait::FuncBpoAddAssignPtr bpoAss; 00069 00070 while(level>=0) 00071 { 00072 searchBorder.x = mTemplatePyramid->GetLevel(level)->CW(); 00073 searchBorder.y = mTemplatePyramid->GetLevel(level)->CH(); 00074 00075 searchArea->mCW = 2*searchBorder.x + searchSize.x; 00076 searchArea->mCH = 2*searchBorder.y + searchSize.y; 00077 searchArea->mBW = 0; 00078 searchArea->mBH = 0; 00079 Array::Pattern::PatSet(searchArea, mInputPyramid->GetLevel(level), 00080 searchPos.x - searchBorder.x, 00081 searchPos.y - searchBorder.y, 00082 searchSize.x + 2*searchBorder.x, 00083 searchSize.y + 2*searchBorder.y, 0, 0); 00084 searchArea->mCW = searchSize.x; 00085 searchArea->mCH = searchSize.y; 00086 searchArea->mBW = searchBorder.x; 00087 searchArea->mBH = searchBorder.y; 00088 searchResult->mCW = searchSize.x; 00089 searchResult->mCH = searchSize.y; 00090 searchResult->mBW = searchBorder.x; 00091 searchResult->mBH = searchBorder.y; 00092 00093 Array::Pattern::FuncGenConv2dDispatch(searchResult, searchArea, 00094 mTemplatePyramid->GetLevel(level), 00095 dist, bpoAss); 00096 00097 minmax.Reset(); 00098 Array::Pattern::PatInOutOp(searchResult, minmax); 00099 00100 minmax.minPos.mX += searchPos.x; 00101 minmax.minPos.mY += searchPos.y; 00102 00103 if(level>0) 00104 { 00105 minmax.minPos *= 2; 00106 searchPos.x = minmax.minPos.mX - 1; 00107 searchPos.y = minmax.minPos.mY - 1; 00108 searchSize.x = 3; 00109 searchSize.y = 3; 00110 //clip 00111 Point max = mInputPyramid->GetSize(level-1); 00112 if(searchPos.x < 0) 00113 searchPos.x = 0; 00114 if(searchPos.y < 0) 00115 searchPos.y = 0; 00116 if(searchPos.x > max.x - 4) 00117 searchPos.x = max.x - 4; 00118 if(searchPos.y > max.y - 4) 00119 searchPos.y = max.y - 4; 00120 } 00121 level--; 00122 } 00123 mLastPos.translation.x = minmax.minPos.mX - mLastPos.size.x/2; 00124 mLastPos.translation.y = minmax.minPos.mY - mLastPos.size.y/2; 00125 00126 delete searchResult; 00127 delete searchArea; 00128 00129 }
Here is the call graph for this function:
|