当我从每个摄像机的视图中获取对象的图片时,如何使用OpenCV检索旋转矩阵,平移向量以及每个摄像机的某些缩放因子?对于每张图片,我都有几个特征点的图像坐标.并非所有特征点都在所有图片中都可见.我想将对象的特征点的计算的3D坐标映射到稍微不同的对象,以将第二对象的形状与第一对象对齐.
我听说它可以使用,cv::calibrateCamera(...)但我无法通过它......
有人有这种问题的经历吗?
我知道默认的OpenCV校准系统模拟针孔相机,但我正在使用一个使用极宽FOV镜头(187度)的系统.如果有任何现有方法在OpenCV中执行此操作,或仅使用宽镜头?或者我是否必须为我的系统重写所有校准/解除错误?
在检查了几段代码后,我拍摄了几张照片,找到了棋盘角,并用它们来获取相机矩阵,失真系数,旋转和平移矢量。现在,有人可以告诉我我需要哪个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) 给定一组2D点,我该如何应用相反的undistortPoints?
我有相机内在的,distCoeffs并且想(例如)创建一个正方形,并扭曲它,好像相机已通过镜头观看它.
我在这里找到了一个'扭曲'补丁:http://code.opencv.org/issues/1387但它似乎只对图像有用,我想在稀疏点上工作.
我试图通过使用我的网络摄像头从具有已知全球位置的四个基准点的图像中获得全局姿势估计.
我检查了很多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
我最初在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点云
到目前为止,我所做的就是消除了我的问题:
我怀疑的问题是:
我的视差图像看起来相对可接受,但下一步是使用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) 我尝试校准我的相机.我举了一些例子,但他们都没有找到棋盘的角落.最后,我使用这个问题的代码,但它找不到角落.下面有一张图片.我用它来寻找角落.
我在网上找到了一个关于这个问题的命令.它说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) 有许多关于从已知内部校准的立体视图进行3D重建的帖子,其中一些是非常好的.我已经阅读了很多这些内容,根据我所阅读的内容,我正在尝试使用下面的管道/算法来计算我自己的3D场景重建.我将列出方法,然后在底部询问具体问题.
0.校准你的相机:
CalibrateCamera()和棋盘程序,但是这个功能也包括在Matlab的摄像机标定工具箱.OpenCV例程似乎运行良好.1.基本矩阵F:
findFundamentalMat()来获得F,它提供了许多选项方法(8点算法,RANSAC,LMEDS).x'Fx = 0其中x'和x是(x, y)齐次坐标中的原始图像点对应关系,(x, y, 1)并且三个向量中的一个被转置,以便乘法有意义.每个对应关系越接近于零,越好的F就越服从它的关系.这相当于检查派生的F实际从一个图像平面映射到另一个图像平面的程度.我使用8点算法获得~2px的平均偏差.2.基本矩阵E:
3.对E的内部约束:
USV.t那么它的奇异值应该是= a, a, 0.S的前两个对角元素应该相等,第三个零.E_new = U * diag(1,1,0) * V.t当然可以保证服从约束.你基本上人为地设置了S =(100,010,000).4.全相机投影矩阵:
x = PX关系.此外,P = …我正在使用OpenCV来校准使用带鱼眼镜头的相机拍摄的图像.
我正在使用的功能是:
findChessboardCorners(...); 找到校准图案的角落.cornerSubPix(...); 改善找到的角落.fisheye::calibrate(...); 校准相机矩阵和失真系数.fisheye::undistortImage(...); 使用从校准获得的相机信息使图像不失真.虽然生成的图像看起来看起来很好(直线等),但我的问题是该功能切掉了太多的图像.
这是一个真正的问题,因为我使用了四个90度相机的相机,当这么多的边被切断时,它们之间没有重叠的区域,这是我要缝合图像所需要的.
我调查使用fisheye::estimateNewCameraMatrixForUndistortRectify(...)但是我无法得到好结果,因为我不知道我应该R输入什么作为输入,因为旋转矢量输出fisheye::calibrate是3xN(其中N是校准图像的数量)并且fisheye::estimateNewCameraMatrixForUndistortRectify需要1x3或3x3.
下面的图像显示了我的非失真结果的图像,以及我理想情况下想要的结果的一个例子.
Undistortion:

想要结果的示例:

我有一个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) opencv ×9
c++ ×2
calibration ×2
distortion ×2
camera ×1
fisheye ×1
points ×1
python ×1
stereo-3d ×1