OpenCV 相机校准

Posted

技术标签:

【中文标题】OpenCV 相机校准【英文标题】:OpenCV Camera Calibration 【发布时间】:2014-04-24 11:30:18 【问题描述】:

我正在使用 OpenCV 教程 (http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html) 进行相机校准。当我使用 .mp4 视频文件作为输入时,我的程序失败并出现此错误: 解析错误():在icvXMLParse,文件........\opencv\modules\core\src\persistence.cpp,第2252行中,有效的XML应该以'')开头

谁能告诉我我做错了什么?

【问题讨论】:

哪个 xml ?这需要更多细节。 确切错误是:OpenCV 错误:解析错误 (VIDEO0013.mp4(1): 有效的 XML 应以 icvXMLParse 中的 '') 开头,文件 ..\.. \..\..\opencv\modules\core\src\persistence.cpp,第 2252 行我真的不知道出了什么问题。我读取的 xml 文件没问题,看来我应该只使用 xml 文件作为校准的输入。 该示例似乎需要一个 xml 文件中的图像列表。如果你想改用视频,你不能只将视频的名称传递给需要 xml 的代码。 我的理解方式相同,但我看到另一个人在使用它,他只是写了第一个作为相机的输入,代码与他的相机配合得很好。看来他并没有改变其他任何东西。而且 xml cmets 说,你只需要写视频的路径..你可以在这里看到代码:docs.opencv.org/_downloads/in_VID5.xml 完全不同的故事。 (是的,videocapture 接受设备号和文件名) 【参考方案1】:

在示例 (camera_calibration.cpp) 中,对 readStringList 方法进行以下更改:

曾经:

static bool readStringList( const string& filename, vector<string>& l )

    l.clear();
    FileStorage fs(filename, FileStorage::READ);
    if( !fs.isOpened() )
        return false;

应该是:

static bool readStringList( const string& filename, vector<string>& l )

    l.clear();
    FileStorage fs;
    try 
        fs.open(filename, FileStorage::READ);
    
    catch (...) 
        return false;
    
    if( !fs.isOpened() )
        return false;

然后您可以使用视频文件名而不是 xml 输入文件,并且程序不会崩溃。如果输入文件不是xml/yml,FileStorage构造函数和open方法会抛出异常,需要捕获异常。

【讨论】:

【参考方案2】:

干得好。我遇到了同样的问题,我按照你的观点修复了应用 try..catch ...

C:\OpenCVProjects\ConsoleApplication1\x64\Release>ConsoleApplication1.exe -w 9 - h 6 -s 2 -o camera.yml -op -oe video.mp4

当使用来自摄像机的实时视频作为输入时,以下热键可能是 用过的: , 'q' - 退出程序 'g' - 开始捕捉图像 'u' - 打开/关闭不失真 校准成功。平均重投影误差 = 0.49

【讨论】:

以上是关于OpenCV 相机校准的主要内容,如果未能解决你的问题,请参考以下文章

在线校准相机中校准相机时出现 OpenCV 运行时错误

相机校准 OpenCV 相机作为输入

用于 OpenCV 的 Iphone 6 相机校准

OpenCV校准相机裁剪错误

如何根据相机校准(C++)生成的真实数据使用opencv模拟失真?

使用适用于 Matlab 与 OpenCV 的相机校准工具箱进行校准