Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenCV:如何正确使用findHomography_Java_Opencv_Matrix_Homography - Fatal编程技术网

Java OpenCV:如何正确使用findHomography

Java OpenCV:如何正确使用findHomography,java,opencv,matrix,homography,Java,Opencv,Matrix,Homography,我一直在尝试使用OpenCV的findhomography和perspectivetransform来获得从一组点到另一组点的变换矩阵 我为每个数据集生成50个随机点,并在屏幕上绘制它们。然后,我要求findHomography从两组点计算一个变换矩阵,并使用它变换原始集合的角点。透视变换的结果绘制在屏幕上 问题在于,即使忽略异常值的问题,矩阵findhomography生成的结果也不正确。我想在一个特征匹配问题中使用这个例子 这是我的测试代码 // Mat outImg =

我一直在尝试使用OpenCV的
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以工作并找到正确的变换矩阵?