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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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_Java_Opencv_Camera Calibration - Fatal编程技术网

Java 摄像机校准OpenCV

Java 摄像机校准OpenCV,java,opencv,camera-calibration,Java,Opencv,Camera Calibration,我最近刚加入OpenCV,我一直在努力校准我的相机。经过几天的研究,我对它有了基本的了解。但我仍然不理解一些基本点 1) objectpoint矩阵的初始化,为什么我们要在0,0中初始化这个矩阵 Mat a = new MatOfPoint3f(); for(int y=0; y<SIZE_Y; ++y) { for(int x=0; x<SIZE_X; ++x) { p

我最近刚加入OpenCV,我一直在努力校准我的相机。经过几天的研究,我对它有了基本的了解。但我仍然不理解一些基本点

1) objectpoint矩阵的初始化,为什么我们要在0,0中初始化这个矩阵

Mat a = new MatOfPoint3f();
        for(int y=0; y<SIZE_Y; ++y) 
        {
            for(int x=0; x<SIZE_X; ++x)
            {
                points = new MatOfPoint3f(new Point3(x*distance_Board , y*distance_Board , 0));
                a.push_back(points);
            }
        }
我尝试了15幅以上的图像,但结果仍然很差,因为我不理解为每幅图像使用rvec和tvec的意义(我理解逻辑,因为每个点的旋转和平移都不同),但它如何帮助我们处理其他点/其他图像。我认为校准为我们提供了一种很好的方法,可以将整个场景中的3d点转换为2d点

这就是为什么我跑步的时候

        Calib3d.projectPoints(objectPoints, rvecs.get(i), tvecs.get(i), cameraMatrix, distCoeffs, imagePoints);
我真的不知道该选择哪个rvecs和TVEC

(三)

是否有一种方法可以将2D(图像点)转换为3D(真实世界)。我已经尝试过了 但由于校准参数不正确,结果不正确

(四)

我也尝试过从2D到3D的转换,如下所示

x ̃  =  x * ( 1 +  k1 * r^2 + k2 * r^4 ) + [ 2 p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ] 

y ̃  =  y * ( 1 +  k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * ( r^2 + 2 * y^2 ) ],
a) 但r是什么?r=sqrt(x^2+y^2)?和x=(x坐标像素)-(相机中心像素)

b) 摄像机中心是否为像素=cx=摄像机矩阵的参数

c) x坐标像素=u=图像点吗

网上有很多信息,但我还没有找到100%可靠的来源

我已经没有选择了,如果有人能给我一个关于相机校准的好解释或者给我指出正确的方向(论文等),我会非常感激


提前感谢您

我不知道您是否已经解决了opnecv校准问题,但我还是会给您一些提示。首先,我建议您阅读有关校准的论文()。Opencv方法基于张的工作,因此理解它是一个真正的优先事项。 校准摄像机意味着确定摄像机2D坐标系(以像素为单位,原点位于摄像机图像的左上角)和外部世界的3D坐标系(例如,以米为单位)之间的关系。当您将一个已知的平面校准对象放在相机前面时,系统应计算KnowW 3D对象和图像上2D对象之间的齐次变换(即您所说的“rvecs.get(i)、tvecs.get(i)”。 图像坐标始终以像素为单位,并且固有校准矩阵以像素为单位表示。 您不能将二维图像坐标“转换”为三维世界坐标,但可以计算适当的转换:它由内部校准矩阵和旋转转换矩阵组成。请看一下这篇文章
希望这有帮助

你有没有想过为什么你有两只眼睛?在最原始的意义上,这是因为只有用双眼我们才能知道物体有多远或多近。在一些需要恢复3D信息的应用程序中,3D信息是通过使用两个摄像头生成的,这称为立体视觉()。如果试图使用单个摄影机来描绘3D信息,则只能得到较差的近似值,在这种情况下,需要一个称为单应性()的变换,最后一个变换是为了尝试对透视图(或对象的距离或距离)建模。 在大多数情况下,当我们想要校准单个摄像机时,我们会尝试消除摄像机镜头产生的径向畸变()。Opencv为您提供了一个执行此过程的工具,在大多数情况下,需要一个棋盘来帮助完成此过程,您可以检查以下内容:,尽管更具体,但函数cvFindChessboardCorners。我希望这能对你有用,对不起,英语不是母语

        Calib3d.projectPoints(objectPoints, rvecs.get(i), tvecs.get(i), cameraMatrix, distCoeffs, imagePoints);
x ̃  =  x * ( 1 +  k1 * r^2 + k2 * r^4 ) + [ 2 p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ] 

y ̃  =  y * ( 1 +  k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * ( r^2 + 2 * y^2 ) ],