Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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 findHomography将图像点转换为地平面点_Java_Opencv_Homography_Perspectivecamera - Fatal编程技术网

Java findHomography将图像点转换为地平面点

Java findHomography将图像点转换为地平面点,java,opencv,homography,perspectivecamera,Java,Opencv,Homography,Perspectivecamera,目标:从摄影机透视视图中获取一个点或一组点,并将其转换为相应的地平面点 方法:使用findHomography获得单应矩阵。计划使用透视变换 问题:无法解释单应矩阵,也无法理解如何继续。9个元素中有5个是空的,我认为这意味着单应性是错误的,尽管没有办法解释结果,所以a做了一些打印声明 import org.opencv.calib3d.*; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.cor

目标:从摄影机透视视图中获取一个点或一组点,并将其转换为相应的地平面点

方法:使用findHomography获得单应矩阵。计划使用透视变换

问题:无法解释单应矩阵,也无法理解如何继续。9个元素中有5个是空的,我认为这意味着单应性是错误的,尽管没有办法解释结果,所以a做了一些打印声明

import org.opencv.calib3d.*;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.*;

import java.util.List;
import java.util.LinkedList;
import java.util.ArrayList;

final public class HomographyTest {

    public static void main(String[] args) {

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // needed by OpenCV

        String rfileoutput = "/home/will/dev/Homog.jpg";
        String ofileoutput = "/home/will/dev/HomogOutput.jpg";

        Point SEShedCornerDst = new Point(49, 74);
        Point CloseForsythiaDst = new Point(41, 41);
        Point CornerHazelDst = new Point(111, 157);
        Point FarForsythiaDst = new Point(175, 21);
        Point FirstLiquidAmberDst = new Point(235, 164);
        Point SecondLiquidAmberDst = new Point(282, 721);
        Point ThirdLiquidAmberDst = new Point(317, 544);

        Point SEShedCornerSrc = new Point(30, 231);
        Point CloseForsythiaSrc = new Point(160, 290);
        Point CornerHazelSrc = new Point(50, 125);
        Point FarForsythiaSrc = new Point(628, 146);
        Point FirstLiquidAmberSrc = new Point(299, 64);
        Point SecondLiquidAmberSrc = new Point(146, 37);
        Point ThirdLiquidAmberSrc = new Point(48,34);

        Point [] srcArray = new Point[7];
        srcArray[0] = SEShedCornerSrc;
        srcArray[1] = CloseForsythiaSrc;
        srcArray[2] = CornerHazelSrc;
        srcArray[3] = FarForsythiaSrc;
        srcArray[4] = FirstLiquidAmberSrc;
        srcArray[5] = SecondLiquidAmberSrc;
        srcArray[6] = ThirdLiquidAmberSrc;

        Mat OutputMat = new Mat();
        LinkedList<Point> dstArray = new LinkedList<Point>();

        dstArray.add(SEShedCornerDst);
        dstArray.add(CloseForsythiaDst);        
        dstArray.add(CornerHazelDst);
        dstArray.add(FarForsythiaDst);
        dstArray.add(FirstLiquidAmberDst);
        dstArray.add(SecondLiquidAmberDst);
        dstArray.add(ThirdLiquidAmberDst);

        MatOfPoint2f dst = new MatOfPoint2f();
        dst.fromList(dstArray);

        MatOfPoint2f src = new MatOfPoint2f();
        src.fromArray(srcArray);

        Mat Homog;


        Homog = Calib3d.findHomography(src, dst, Calib3d.RANSAC, 10, OutputMat);

        System.out.println("Columns = " + Homog.cols());
        System.out.println("Rows = " + Homog.rows());
        System.out.println("Width = " + Homog.width());
        System.out.println("Dims = " + Homog.dims());

        for (int i=1; i<= Homog.cols();i++){
            for (int j=1; j<=Homog.rows();j++){
                System.out.println("Row, column " + i + "," + j + " = " + Homog.get(j, i));
            }
            System.out.println();
        }
        System.out.println(Homog.toString());
        System.out.println(OutputMat.toString());
        Highgui.imwrite(rfileoutput, Homog);
        Highgui.imwrite(ofileoutput, OutputMat);
    }
}
我走对了吗?如果没有,我该怎么办

