标签: camera-calibration

OpenCV来自特征点的外在摄像头

当我从每个摄像机的视图中获取对象的图片时,如何使用OpenCV检索旋转矩阵,平移向量以及每个摄像机的某些缩放因子?对于每张图片,我都有几个特征点的图像坐标.并非所有特征点都在所有图片中都可见.我想将对象的特征点的计算的3D坐标映射到稍微不同的对象,以将第二对象的形状与第一对象对齐.

我听说它可以使用,cv::calibrateCamera(...)但我无法通过它......

有人有这种问题的经历吗?

opencv computer-vision perspectivecamera camera-calibration

12
推荐指数
1
解决办法
1万
查看次数

OpenCV中的鱼眼/广角镜头校准

我知道默认的OpenCV校准系统模拟针孔相机,但我正在使用一个使用极宽FOV镜头(187度)的系统.如果有任何现有方法在OpenCV中执行此操作,或仅使用宽镜头?或者我是否必须为我的系统重写所有校准/解除错误?

opencv calibration distortion camera-calibration

11
推荐指数
1
解决办法
7492
查看次数

OpenCV-如何使用棋盘作为参考从2D图像获取真实世界的距离

在此处输入图片说明

在检查了几段代码后,我拍摄了几张照片,找到了棋盘角,并用它们来获取相机矩阵,失真系数,旋转和平移矢量。现在,有人可以告诉我我需要哪个python opencv函数来计算2D图像在现实世界中的距离吗?项目要点?例如,以棋board为参考(参见图片),如果瓷砖大小为5cm,则4个瓷砖的距离应为20cm。我看到了一些函数,例如projectPoints,findHomography,solvePnP,但不确定要解决我的问题并获取相机世界和棋盘世界之间的转换矩阵,我不确定。1个单摄像头,在所有情况下,摄像头的位置相同,但不完全在棋盘上方,并且将棋盘放置在平面物体(桌子)上方

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
    objp = np.zeros((nx * ny, 3), np.float32)
    objp[:, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2)

    # Arrays to store object points and image points from all the images.
    objpoints = []  # 3d points in real world space
    imgpoints = []  # 2d points in image plane.

    # Make a list of calibration images
    images = glob.glob(path.join(calib_images_dir, 'calibration*.jpg'))
    print(images)
    # Step through the list and search for chessboard corners
    for filename …
Run Code Online (Sandbox Code Playgroud)

python opencv camera-calibration

11
推荐指数
1
解决办法
1132
查看次数

使用相机内在函数/外在函数重新扭曲点

给定一组2D点,我该如何应用相反的undistortPoints

我有相机内在的,distCoeffs并且想(例如)创建一个正方形,并扭曲它,好像相机已通过镜头观看它.

我在这里找到了一个'扭曲'补丁:http://code.opencv.org/issues/1387但它似乎只对图像有用,我想在稀疏点上工作.

opencv points distortion camera-calibration

10
推荐指数
3
解决办法
1万
查看次数

相机姿态估计(OpenCV PnP)

我试图通过使用我的网络摄像头从具有已知全球位置的四个基准点的图像中获得全局姿势估计.

我检查了很多stackexchange问​​题和一些文章,我似乎无法得到一个正确的解决方案.我得到的位置编号是可重复的,但绝不与摄像机移动成线性比例.仅供参考我使用的是C++ OpenCV 2.1.

在这个链接上描绘了我的坐标系和下面使用的测试数据.

% Input to solvePnP():
imagePoints =     [ 481, 831; % [x, y] format
                    520, 504;
                   1114, 828;
                   1106, 507]
objectPoints = [0.11, 1.15, 0; % [x, y, z] format
                0.11, 1.37, 0; 
                0.40, 1.15, 0;
                0.40, 1.37, 0]

% camera intrinsics for Logitech C910
cameraMat = [1913.71011, 0.00000,    1311.03556;
             0.00000,    1909.60756, 953.81594;
             0.00000,    0.00000,    1.00000]
distCoeffs = [0, 0, 0, 0, 0]

% output of solvePnP():
tVec = [-0.3515;
         0.8928; 
         0.1997]

