Java OpenCV:如何正确使用findHomography
我一直在尝试使用OpenCV的Java OpenCV:如何正确使用findHomography,java,opencv,matrix,homography,Java,Opencv,Matrix,Homography,我一直在尝试使用OpenCV的findhomography和perspectivetransform来获得从一组点到另一组点的变换矩阵 我为每个数据集生成50个随机点,并在屏幕上绘制它们。然后,我要求findHomography从两组点计算一个变换矩阵,并使用它变换原始集合的角点。透视变换的结果绘制在屏幕上 问题在于,即使忽略异常值的问题,矩阵findhomography生成的结果也不正确。我想在一个特征匹配问题中使用这个例子 这是我的测试代码 // Mat outImg =
findhomography
和perspectivetransform
来获得从一组点到另一组点的变换矩阵
我为每个数据集生成50个随机点,并在屏幕上绘制它们。然后,我要求findHomography
从两组点计算一个变换矩阵,并使用它变换原始集合的角点。透视变换的结果绘制在屏幕上
问题在于,即使忽略异常值的问题,矩阵findhomography
生成的结果也不正确。我想在一个特征匹配问题中使用这个例子
这是我的测试代码
//
Mat outImg = new Mat(500,1000,CvType.CV_32FC3,new Scalar(0,0,0));
//make obj test points
List<Point> p1 = new ArrayList<Point>();
for(int i=0;i<50;i++){
p1.add(new OpenCVTemplateMatcher().generateRandom2DPoint(50,50,450,450));
}
//make scene test points
List<Point> p2 = new ArrayList<Point>();
for(int i=0;i<50;i++){
p2.add(new OpenCVTemplateMatcher().generateRandom2DPoint(550,50,950,450));
}
System.out.println(p1.size());
//draw the points
for(Point p:p1){
Core.circle(outImg, p, 1, new Scalar(255,0,255),2);
}
for(Point p:p2){
Core.circle(outImg, p, 1, new Scalar(0,255,0),2);
}
//find bounding boxes on points and draw them
MatOfPoint2f mp1 = new MatOfPoint2f(); mp1.fromList(p1);
MatOfPoint2f mp2 = new MatOfPoint2f(); mp2.fromList(p2);
RotatedRect r1 = Imgproc.minAreaRect(mp1);
RotatedRect r2 = Imgproc.minAreaRect(mp2);
Point[] v1 = new Point[4]; r1.points(v1);
Point[] v2 = new Point[4]; r2.points(v2);
Core.line(outImg, v1[0], v1[1], new Scalar(0, 255, 0),1);
Core.line(outImg, v1[1], v1[2], new Scalar(0, 255, 0),1);
Core.line(outImg, v1[2], v1[3], new Scalar(0, 255, 0),1);
Core.line(outImg, v1[3], v1[0], new Scalar(0, 255, 0),1);
Core.line(outImg, v2[0], v2[1], new Scalar(255, 255, 0),1);
Core.line(outImg, v2[1], v2[2], new Scalar(255, 255, 0),1);
Core.line(outImg, v2[2], v2[3], new Scalar(255, 255, 0),1);
Core.line(outImg, v2[3], v2[0], new Scalar(255, 255, 0),1);
//show the corners
for(int i=0;i<4;i++){
Core.circle(outImg, v1[i], 3, new Scalar(200,250,50),2);
Core.circle(outImg, v2[i], 3, new Scalar(0,238,250),2);
}
MatOfPoint2f p1Corners = new MatOfPoint2f(); p1Corners.fromArray(v1);
MatOfPoint2f p2Corners = new MatOfPoint2f(); p2Corners.fromArray(v2);
//find transform as H
//Mat H = Calib3d.findHomography(p1Corners, p2Corners,Calib3d.RANSAC, 5);
Mat H = Calib3d.findHomography(mp1, mp2,0, 5);
//H = findTransform(mp1,mp2);
//find the transform of H from 1'(original)s corners
Mat orig_corners = new Mat(4,1,CvType.CV_32FC2);
Mat transformed_corners = new Mat(4,1,CvType.CV_32FC2);
orig_corners.put(0, 0, new double[] {v1[0].x,v1[0].y});
orig_corners.put(1, 0, new double[] {v1[1].x,v1[1].y});
orig_corners.put(2, 0, new double[] {v1[2].x,v1[2].y});
orig_corners.put(3, 0, new double[] {v1[3].x,v1[3].y});
Core.perspectiveTransform(orig_corners,transformed_corners,H);
Core.line(outImg, new Point(transformed_corners.get(0,0)), new Point(transformed_corners.get(1,0)), new Scalar(0, 255, 255),4);
Core.line(outImg, new Point(transformed_corners.get(1,0)), new Point(transformed_corners.get(2,0)), new Scalar(0, 255, 255),4);
Core.line(outImg, new Point(transformed_corners.get(2,0)), new Point(transformed_corners.get(3,0)), new Scalar(0, 255, 255),4);
Core.line(outImg, new Point(transformed_corners.get(3,0)), new Point(transformed_corners.get(0,0)), new Scalar(0, 255, 255),4);
Highgui.imwrite("test.jpg", outImg);
//
Mat outImg=新Mat(5001000,CvType.CV_32FC3,新标量(0,0,0));
//做obj测试点
列表p1=新的ArrayList();
对于(int i=0;我不确定两组完全随机的点之间如何存在单个映射。要发现findHomography
必须存在某种相关性。findHomography假设两组点基本上都是对应点。因此集合a中的点1应该是相同的点(不是相同的坐标,而是objectpoint)作为集合B中的点1。如果存在一些异常值(例如假对应),FindHomography仍能工作,但基本上两个点集都应该由相应的关联组成!!我不确定findHomography应该如何工作,谢谢你帮我澄清!我需要什么样的确切输入,以及如何关联findHomography以工作并找到正确的变换矩阵?