title: Plotting a Gradient Vector Field in OpenCV
body: <p>I want to compute the gradient of a gray-scale image (<em>smoothed_plane</em> in the code) and plot it as a vector field in OpenCV, superposed to an existing image.</p>
  
  <p>I tried to apply  a pair of Sobel operators (I also tried Scharr) to compute the two derivatives along x and y as described in OpenCV documentation, but when I try to plot, the vector field seems to be completely wrong. I would like to understand what is my mistake.</p>
  
  <p>I put some code here to be more clear. Thanks in advance for your help.</p>
  
  <pre><code>//img is a gray-scale image
  Mat abs_grad_x, abs_grad_y, grad;
  Mat g_img;
  int ddepth = CV_16S;
  int scale = 1;
  int delta = 0;    
  
  cvtColor(img,g_img,CV_GRAY2BGR);
  
  
  smoothed_plane = Mat::zeros(image_height,image_width,CV_8UC1);
  gradient_field = Mat::zeros(image_height,image_width,CV_32FC2);
  
  // Smooth the dominant plane by convolution with a Gaussian
  GaussianBlur(dominant_plane,smoothed_plane,Size(51,51),image_height*image_width*0.5);
  
  /// Morphological opening (remove small objects from the foreground)
  erode(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40+1,40+1)));
  dilate(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));
  /// Morphological closing (fill small holes in the foreground)
  dilate(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));
  erode(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));
  
  imshow("Eroded plane",smoothed_plane);
  
  /// Gradient X
  Scharr( smoothed_plane, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( grad_x, abs_grad_x );
  
  /// Gradient Y
  Scharr( smoothed_plane, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( grad_y, abs_grad_y );
  
  for (int i = 0 ; i &lt; image_height ; i ++){
      for (int j = 0 ; j &lt; image_width ; j ++){
          gradient_field.at&lt;Point2f&gt;(Point2f(j,i)) = Point2f(abs_grad_x.at&lt;float&gt;(Point2f(j,i)),abs_grad_y.at&lt;float&gt;(Point2f(j,i)));
      }
  }
  
  for (int i = 0 ; i &lt; image_height ; i += flowResolution){
      for (int j = 0 ; j &lt; image_width ; j+= flowResolution){
          Point2f p(j,i);
          Point2f p2(gradient_field.at&lt;Point2f&gt;(p)+p);
          arrowedLine(g_img,p,p2,Scalar(0,0,255),1.5,8,0,0.1);
      }
  }//*/
  
  imshow("Gradient Vector Field", g_img);
  </code></pre>
  
  <p>EDIT:</p>
  
  <p>This is a pair of frames of my input/output results, as required</p>
  
  <p><a href="https://i.stack.imgur.com/zBn0P.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/zBn0P.png" alt="enter image description here"></a></p>
  
  <p>I tried to print out some values, and in some points I got very high or very low values. 
  Thanks again</p>