如果是这样,在src Mat中输入什么类型的透视变换,以及如何在它所说的两个必需通道中实现这一点


我真的无法解释你的代码,尤其是你的点,但我认为这并不重要,因为正如你所说,你的目标是从两组点创建一个单应矩阵,并用得到的单应矩阵透视变换图像

迭代单应矩阵

首先,通过单应矩阵(3x3矩阵)的迭代得到空值的原因是,Mat索引开始于0,结束于-1

它应该是这样的:

for (int i = 0; i < homography.cols(); i++){
    for (int j = 0; j < homography.rows(); j++){
        System.out.println("[" + i + "," + j + "] = " + Arrays.toString(homography.get(j, i)));
    }
}
将单应性应用于单点而不是图像

顺便说一句


在Java中,通常的做法是以小写字母开头变量名。我看到了Homog和OutputMat。当我读到类似的内容时,我希望它们是类。

我不能真正解释你的代码,尤其是你的点,但我认为这并不重要,因为正如你所说,你的目标是从两组点创建一个单应矩阵,并用得到的单应矩阵透视变换图像

迭代单应矩阵

首先,通过单应矩阵(3x3矩阵)的迭代得到空值的原因是,Mat索引开始于0,结束于-1

它应该是这样的:

for (int i = 0; i < homography.cols(); i++){
    for (int j = 0; j < homography.rows(); j++){
        System.out.println("[" + i + "," + j + "] = " + Arrays.toString(homography.get(j, i)));
    }
}
将单应性应用于单点而不是图像

顺便说一句


在Java中,通常的做法是以小写字母开头变量名。我看到了Homog和OutputMat。当我读到类似的内容时,我希望它们是类。

谢谢,从索引0开始时,单应性确实显示为完全填充。我的目标是从图像中提取一个点,并将其转换为地平面坐标。我相信我已经找到了正确的摄影方法。透视图似乎专注于图像。我需要做什么才能从图像中变换x,y点?如何填充信息?您对图像的理解有误。图像是矩阵,如果你愿意的话,是一个数字数组。源图像中的任何点都将扭曲。如果你的图片/矩阵只包含一个点,实际上只有一个点会被转换为像素向量。@我可能误解了你的意图。如果只想变换单点。我已将其添加到我的答案中。我正在通过正确的Mat元素/类型提取数据,必须在晚上回到这里,感谢您迄今为止的出色帮助。这就是答案!非常感谢,您的投入对我理解这一能力至关重要。干杯谢谢,当从索引0开始时,单应性确实显示为完全填充。我的目标是从图像中提取一个点,并将其转换为地平面坐标。我相信我已经找到了正确的摄影方法。透视图似乎专注于图像。我需要做什么才能从图像中变换x,y点?如何填充信息?您对图像的理解有误。图像是矩阵,如果你愿意的话,是一个数字数组。源图像中的任何点都将扭曲。如果你的图片/矩阵只包含一个点,实际上只有一个点会被转换为像素向量。@我可能误解了你的意图。如果只想变换单点。我已将其添加到我的答案中。我正在通过正确的Mat元素/类型提取数据,必须在晚上回到这里,感谢您迄今为止的出色帮助。这就是答案!非常感谢,您的投入对我理解这一能力至关重要。干杯
// obtain your homography mat (picked your parameters.. you have to play to get the right results)
Mat homography = Calib3d.findHomography(src, dst, Calib3d.RANSAC, 10);
// image you want to transform
Mat image = Highgui.imread("image/img.jpg");
// outputMat will contain the perspectively changed image
Imgproc.warpPerspective(image, outputMat, homography, new Size(image.cols(), image.rows()));
Mat src = new Mat();
// push a mat object with your points to the src
src.push_back(new MatOfPoint2f(new Point(x,y)));
// dst will contain your transformed points
Core.perspectiveTransform(src, dst, homography)