OpenCV image de la transformation et de la perspective du changement

Je suis en train de réaliser l'effet suivant, illustré ici à l'aide de l'outil de perspective dans GIMP.

image d'origine (620x466 pixels)

OpenCV image de la transformation et de la perspective du changement

la transformation de l'image

OpenCV image de la transformation et de la perspective du changement

Ce que j'ai est un fixe webcam et voudrais plugin au-dessus de la matrice de transformation de figures, résultant en un trapèze en forme de sortie sans distorsion.

Je suis conscient qu'il existe d'autres options disponibles pour undistort images dans OpenCV, mais je tiens vraiment à fournir matrice de transformation chiffres manuellement, tandis que de se retrouver avec une image en forme de trapèze.

De lecture autour, j'ai un sentiment warpPerspective, findHomography ou getPerspectiveTransform peut être utile, mais vous ne savez pas comment faire cela en C++

Tout utile conseils seraient grandement appréciés.


Essayé de courir avec le code suivant, mais je n'obtiens une fenêtre avec 1 pixel de l'affichage.

Peut-être la façon que j'ai des points spécifiques de pixels, est-ce correct?

    #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;
}

OriginalL'auteur winterDream | 2013-01-06