rVec = [2.5279; …
Run Code Online (Sandbox Code Playgroud)

opencv computational-geometry camera-calibration pose-estimation extrinsic-parameters

10
推荐指数
1
解决办法
1万
查看次数

OpenCV立体匹配/校准

我最初在OpenCV论坛上发布了这个,但不幸的是,我没有得到太多的意见/回复,所以我发布在这里希望有人可能有一个方向可以建议吗?

我正在使用Bumblebee XB3立体相机,它有3个镜头.我花了大约三个星期阅读论坛,教程,学习OpenCV书以及使用立体声校准和立体声匹配功能的实际OpenCV文档.总而言之,我的问题是我生成了一个很好的视差图,但是非常差的点云,看起来像是倾斜/压扁,并不能代表实际的场景.

到目前为止我做了什么:

使用OpenCV stereo_calibration和stereo_matching示例:

使用国际象棋棋盘图像校准我的立体相机

1)原始场景图像:http ://answers.opencv.org/upfiles/1380850337241986.jpg
2)在相机校准后使用矩阵校正从相机获得的原始图像
:http ://answers.opencv.org/upfiles/ 13808502665723237.png
3)使用立体匹配(SGBM)从校正后的图像生成视差图像
:4)将这些差异预测为3D点云

到目前为止,我所做的就是消除了我的问题:

  • 我尝试了第一和第二张图像,然后是第二和第三张镜头,最后是第一张和第二张.
  • 我通过改变距离(更近/更远)重新校准我的棋盘捕获
  • 我使用了20多个立体声对进行校准
  • 使用的棋盘尺寸各不相同:我使用了9x6 Chessboard图像进行校准,现在切换到使用8x5图像
  • 我尝试使用块匹配以及SGBM变体并获得
    相对类似的结果.
    到目前为止,使用SGBM 获得更好的结果.
  • 我改变了差异范围,改变了SAD窗口大小等,几乎没有改进

我怀疑的问题是:

我的视差图像看起来相对可接受,但下一步是使用Q矩阵转到3D点云.我怀疑,我没有正确校准相机以生成正确的Q矩阵.不幸的是,我在思考我还能做些什么来获得更好的Q矩阵时,已经碰壁了.有人可以提出未来的建议吗?

我认为可能有问题的另一件事是我在使用cv :: stereoCalibrate函数时所做的假设.目前,我单独校准每个摄像头以获得摄像头和失真(cameraMatrix [0],distCoeffs [0]和cameraMatrix [1],distCoeffs [1])矩阵,因此它使stereoCalibrate功能的复杂性更容易一些.

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
                    cameraMatrix[0], distCoeffs[0],
                    cameraMatrix[1], distCoeffs[1],
                    imageSize, R, T, E, F,
                    TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
                    //CV_CALIB_FIX_ASPECT_RATIO +
                    //CV_CALIB_ZERO_TANGENT_DIST +
                    //CV_CALIB_SAME_FOCAL_LENGTH +
                    CV_CALIB_RATIONAL_MODEL 
                    //CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5
                    );
Run Code Online (Sandbox Code Playgroud)

另外,我认为提及我如何从差异到点云可能是有用的.我正在使用OpenCV的cv :: reprojectImageTo3D,然后将数据写入PCL Point云结构.这是相关代码:

