标签: camera-calibration

FindChessboardCorners无法通过长焦距镜头检测非常大的图像上的棋盘

我可以将FindChessboardCorners函数用于小于15百万像素的图像,如2k x 1.5k.然而,当我在DSLR的图像上使用它时,分辨率为3700x5300,它不起作用.

我试图使用resize()直接缩小图像大小,然后它工作.

显然,OpenCV源代码中存在一些硬编码或错误.

你能帮我解决一下,还是指点一下这个补丁?

我发现有人在2006年发布了类似的问题,在这里,所以它看起来像问题仍然存在.

我使用的代码就像

found = findChessboardCorners( viewGray, boardSize, ptvec,
                                CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);
Run Code Online (Sandbox Code Playgroud)

更新

就在这里澄清一下.我认为该算法适用于较大的图像分辨率,但当棋​​盘占据较大比例的图像时,它会失败.例如,当我在相同的相机位置使用50mm固定镜头时,FindChessboardCorners永远不会失败.将其更改为100mm固定镜头后,该功能开始停止检测图案.我认为这与比例或焦距有关.

下图是100mm镜头效果.

更新2

我为大图像添加了一个锐化滤镜,它开始解决问题.

首先我用过

//do a sharpen filter for the large resolution image
if (viewGray.cols > 1500)
{
  Mat temp ;
  GaussianBlur(viewGray,temp, Size(0,0), 105) ; //hardcoded filter size, to be tested on 50 mm lens
  addWeighted(viewGray, 1.8, temp, -0.8,0,viewGray) ; //hardcoded weight, to be tested.
//imwrite("test"+ imageList[k][i], viewGray) ;

}

