Home || Visual Search || Applications || Architecture || 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, 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:


Generated on Thu Jan 13 09:21:06 2011 for ImpalaSrc by  doxygen 1.5.1