Java OpenCV:透视函数的参数是什么?
我正在用Java构建一个使用OpenCV的应用程序。我以前没有使用过这个库,而且Java实现有点缺乏文档。我需要撤消一个透视扭曲的图像,使其成为正方形。我需要把梯形变换成矩形。基本上,我需要拉伸两条平行边中较短的一条,以匹配较长平行边的长度。我知道我需要计算同音字并使用WarpPerspective函数,但我不知道如何构造这个命令。我知道单应性是什么,但我不知道如何声明单应性,也不知道如何输入透视图。让我强调一下,我理解这个理论,我只需要学习代码中的文本语法Java OpenCV:透视函数的参数是什么?,java,opencv,image-processing,homography,Java,Opencv,Image Processing,Homography,我正在用Java构建一个使用OpenCV的应用程序。我以前没有使用过这个库,而且Java实现有点缺乏文档。我需要撤消一个透视扭曲的图像,使其成为正方形。我需要把梯形变换成矩形。基本上,我需要拉伸两条平行边中较短的一条,以匹配较长平行边的长度。我知道我需要计算同音字并使用WarpPerspective函数,但我不知道如何构造这个命令。我知道单应性是什么,但我不知道如何声明单应性,也不知道如何输入透视图。让我强调一下,我理解这个理论,我只需要学习代码中的文本语法 例如,假设我的源梯形在(0,20)、
例如,假设我的源梯形在(0,20)、(0,80)、(200,0)和(200100)处有角。然后,我想以一个矩形“拉伸”结束到(0,0),(0100),(200,0)和(200200)。有人能提供一个代码示例吗?图像是Mat格式的。我不知道我是否能在Java中帮助您,但在C++中,解决方案非常简单:
// Matrix for getPerspectiveTransform()
Mat H( 2, 4, CV_32FC1 );
//Input and Output Image;
Mat input, output;
input = imread( "example.jpg", 1 );
std::vector<cv::Point2f> trapezoid;
std::vector<cv::Point2f> rectangular;
trapezoid.push_back(cv::Point2f(0,20));
trapezoid.push_back(cv::Point2f(0,80));
trapezoid.push_back(cv::Point2f(200,0));
trapezoid.push_back(cv::Point2f(200,100));
rectangular.push_back(cv::Point2f(0,0));
rectangular.push_back(cv::Point2f(0,100));
rectangular.push_back(cv::Point2f(0,200));
rectangular.push_back(cv::Point2f(200,200));
H = getPerspectiveTransform( trapezoid, rectangular );
warpPerspective( input, output, H,output.size() );
//getPerspectiveTransform()的矩阵
材料H(2,4,CV_32FC1);
//输入输出图像;
Mat输入、输出;
输入=imread(“example.jpg”,1);
向量梯形;
矢量矩形;
梯形。推回(cv::Point2f(0,20));
梯形。推回(cv::点2F(0,80));
梯形。推回(cv::点2F(200,0));
梯形推回(cv::Point2f(200100));
矩形。向后推(cv::Point2f(0,0));
矩形。推回(cv::Point2f(0100));
矩形。向后推(cv::Point2f(0200));
矩形。推回(cv::Point2f(200200));
H=getPerspectiveTransform(梯形、矩形);
warpPerspective(输入,输出,H,输出.size());
在java中,您可以看到以下两个链接,我认为它们完美地回答了您关于透视函数的所有问题:
我希望这对你有帮助
java代码
corners.add(new Point(215,90));
corners.add(new Point(470,90));
corners.add(new Point(540,240));
corners.add(new Point(150,240));
double maxWidth = 540 - 150 ;//BottomRight.x - BottomLeft.x
double maxHeight = 240 - 90 ; //BottomRight.y - TopLeft.y
target.add(new Point(0,0));
target.add(new Point(maxWidth-1,0));
target.add(new Point(0,maxHeight-1));
target.add(new Point(maxWidth-1,maxHeight-1));
trans=Imgproc.getPerspectiveTransform(Converters.vector_Point2f_to_Mat(corners), Converters.vector_Point2f_to_Mat(target));
Imgproc.warpPerspective(img, proj, trans, new Size(maxWidth,maxHeight));
orignal.updateFrame(Utils.fromMatToBufferedImage(img));
项目是目的地