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 相机校准的主要内容,如果未能解决你的问题,请参考以下文章