HoG features for blocks only

后端 未结 1 486
小鲜肉
小鲜肉 2021-01-18 08:11

I am trying to calculate HOG features for block only. I explored hog.cpp listed under opencv/module/gpu/src/. Below is the code that I change to co

相关标签:
1条回答
  • 2021-01-18 08:34

    I modified the following functions to calculate HOG descriptors for blocks only.

    void cv::gpu::HOGDescriptor::getDescriptorsBlock(const GpuMat& img, Size win_stride, GpuMat& descriptors, FileStorage fs3, string fileName, double scale, int width, int height, size_t lev)
    {
        CV_Assert(win_stride.width % block_stride.width == 0 && win_stride.height % block_stride.height == 0);
    
        size_t block_hist_size = getBlockHistogramSize();
        computeBlockHistograms(img);
        Size blocks_per_img = numPartsWithin(img.size(), block_size, block_stride);
    
        // Size blocks_per_win = numPartsWithin(win_size, block_size, block_stride);
        // Size wins_per_img   = numPartsWithin(img.size(), win_size, win_stride);
    
        // copy block_hists from GPU to CPU/
    
        float dest_ptr[block_hist_size * blocks_per_img.area()];
    
        cudaMemcpy( &dest_ptr[0], block_hists.ptr<float>(), block_hist_size *blocks_per_img.area()*sizeof(CV_32F),        cudaMemcpyDeviceToHost); 
    
        std::cout<<"( "<<width<< " ," << height<< ")"<< std::endl;
        std::cout <<lev<< std::endl;
    
        // write to yml file
    
        int level = lev;
    
        fs3<<"Scale"<<scale;
        fs3 <<"Level"<<level;
        fs3<<"Width"<<width<<"Height"<<height;
        fs3 << "features" << "[";
        for (unsigned int i = 0; i < (block_hist_size * blocks_per_img.area()) ; i++ )
        {
         fs3  << dest_ptr[i];
        }
        fs3 << "]";
    }
    

    Below is the that calculate HOG descriptors for multi scale image.

    void cv::gpu::HOGDescriptor::getDescriptorsMultiScale(const GpuMat& img,
                                                  Size win_stride, double scale0, unsigned int count)
    {
    
        CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4);
    
        vector<double> level_scale;
        double scale = 1.;
        int levels = 0;
    
        for (levels = 0; levels < nlevels; levels++)
        {
            level_scale.push_back(scale);
            if (cvRound(img.cols/scale) < win_size.width ||
                cvRound(img.rows/scale) < win_size.height || scale0 <= 1)
                break;
            scale *= scale0;
        }
        levels = std::max(levels, 1);
        level_scale.resize(levels);
        image_scales.resize(levels);
    
        // open yml file with image ID
    
        FileStorage fs3;
        char fileName[20];
        GpuMat descriptors;
        sprintf (fileName, "%04d", count);
        fs3.open(fileName, FileStorage::WRITE);
    
        for (size_t i = 0; i < level_scale.size(); i++)
        {
            scale = level_scale[i];
            Size sz(cvRound(img.cols / scale), cvRound(img.rows / scale));
            GpuMat smaller_img;
    
            if (sz == img.size())
                smaller_img = img;
            else
            {
                image_scales[i].create(sz, img.type());
                switch (img.type())
                {
                    case CV_8UC1: hog::resize_8UC1(img, image_scales[i]); break;
                    case CV_8UC4: hog::resize_8UC4(img, image_scales[i]); break;
                }
                smaller_img = image_scales[i];
            }
            std::cout<<"scale "<<level_scale[i]<<std::endl;
    
            // calculate descriptors for blocks 
            getDescriptorsBlock( smaller_img, win_stride, descriptors, fs3, fileName, scale, smaller_img.cols, smaller_img.rows, i);
    
            // detect(smaller_img, locations, hit_threshold, win_stride, padding);
        }
        // close yml file
        fs3.release();
    
    } 
    

    Don't forget to add definition of these two functions in opencv/modules/gpu/include/opencv2/gpu/gpu.hpp

    0 讨论(0)
提交回复
热议问题