2015-06-28 2 views
-1

Я пытаюсь вычислить функции HOG на GPU для разных уровней, а затем я сохраняю функции каждого уровня в yml-файле. Ниже приведена функция, которую я использую.Проблемы с gpu :: resize

void App::run() 
{ 
    unsigned int count = 0; 
    FileStorage fs; 
    running = true; 

    int width = 640; 
    int height = 480; 

    Size win_size(args.win_width, args.win_width * 2); 
    Size win_stride(args.win_stride_width, args.win_stride_height); 

    cv::gpu::HOGDescriptor gpu_hog(win_size, Size(16, 16), Size(8, 8), Size(8, 8), 9, 
            cv::gpu::HOGDescriptor::DEFAULT_WIN_SIGMA, 0.2, gamma_corr, 
            cv::gpu::HOGDescriptor::DEFAULT_NLEVELS); 

    VideoCapture vc("/home/ubuntu/Desktop/getdescriptor/images/image%d.jpg"); 
    Mat frame; 
    Mat Left; 
    Mat img_aux, img, img_to_show, img_new; 
    cv::Mat temp; 
    gpu::GpuMat gpu_img, descriptors, new_img; 

    char cbuff[20]; 


    while (running) 
    { 

     vc.read(frame); 

     if (!frame.empty()) 
     { 
      workBegin(); 

      sprintf (cbuff, "%04d", count); 

      // Change format of the image 
      if (make_gray) cvtColor(frame, img_aux, CV_BGR2GRAY); 
      else if (use_gpu) cvtColor(frame, img_aux, CV_BGR2BGRA); 
      else Left.copyTo(img_aux); 

      // Resize image 
      if (args.resize_src) resize(img_aux, img, Size(args.width, args.height)); 
      else img = img_aux; 
      img_to_show = img; 

      gpu_hog.nlevels = nlevels; 

      hogWorkBegin(); 
      if (use_gpu) 
      { 
       gpu_img.upload(img); 
       new_img.upload(img_new); 
       fs.open(cbuff, FileStorage::WRITE); 

       //double scale = 1.05; 
       for(int levels = 0; levels < nlevels; levels++) 
       { 
       gpu_hog.getDescriptors(gpu_img, win_stride, descriptors, cv::gpu::HOGDescriptor::DESCR_FORMAT_ROW_BY_ROW); 
       descriptors.download(temp); 

       printf("size %d %d\n", temp.rows, temp.cols); 

       fs <<"level" << levels;     
       fs << "features" << temp; 

       cout<<"("<<width<<","<<height<<")"<<endl; 

       width = round(width/scale); 
       height = round(height/scale); 

       cout<<"Levels "<<levels<<endl; 

       if(width < win_size.width || height < win_size.height) 
      break; 

      resize(img,img_new,Size(width,height)); 
      scale *= scale; 
       } 

       cout<<count<<endl; 
       count++; 
      } 

      hogWorkEnd(); 
      fs.release(); 
      } 
      else running = false; 
     } 
} 

Для получения первого изображения он правильно вычисления функции HOG для всех уровней, но и для следующего изображения он принимает старое значение ширины и высоты, и в этом случае разорвать следующий цикл.

if(width < win_size.width || height < win_size.height) 
break; 

Может какой-нибудь один пункт моя ошибка. Я пытался отладить, но, к сожалению, пока не удалось.

ответ

0

Функция HOG для каждого изображения принимает старое значение следующих трех параметров.
1. Ширина
2. Высота
3. Масштаб

И когда он вычисляет параметры HOG для следующего изображения он разорвать петлю сразу. Общая ошибка программирования.

Смежные вопросы