2013-08-21 51 views
0

我正在通過haar.cpp的代碼來了解滑動窗口的方法。這裏是代碼:瞭解V&J(Haar.cpp)滑動窗口

for(factor = 1; ; factor *= scaleFactor) 
     { 
      CvSize winSize = { cvRound(winSize0.width*factor), 
           cvRound(winSize0.height*factor) }; 
      CvSize sz = { cvRound(img->cols/factor), cvRound(img->rows/factor) }; 
      CvSize sz1 = { sz.width - winSize0.width + 1, sz.height - winSize0.height + 1 }; 

      CvRect equRect = { icv_object_win_border, icv_object_win_border, 
       winSize0.width - icv_object_win_border*2, 
       winSize0.height - icv_object_win_border*2 }; 

      CvMat img1, sum1, sqsum1, norm1, tilted1, mask1; 
      CvMat* _tilted = 0; 

      if(sz1.width <= 0 || sz1.height <= 0) 
       break; 
      if(winSize.width > maxSize.width || winSize.height > maxSize.height) 
       break; 
      if(winSize.width < minSize.width || winSize.height < minSize.height) 
       continue; 

      img1 = cvMat(sz.height, sz.width, CV_8UC1, imgSmall->data.ptr); 
      sum1 = cvMat(sz.height+1, sz.width+1, CV_32SC1, sum->data.ptr); 
      sqsum1 = cvMat(sz.height+1, sz.width+1, CV_64FC1, sqsum->data.ptr); 
      if(tilted) 
      { 
       tilted1 = cvMat(sz.height+1, sz.width+1, CV_32SC1, tilted->data.ptr); 
       _tilted = &tilted1; 
      } 
      norm1 = cvMat(sz1.height, sz1.width, CV_32FC1, normImg ? normImg->data.ptr : 0); 
      mask1 = cvMat(sz1.height, sz1.width, CV_8UC1, temp->data.ptr); 

      cvResize(img, &img1, CV_INTER_LINEAR); 
      cvIntegral(&img1, &sum1, &sqsum1, _tilted); 

      int ystep = factor > 2 ? 1 : 2; 
      const int LOCS_PER_THREAD = 1000; 
      int stripCount = ((sz1.width/ystep)*(sz1.height + ystep-1)/ystep + LOCS_PER_THREAD/2)/LOCS_PER_THREAD; 
      stripCount = std::min(std::max(stripCount, 1), 100); 

#ifdef HAVE_IPP 
      if(use_ipp) 
      { 
       cv::Mat fsum(sum1.rows, sum1.cols, CV_32F, sum1.data.ptr, sum1.step); 
       cv::Mat(&sum1).convertTo(fsum, CV_32F, 1, -(1<<24)); 
      } 
      else 
#endif 
       cvSetImagesForHaarClassifierCascade(cascade, &sum1, &sqsum1, _tilted, 1.); 

      cv::Mat _norm1(&norm1), _mask1(&mask1); 
      cv::parallel_for_(cv::Range(0, stripCount), 
         cv::HaarDetectObjects_ScaleImage_Invoker(cascade, 
           (((sz1.height + stripCount - 1)/stripCount + ystep-1)/ystep)*ystep, 
           factor, cv::Mat(&sum1), cv::Mat(&sqsum1), &_norm1, &_mask1, 
           cv::Rect(equRect), allCandidates, rejectLevels, levelWeights, outputRejectLevels, &mtx)); 
     } 
    } 

現在,我想確保我得到一切正確。據我所知,我們循環縮放並在每個縮放比例中對圖像進行二次抽樣,並嘗試以固定大小(面部爲20X20)查找對象,遍歷所有x和y位置。

僞代碼:

的規模= 1:ScaleMax

for X=1:width 

     for Y=1:height 

      Try do detect a face at position (x,y) and of a fixedsize of 20X20. 

那是精確的還是我得到的東西錯了嗎?

謝謝,

Gil。

回答

-1

儘管理解準確,但並不準確。 爲了更好的精確度,你應該閱讀中提琴和瓊斯的原稿,因爲所有的魔法都在步驟「嘗試在位置(x,y)和固定尺寸20X20上檢測臉部」

+0

謝謝,但我對此很清楚。我只需要了解滑動窗口。感謝您的回答。 – GilLevi