如何使用边缘方向直方图进行物体检测?

时间:2015-08-29 12:55:51

标签: opencv image-processing computer-vision histogram object-detection

我正在研究物体检测代码,我选择了边缘方向直方图作为匹配的描述符。

我在后投影直方图中遇到问题,因为我似乎没有很好的匹配,后投影图像大多是白色,这意味着我不能使用meanshift左右来检测对象。

关于此事,请帮助我:

这是我到目前为止所做的:

  1. 获取初始投资回报率(需要在视频流中检测到的目标)。
  2. 将ROI转换为灰度
  3. 对x,y衍生物应用sobel算子。
  4. 使用opencv阶段函数(来自导数x和导数y)计算方向
  5. 制作生成方向的直方图。具有以下规格: (范围:0到2 PI),(单通道),(256个分档)
  6. 规范化直方图
  7. 执行这些步骤的代码如下:

    Mat ROI_grad_x, ROI_grad_y , ROI_grad , ROI_gray;
            Mat ROI_abs_grad_x, ROI_abs_grad_y;
    
            cvtColor(ROI, ROI_gray, CV_BGR2GRAY);
    
            /// Gradient X
            Sobel( ROI_gray, ROI_grad_x, CV_16S, 1, 0, 3 );
            /// Gradient Y
            Sobel( ROI_gray, ROI_grad_y, CV_16S, 0, 1, 3 );
    
            convertScaleAbs( ROI_grad_x, ROI_abs_grad_x );
            convertScaleAbs( ROI_grad_y, ROI_abs_grad_y );
    
            addWeighted( ROI_abs_grad_x, 0.5, ROI_abs_grad_y, 0.5, 0, ROI_grad );
    
            Mat ROI_orientation = Mat::zeros(ROI_abs_grad_x.rows, ROI_abs_grad_y.cols, CV_32F); //to store the gradients 
            Mat ROI_orientation_norm ;
    
            ROI_grad_x.convertTo(ROI_grad_x,CV_32F);
    
            ROI_grad_y.convertTo(ROI_grad_y,CV_32F);
    
            phase(ROI_grad_x, ROI_grad_y, ROI_orientation , false);
    
    
            Mat ROI_orientation_hist ;
            float ROI_orientation_range[] = {0 , CV_PI};
            const float *ROI_orientation_histRange[] = {ROI_orientation_range};
            int ROI_orientation_histSize =256;
            //calcHist( &ROI_orientation, 1, 0, Mat(), ROI_orientation_hist, 1, &ROI_orientation_histSize, &ROI_orientation_histRange , true, false);
            calcHist( &ROI_orientation, 1, 0, Mat(), ROI_orientation_hist, 1, &ROI_orientation_histSize, ROI_orientation_histRange , true, false);
    
            normalize( ROI_orientation_hist, ROI_orientation_hist, 0, 255, NORM_MINMAX, -1, Mat() );
    

    然后,对于捕获的每个相机帧,我执行以下步骤:

    1. 转换为灰度
    2. 对x衍生物和y衍生物应用sobel算子。
    3. 使用phase opencv函数计算方向(使用上面提到的2个导数)
    4. 将直方图投影到方向框架矩阵上以获得匹配。
    5. 此部分使用的代码如下:

       Mat grad_x, grad_y , grad;
      Mat abs_grad_x, abs_grad_y;
      
      /// Gradient X
      Sobel( frame_gray, grad_x, CV_16S, 1, 0, 3 );
      /// Gradient Y
      Sobel( frame_gray, grad_y, CV_16S, 0, 1, 3 );
      
      convertScaleAbs( grad_x, abs_grad_x );
      convertScaleAbs( grad_y, abs_grad_y );
      
      addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
      
      
      
      
      ///======================
      Mat orientation = Mat::zeros(abs_grad_x.rows, abs_grad_y.cols, CV_32F); //to store the gradients 
      Mat orientation_norm ;
      
      grad_x.convertTo(grad_x,CV_32F);
      
      grad_y.convertTo(grad_y,CV_32F);
      
      phase(grad_x, grad_y, orientation , false);
      Mat EOH_backProj ;
      calcBackProject( &orientation, 1, 0, ROI_orientation_hist, EOH_backProj, ROI_orientation_histRange, 1, true );
      

      那么,我的方法中似乎存在什么问题?!

      非常感谢。

0 个答案:

没有答案