found = findChessboardCorners( viewGray, boardSize, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv computer-vision camera-calibration

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

找到图像点的真实世界坐标

我在互联网上搜索了很多资源很多天但我无法解决问题.

我有一个项目,我应该检测一个圆形物体在飞机上的位置.因为在一个平面上,我所需要的只是x和y位置(不是z)为此我选择了图像处理.相机(单视图,非立体)位置和方向相对于平面上的参考坐标系固定并且是已知的

我已经使用opencv检测到圆心的图像像素坐标.我现在需要的只是改变坐标.到现实世界.

http://www.packtpub.com/article/opencv-estimating-projective-relations-images 在本网站和其他网站中,同形转换命名为:

p = C [R | T] P; 其中P是真实世界坐标,p是像素坐标(在单应坐标系中).C是表示内在参数的相机矩阵,R是旋转矩阵,T是平移矩阵.我已经按照在opencv上校准相机的教程(应用了cameraCalibration源文件),我有9个精美的chessbordimages,作为输出我有内在的相机矩阵,以及每个图像的平移和旋转参数.

我有3x3内在相机矩阵(焦距和中心像素),以及3x4外在矩阵[R | T],其中R是左3x3,T是3x1.根据p = C [R | T] P公式,我假设通过将这些参数矩阵乘以P(世界),我们得到p(像素).但我需要的是将p(像素)坐标投影到地平面上的P(世界坐标).

我正在学习电气和电子工程.我没有进行图像处理或高级线性代数课程.我记得从线性代数课程中我们可以操纵变换为P = [R | T] -1*C-1*p.然而,这是在欧几里得协调系统中.我不知道在hompographic中这样的事情是可能的.而且3x4 [R | T] Vector不可逆.而且我不知道这是正确的方法.

内在和外在参数是已知的,我需要的是地平面上的真实世界项目坐标.由于点在一个平面上,坐标将是2个维度(深度并不重要,作为与单个视图几何体相对的参数).相机是固定的(位置,方向).如何在捕获的图像上找到该点的真实世界坐标通过相机(单一视图)?

编辑 我一直在阅读Gary Bradski和Adrian Kaehler的"学习opencv".在校准 - > Homography部分的第386页,它写成:q = sMWQ其中M是相机固有矩阵,W是3x4 [R | T],S是一个"高达"比例因子我假设与单应性概念相关,我不知道清楚.q是像素库,Q是真正的coord.据说为了获得在图像平面上检测到的物体的坐标的真实世界坐标(在棋盘平面上); Z = 0然后W = 0中的第三列(假设轴旋转),修剪这些不必要的部分; W是3x3矩阵.H = MW是3x3单应矩阵.现在我们可以反转单应矩阵并且左乘q得到Q = [XY 1],其中Z coord被修剪.

我应用了上面提到的算法.我得到了一些不能在图像角落之间的结果(图像平面与摄像机平面平行,距摄像机约30厘米,我得到的结果就像3000)(棋盘方形尺寸以毫米为单位输入,所以我假设输出的真实世界坐标再次以毫米为单位).无论如何,我还在努力.顺便说一下,结果非常非常大,但我将Q中的所有值除以Q的第三个分量得到(X,Y,1)

最终编辑

我无法完成相机校准方法.无论如何,我应该从透视投影和变换开始.这样,我通过图像平面和物理平面之间的透视变换(通过两个平面上的4对相应的共面点生成变换)进行了非常好的估计.然后简单地在图像像素点上应用变换.

opencv projection image-processing camera-calibration

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

如何理解KITTI相机校准文件?

我正在研究KITTI数据集.
我已经下载了对象数据集(左和右)和对象集的相机校准矩阵.

我想使用立体声信息.
但我不知道如何获得两个相机的内在矩阵和R | T矩阵.我不明白校准文件的含义.

校准文件的内容:

P0: 
7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 0.000000000000e+00 
0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 0.000000000000e+00 
0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P1: 
7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 -3.797842000000e+02 
0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 0.000000000000e+00 
0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P2: 
7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 4.575831000000e+01 
0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 -3.454157000000e-01 
0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 4.981016000000e-03
P3: 
7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 -3.341081000000e+02 
0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 2.330660000000e+00 
0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 3.201153000000e-03
R0_rect: 
9.999128000000e-01 1.009263000000e-02 -8.511932000000e-03 
-1.012729000000e-02 9.999406000000e-01 -4.037671000000e-03 
8.470675000000e-03 4.123522000000e-03 9.999556000000e-01
Tr_velo_to_cam: 
6.927964000000e-03 -9.999722000000e-01 -2.757829000000e-03 -2.457729000000e-02 
-1.162982000000e-03 2.749836000000e-03 -9.999955000000e-01 -6.127237000000e-02 
9.999753000000e-01 6.931141000000e-03 …
Run Code Online (Sandbox Code Playgroud)

computer-vision camera-calibration kitti

14
推荐指数
1
解决办法
9263
查看次数

使用Python和OpenCV错误校准网络摄像头

所有这些都是新手,我正在尝试按照指南进行网络摄像头校准,并使用下面的代码.我收到以下错误..

OpenCV错误:在collectCalibrationData中断言失败(ni> 0 && ni == ni1),文件/build/buildd/opencv-2.4.8+dfsg1/modules/calib3d/src/calibration.cpp,第3193行

cv2.error:/build/buildd/opencv-2.4.8+dfsg1/modules/calib3d/src/calibration.cpp:3193:错误:(-215)ni> 0 && ni == ni1 in function collectCalibrationData

有人可以解释这个错误是什么以及如何解决它?

(底部完全错误)

import numpy as np
import cv2
import glob


criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world 
imgpoints = [] # 2d points in image plane.
images = glob.glob('*.png')


objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
objp = objp * …
Run Code Online (Sandbox Code Playgroud)

python opencv camera-calibration

14
推荐指数
1
解决办法
9329
查看次数

为什么有3个冲突的OpenCV相机校准公式?

我遇到了OpenCV用于摄像机校准目的各种坐标参数化问题.问题是关于图像失真公式的三个不同信息来源显然给出了涉及的参数和方程的三个非等效描述:

(1)在他们的 "学习OpenCV ......"一书中,Bradski和Kaehler写了关于镜头失真的文章(第376页):

xcorrected = x * ( 1 + k1 * r^2 + k2 * r^4  + k3 * r^6 ) + [ 2 * p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ],

ycorrected = y * ( 1 + k1 * r^2 + k2 * r^4  + k3 * r^6 ) + [ p1 * ( r^2 + 2 * y^2 ) + 2 …
Run Code Online (Sandbox Code Playgroud)

math opencv formula camera-calibration

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

findChessboardCorners无法获得校准图像

我试图让OpenCV 2.4.5从我的网络摄像头识别棋盘图案.我无法做到这一点,所以我决定尝试使用"完美"的图像让它工作:

棋盘与白色边框

但它仍然不起作用 - patternFound每次都返回false.有谁知道我做错了什么?

#include <stdio.h>

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main(){
    Size patternsize(8,8); //number of centers
    Mat frame = imread("perfect.png"); //source image
    vector<Point2f> centers; //this will be filled by the detected centers

    bool patternfound = findChessboardCorners(frame,patternsize,centers);

    cout<<patternfound<<endl;
    drawChessboardCorners(frame, patternsize, Mat(centers), patternfound);

    cvNamedWindow("window");
    while(1){
        imshow("window",frame);
        cvWaitKey(33);
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ opencv computer-vision camera-calibration

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

来自视野的Kinect内在参数

微软声称Kinect的视角为垂直43度,水平57度(此处说明).鉴于这些,我们可以计算内在参数,即焦点和投影中心吗?我假设投影中心可以给出(0,0,0)?

谢谢

编辑:有关我正在尝试做什么的更多信息

我有一个用Kinect记录的图像数据集,我试图将像素位置(x_screen,y_screen和z_world(mm))转换为真实世界坐标.

如果我知道相机放置在真实世界坐标系中的点(x',y',z'),通过执​​行以下操作就足以找到真实世界的坐标:

x_world = (x_screen - c_x) * z_world / f_x
y_world = (y_screen - c_y) * z_world / f_y
Run Code Online (Sandbox Code Playgroud)

其中c_x = x'c_y = y'f_x, f_y是焦距?而且,只要了解视野,我怎样才能找到焦距?

谢谢

math geometry projection camera-calibration kinect

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

OpenCV:从翻译和旋转中获取透视矩阵

我正在尝试验证我的相机校准,所以我想纠正校准图像.我希望这将涉及使用调用,warpPerspective但我没有看到采用相机矩阵的明显函数,以及旋转和平移向量来生成此调用的透视矩阵.

基本上我想做这里描述的过程(特别是看到最后的图像),但从已知的相机模型和姿势开始.

是否有一个简单的函数调用,它采用相机的内在和外在参数,并计算透视矩阵用于warpPerspective

在打电话给图像warpPerspective后我会打电话undistort.

原则上,我可以通过在指定约束后解决opencv相机校准文档顶部定义的方程组来推导出解决方案Z=0,但我认为必须有一个固定的例程,允许我对我的测试图像进​​行正射校正.

在我看来,我发现很难通过所有的立体声校准结果 - 我只有一个摄像头,但想要在我只看平面测试模式的约束条件下纠正图像.

opencv camera-calibration

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

OpenCV通过扭曲两者来缝合图像

我已经找到了很多关于使用OpenCV进行图像拼接和变形的问题和答案,但我仍然找不到我的问题的答案.

我有两个鱼眼摄像头,我成功校准,因此在两个图像中都消除了失真.

现在我想将那些经过纠正的图像拼接在一起.所以我几乎都遵循这个例子,这也是很多其他拼接问题中提到的: 图像拼接示例

所以我做了Keypoint和Descriptor检测.我找到了匹配并获得了Homography矩阵,因此我可以扭曲其中一个图像,这样可以得到一个非常拉伸的图像.另一张图片保持不变.拉伸是我想要避免的.所以我在这里找到了一个很好的解决方案: 拉伸解决方案.

在幻灯片7上,您可以看到两个图像都被扭曲.我认为这会减少一幅图像的拉伸(在我看来,拉伸将分开,例如50:50).如果我错了请告诉我.

我遇到的问题是我不知道如何扭曲两个图像以使它们适合.我必须计算两个同性恋吗?我是否必须像Rect()或其他东西一样定义参考平面?如何实现幻灯片7所示的变形结果?

为了说清楚,我不是在德累斯顿工业大学学习,所以这只是我在研究时发现的东西.

c++ opencv camera-calibration image-stitching opencv-stitching

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

正确校正GPU的立体图像(opencv)

我一直在使用cv :: StereoBM,我试图切换到cuda :: StereoBM(使用GPU),但遇到了一个问题,即使使用相同的设置和输入图像,它们看起来完全不同.我在这篇文章中读到,cuda的输入需要与cv :: StereoBM不同地进行修正.具体而言,差异必须在[0,256]范围内.我花了一些时间寻找如何纠正cuda图像的其他例子,但没有结果.使用cv :: StereoBM的输出看起来不错,所以我的图像已正确纠正.有没有办法将一种矫正类型转换为另一种?

如果有人有兴趣,这里是我用来纠正立体声的代码(注意:在我通过这个程序运行之前,我正在整理每个图像以摆脱'镜头效果'):

    #include "opencv2/core/core.hpp"
    #include "opencv2/calib3d/calib3d.hpp"
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    //#include "opencv2/contrib/contrib.hpp"
    #include <stdio.h>

    using namespace cv;
    using namespace std;

    int main(int argc, char* argv[])
    {
        int numBoards = 20;
        int board_w = 9;
        int board_h = 14;

        Size board_sz = Size(board_w, board_h);
        int board_n = board_w*board_h;

        vector<vector<Point3f> > object_points;
        vector<vector<Point2f> > imagePoints1, imagePoints2;
        vector<Point2f> corners1, corners2;

        vector<Point3f> obj;
        for (int j=0; j<board_n; j++)
        {
            obj.push_back(Point3f(j/board_w, j%board_w, 0.0f));
        }

        Mat …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing computer-vision camera-calibration

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