Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

virtual void Impala::Core::Tracking::SearcherPyramid::SearchObject ( Array::Array2dVec3Real64 image  )  [inline, virtual]

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, Impala::Core::Array::Trait::FuncExportMinMax< ArithT, DataT >::minPos, mInputPyramid, Impala::Core::Tracking::SearcherBase::mLastPos, mTemplatePyramid, Impala::Core::Geometry::PointZ::mX, Impala::Core::Geometry::PointZ::mY, Impala::Core::Array::Pattern::PatInOutOp(), Impala::Core::Array::Pattern::PatSet(), Impala::Core::Tracking::ImagePyramid::PropagateBaseChanges(), Impala::Core::Array::Trait::FuncExportMinMax< ArithT, DataT >::Reset(), 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 smaller)
00050         int level = mTemplatePyramid->Levels()-1;
00051         Point searchSize(mInputPyramid->GetSize(level));
00052         Point searchPos(0, 0);
00053         Point searchBorder(mInputPyramid->GetSize(0));
00054 
00055         Array::Array2dVec3Real64* searchArea;
00056         Array::Array2dVec3Real64* searchResult;
00057         searchArea = new Array::Array2dVec3Real64(searchSize.x + 2*searchBorder.x, searchSize.y + 2*searchBorder.y, 0, 0, 0);
00058         searchResult = new Array::Array2dVec3Real64(searchSize.x + 2*searchBorder.x, searchSize.y + 2*searchBorder.y, 0, 0, 0);
00059 
00060         Array::Trait::FuncExportMinMax<Array::Vec3Real64, Array::Array2dVec3Real64> minmax;
00061         Array::Trait::FuncBpoManhatDist dist;
00062         Array::Trait::FuncBpoAddAssignPtr bpoAss;
00063 
00064         while(level>=0)
00065         {
00066             searchBorder.x = mTemplatePyramid->GetLevel(level)->CW();
00067             searchBorder.y = mTemplatePyramid->GetLevel(level)->CH();
00068 
00069             searchArea->mCW = 2*searchBorder.x + searchSize.x;
00070             searchArea->mCH = 2*searchBorder.y + searchSize.y;
00071             searchArea->mBW = 0;
00072             searchArea->mBH = 0;
00073             Array::Pattern::PatSet(searchArea, mInputPyramid->GetLevel(level), searchPos.x - searchBorder.x, searchPos.y - searchBorder.y, searchSize.x + 2*searchBorder.x, searchSize.y + 2*searchBorder.y, 0, 0);
00074             searchArea->mCW = searchSize.x;
00075             searchArea->mCH = searchSize.y;
00076             searchArea->mBW = searchBorder.x;
00077             searchArea->mBH = searchBorder.y;
00078             searchResult->mCW = searchSize.x;
00079             searchResult->mCH = searchSize.y;
00080             searchResult->mBW = searchBorder.x;
00081             searchResult->mBH = searchBorder.y;
00082 
00083             Array::Pattern::FuncGenConv2dDispatch(searchResult, searchArea, mTemplatePyramid->GetLevel(level), dist, bpoAss);
00084 
00085             minmax.Reset();
00086             Array::Pattern::PatInOutOp(searchResult, minmax);
00087 
00088             minmax.minPos.mX += searchPos.x;
00089             minmax.minPos.mY += searchPos.y;
00090 
00091             if(level>0)
00092             {
00093                 minmax.minPos *= 2;
00094                 searchPos.x = minmax.minPos.mX - 1;
00095                 searchPos.y = minmax.minPos.mY - 1;
00096                 searchSize.x = 3;
00097                 searchSize.y = 3;
00098                 //clip
00099                 Point max = mInputPyramid->GetSize(level-1);
00100                 if(searchPos.x < 0)
00101                     searchPos.x = 0;
00102                 if(searchPos.y < 0)
00103                     searchPos.y = 0;
00104                 if(searchPos.x > max.x - 4)
00105                     searchPos.x = max.x - 4;
00106                 if(searchPos.y > max.y - 4)
00107                     searchPos.y = max.y - 4;
00108             }
00109             level--;
00110         }
00111         mLastPos.translation.x = minmax.minPos.mX - mLastPos.size.x/2;
00112         mLastPos.translation.y = minmax.minPos.mY - mLastPos.size.y/2;
00113 
00114         delete searchResult;
00115         delete searchArea;
00116         
00117     }

Here is the call graph for this function:


Generated on Fri Mar 19 11:22:38 2010 for ImpalaSrc by  doxygen 1.5.1