我正在尝试实现以下效果,此处使用 GIMP 中的透视工具显示。
原始图像(620x466 像素)

转换图像

我拥有的是一个固定的网络摄像头,并想插入上述变换矩阵图,从而产生梯形不失真的输出。
我知道在 OpenCV 中还有其他选项可用于使图像不失真,但我真的很想手动提供变换矩阵图,同时最终得到一个梯形图像。
从阅读中我有一种感觉warpPerspective,findHomography或者getPerspectiveTransform可能有用,但不确定如何在 C++ 中进行此操作
任何有用的建议将不胜感激。
尝试使用以下代码运行,但我只得到一个显示 1 个像素的窗口。
也许我以像素为单位指定点的方式,这是正确的吗?
    #include <opencv2/core/core.hpp>
    #include <opencv2/opencv.hpp>
    #include <cv.h>
    #include <opencv2/highgui/highgui.hpp>
    #include <iostream>
    using namespace cv;
    using namespace std;
            cv::Mat OpenWarpPerspective(const cv::Mat& _image
              , const cv::Point2f& _lu
              , const cv::Point2f& _ru
              , const cv::Point2f& _rd
              , const cv::Point2f& _ld
              , const cv::Point2f& _lu_result
              , const cv::Point2f& _ru_result
              , const cv::Point2f& _rd_result
              , const cv::Point2f& _ld_result
              , cv::Mat& _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;
}