cv::reprojectImageTo3D( imgDisparity16S, reconstructed3D, Q, false, CV_32F);
  for (int i …
Run Code Online (Sandbox Code Playgroud)

opencv stereo-3d camera-calibration

10
推荐指数
1
解决办法
7184
查看次数

使用OpenCV进行相机校准 - findChessboardCorners返回false

我尝试校准我的相机.我举了一些例子,但他们都没有找到棋盘的角落.最后,我使用这个问题的代码,但它找不到角落.下面有一张图片.我用它来寻找角落.

我在网上找到了一个关于这个问题的命令.它说board_sz必须保持内角的 数量,而不是方格数量.board_sz是一个二维对象.我不明白我怎么能用它来保存除了h*w之外的内角数.

我给w = 9,h = 7

编辑1****代码:

#include <cv.h>
#include <highgui.h>
#include <vector>
#include <stdlib.h>
#include <stdio.h>

using namespace cv;
using namespace std;

int main()
{
int numBoards = 0;
int numCornersHor;
int numCornersVer;

printf("Enter number of corners along width: ");
scanf("%d", &numCornersHor);

printf("Enter number of corners along height: ");
scanf("%d", &numCornersVer);

printf("Enter number of boards: ");
scanf("%d", &numBoards);

int numSquares = numCornersHor * numCornersVer;
Size board_sz = Size(numCornersHor, numCornersVer); …
Run Code Online (Sandbox Code Playgroud)

c++ opencv camera-calibration

10
推荐指数
1
解决办法
1万
查看次数

从两个校准过的摄像机进行3D重建 - 这个管道中的错误在哪里?

有许多关于从已知内部校准的立体视图进行3D重建的帖子,其中一些是非常好的.我已经阅读了很多这些内容,根据我所阅读的内容,我正在尝试使用下面的管道/算法来计算我自己的3D场景重建.我将列出方法,然后在底部询问具体问题.

0.校准你的相机:

  • 这意味着检索照相机校准矩阵ķ 1和K 2为摄像机1和摄像机2.这些是3×3矩阵每个封装相机的内部参数:焦距,主点偏移/图像中心.这些不会改变,只要您不缩放或更改您录制的分辨率,您只需要为每个摄像机执行一次此操作.
  • 离线这样做.不要争吵.
  • 我使用的OpenCVCalibrateCamera()和棋盘程序,但是这个功能也包括在Matlab的摄像机标定工具箱.OpenCV例程似乎运行良好.

1.基本矩阵F:

  • 现在您的相机设置为立体声装置.使用两个图像/视图之间的点对应来确定该配置的基本矩阵(3x3).
  • 你如何获得这些信件取决于你,并将在很大程度上取决于场景本身.
  • 我正在使用OpenCV findFundamentalMat()来获得F,它提供了许多选项方法(8点算法,RANSAC,LMEDS).
  • 您可以通过将结果矩阵插入到基本矩阵的定义方程中来测试得到的矩阵:x'Fx = 0其中x'和x是(x, y)齐次坐标中的原始图像点对应关系,(x, y, 1)并且三个向量中的一个被转置,以便乘法有意义.每个对应关系越接近于零,越好的F就越服从它的关系.这相当于检查派生的F实际从一个图像平面映射到另一个图像平面的程度.我使用8点算法获得~2px的平均偏差.

2.基本矩阵E:

  • 直接从F和校准矩阵计算基本矩阵.
  • E = K 2 T FK 1

3.对E的内部约束:

  • E应该遵守某些限制.特别是,如果被SVD分解成USV.t那么它的奇异值应该是= a, a, 0.S的前两个对角元素应该相等,第三个零.
  • 我很惊讶地在这里读到,如果在测试时不是这样,你可以选择从之前的分解中制作一个新的Essential矩阵,如下所示:E_new = U * diag(1,1,0) * V.t当然可以保证服从约束.你基本上人为地设置了S =(100,010,000).

4.全相机投影矩阵:

  • 有两个相机投影矩阵P 1和P 2.这些是3x4并遵守这种x = PX关系.此外,P = …

opencv computer-vision 3d-reconstruction camera-calibration

10
推荐指数
1
解决办法
2653
查看次数

OpenCV鱼眼校准会削减过多的图像

我正在使用OpenCV来校准使用带鱼眼镜头的相机拍摄的图像.

我正在使用的功能是:

  • findChessboardCorners(...); 找到校准图案的角落.
  • cornerSubPix(...); 改善找到的角落.
  • fisheye::calibrate(...); 校准相机矩阵和失真系数.
  • fisheye::undistortImage(...); 使用从校准获得的相机信息使图像不失真.

虽然生成的图像看起来看起来很好(直线等),但我的问题是该功能切掉了太多的图像.

这是一个真正的问题,因为我使用了四个90度相机的相机,当这么多的边被切断时,它们之间没有重叠的区域,这是我要缝合图像所需要的.

我调查使用fisheye::estimateNewCameraMatrixForUndistortRectify(...)但是我无法得到好结果,因为我不知道我应该R输入什么作为输入,因为旋转矢量输出fisheye::calibrate是3xN(其中N是校准图像的数量)并且fisheye::estimateNewCameraMatrixForUndistortRectify需要1x3或3x3.

下面的图像显示了我的非失真结果的图像,以及我理想情况下想要的结果的一个例子.

Undistortion:

我的不成型

想要结果的示例:

想要结果的例子

c++ opencv fisheye computer-vision camera-calibration

10
推荐指数
3
解决办法
8417
查看次数

校准矩阵中的图像中心

我有一个camera和一个3D对象,我计算了camera matrix 在给定的这个.使用相机拍摄的图像有大小1600x1200.但是在相机矩阵中我没有centers正确获得图像的值.而不是800, 600我得到一些其他的价值观.可能的原因是什么?

  #include <iostream>
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <math.h> 
    using namespace std;
    using namespace cv;
    int main()
    {
      int numberofpoints=30;
      float p2d[30][2] =
  {{72, 169}, {72, 184}, {71, 264}, {96, 168}, {94, 261}, {94, 276}, {257, 133},
    {254, 322}, {254, 337}, {278, 132}, {278, 146}, {275, 321}, {439, 228},
    {439, 243}, {437, 328}, {435, 431}, {461, 226}, {459, 326}, {459, 342},
    {457, 427}, {457, …
Run Code Online (Sandbox Code Playgroud)

camera calibration camera-calibration

10
推荐指数
1
解决办法
184
查看次数