我正在尝试实现以下效果,这里使用GIMP中的透视工具显示.
原始图像(620×466像素)
转变形象
我所拥有的是一个固定的网络摄像头,并且想要插入上述转换矩阵图,导致梯形的无失真输出.
我知道还有其他选项可用于在OpenCV中保留图像,但我真的希望手动提供转换矩阵数据,最后以梯形图像.
从阅读周围我有一个感觉warpPerspective,findHomography或getPerspectiveTransform可能是有用的,但不知道如何去做这个在C
任何有用的建议将不胜感激.
也许我以像素指定点的方式,这是正确的吗?
#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; }
解决方法
如果你有三个角点使用Warp Affine变换.如果你有四个角点,使用变形透视变换.这里是如何使用变形透视变换.选择图像的四个角点.然后选择所需矩形的四个对应点.经编变换将做其他事情.
cv::Mat OpenWarpPerspective(const cv::Mat& _image,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,cv::Size(_width,_height)); return dst; }