title: OpenCV image transformation and perspective change
body: <p>I'm trying to achieve the following effect, shown here using the perspective tool in GIMP.</p>
  
  <p><strong>original image (620x466 pixels)</strong></p>
  
  <p><img src="https://i.stack.imgur.com/1RxIB.png" alt="original image (620x466 pixels)"></p>
  
  <p><strong>transforming the image</strong></p>
  
  <p><img src="https://i.stack.imgur.com/YQTgX.png" alt="transforming the image"></p>
  
  <p>What I have is a fixed webcam and would like to plugin the above transformation matrix figures, resulting in a trapezium shaped undistorted output.</p>
  
  <p>I am aware that there are other options available to undistort images in OpenCV, but I would really like to provide transformation matrix figures manually, whilst ending up with a trapezium shaped image.</p>
  
  <p>From reading around I have a feeling <code>warpPerspective</code>, <code>findHomography</code> or <code>getPerspectiveTransform</code> may be useful, but not sure how to go about this in C++</p>
  
  <p>Any helpful advice would be greatly appreciated.</p>
  
  <hr>
  
  <p>Tried running with the following code but I only get a window with 1 pixel showing.</p>
  
  <p>Maybe the way I have specified points in pixels, is this correct?</p>
  
  <pre><code>    #include &lt;opencv2/core/core.hpp&gt;
      #include &lt;opencv2/opencv.hpp&gt;
      #include &lt;cv.h&gt;
      #include &lt;opencv2/highgui/highgui.hpp&gt;
      #include &lt;iostream&gt;
  
      using namespace cv;
      using namespace std;
  
              cv::Mat OpenWarpPerspective(const cv::Mat&amp; _image
                , const cv::Point2f&amp; _lu
                , const cv::Point2f&amp; _ru
                , const cv::Point2f&amp; _rd
                , const cv::Point2f&amp; _ld
                , const cv::Point2f&amp; _lu_result
                , const cv::Point2f&amp; _ru_result
                , const cv::Point2f&amp; _rd_result
                , const cv::Point2f&amp; _ld_result
                , cv::Mat&amp; _transform_matrix)
              {
                // todo do some checks on input.
  
                cv::Point2f source_points[4];
                cv::Point2f dest_points[4];
  
  
                source_points[0] = _lu;
                source_points[1] = _ru;
                source_points[2] = _rd;
                source_points[3] = _ld;
  
                dest_points[0] = _lu_result;
                dest_points[1] = _ru_result;
                dest_points[2] = _rd_result;
                dest_points[3] = _ld_result;
  
                cv::Mat dst;
                _transform_matrix = cv::getPerspectiveTransform(source_points, dest_points);
                cv::warpPerspective(_image, dst, _transform_matrix, dst.size());
  
                return dst;  
              }
  
      int main( int argc, char** argv )
      {
  
          Mat image;
          Mat edited;
  
          image = imread("c:/org.png", CV_LOAD_IMAGE_COLOR);   // Read the file
  
          namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
  
              Point2f one = (0.0, 0.0);
              Point2f two = (317.0, 0.0);
              Point2f three = (317.0, 240.0);
              Point2f four = (0.0, 240.0);
  
              Point2f five = (-100.0, 0.0);
              Point2f six = (617.0, 0.0);
              Point2f seven = (317.0, 240.0);
              Point2f eight = (0.0, 240.0);
  
              OpenWarpPerspective(image,one,two,three,four,five,six,seven,eight,edited);  
  
          imshow( "Display window", edited );                   // Show our image inside it.
  
          waitKey(0);                                          // Wait for a keystroke in the window
          return 0;
  }
  </code></pre>