9

ここでは、GIMP の遠近法ツールを使用して、次の効果を実現しようとしています。

元の画像 (620x466 ピクセル)

元の画像 (620x466 ピクセル)

画像の変換

画像の変換

私が持っているのは固定ウェブカメラで、上記の変換行列の図をプラグインして、台形の歪みのない出力を得たいと考えています。

OpenCVで画像の歪みを解消するために利用できる他のオプションがあることは承知していますが、最終的に台形の画像になりながら、手動で変換マトリックス図を提供したいと思います。

周りを読んで、私は感じているwarpPerspectivefindHomographyまたは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;
}
4

3 に答える 3

-1

dst の初期化を追加: Mat dst = _image.clone();

于 2016-09-08T09:18:14.453 に答える