本文由 @lonelyrains 出品,转载请注明出处。 

文章链接: http://blog.csdn.net/lonelyrains/article/details/46915705

上一步生成标定图參考上一篇文章OpenCV生成标定图

在生成标定图之后,须要用A4纸打印下来。才干拿到摄像头以下摆弄。

笔者使用的是imagelist图片列表的方式使用标定图。即先用摄像头拍一部分图片,然后再由以下说的校准project校准得到畸变參数——主要原因是还没有搞清楚怎么实时获取这个摄像头(海康威视)的视频流,眼下都是通过http从浏览器上登录訪问——OpenCV的校准演示样例本身是支持基于标定板视频流的实时校准的。

生成OpenCV识别的标定图列表的project:opencv248\sources\samples\cpp\imagelist_creator.cpp。 使用命令演示样例:imagelist_creator imagelist.yaml *.png。得到imagelist.yaml例如以下:

<?xml version="1.0"?>
<opencv_storage>
<images>
"1.png" "2.png" "3.png" "4.png" "5.png" "6.png" "7.png" "8.png"</images>
</opencv_storage>

使用标定图的校准project,參考OpenCV演示样例project:opencv248\sources\samples\cpp\calibration.cpp。使用命令演示样例:calibration  -w 9 -h 6 -pt chessboard -o camera.yaml -op -oe -su imagelist.xml。得到camera.yaml当中最关键的是摄像机内參数矩阵、畸变參数矩阵:

%YAML:1.0
calibration_time: "07/16/15 14:58:18"
camera_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 5.5977614554147385e+002, 0., 4.3513787505786939e+002, 0.,
4.1717385931117281e+002, 2.3329672151206768e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
rows: 5
cols: 1
dt: d
data: [ -4.0702020878986456e-001, 2.5025002728793899e-001,
-3.7768192568471098e-003, -9.1190914257643463e-004,
-1.0546751146845158e-001 ]

庆幸的是calibration.cpp中已经包括了怎样对一张畸变图片进行校准。整理出关键代码为:

#include <time.h>

void loadCameraParams(Mat &cameraMatrix, Mat &distCoeffs)
{
FileStorage fs( "camera.yaml", FileStorage::READ); fs ["camera_matrix"] >> cameraMatrix;
fs ["distortion_coefficients"] >> distCoeffs;
} Mat calibrator(Mat &view)
{
vector<string> imageList;
static bool bLoadCameraParams = false;
static Mat cameraMatrix, distCoeffs, map1, map2;
Mat rview;
Size imageSize,newImageSize; if(!view.data)
return Mat(); imageSize.width = view.cols;
imageSize.height = view.rows; newImageSize.width = imageSize.width;
newImageSize.height = imageSize.height; if(bLoadCameraParams == false)
{
loadCameraParams(cameraMatrix, distCoeffs);
bLoadCameraParams = true;
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),
getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, newImageSize, 0), newImageSize, CV_16SC2, map1, map2);
} //undistort( view, rview, cameraMatrix, distCoeffs, cameraMatrix );
remap(view, rview, map1, map2, INTER_LINEAR); //imshow("Image View", rview);
//int c = 0xff & waitKey(); rview.copyTo(view); return view;
}

途中遇到的问题和解决步骤:

1、使用摄像头拍完标定图片,使用,发现调用过程中崩溃。

即对着摄像头照了的非常多张图片。依旧未找到一张能正确识别棋盘的。

2、使用OpenCV自带的图片opencv248\sources\samples\cpp\leftXX.jpg,转成png,成功运行。

在识别到的棋盘中描出了角点。

3、为了减小问题出现的因素。尽量控制单一变量。使用行列同leftXX.jpg同样的标定板图片:宽9个小方格、高6个小方格。仍然不能识别。

4、怀疑是摄像头的畸变太严重,导致图片识别不了,就用手机摄像头试了一下。由于手机摄像头的畸变很小,基本能够忽略。结果尽管也不能识别。

可是将手机对着显示器拍照拍得的原始图片对着leftXX.jpg使用灰色边框,结果能够识别了!

5、再用摄像头拍的图片,使用灰色边框,发现仍然识别不了。假设摄像头畸变太严重导致识别不了,貌似也不太合情理,由于都是数字游戏呀。

方格应该能够比較好识别吧。畸变看起来也不是比leftXX.jpg大太多。剩下的仅仅能怀疑是打印纸的黑方格的黑色不明显。用毛笔涂黑(也是醉了)。

6、最后最终能够识别一部分图片了!也算大功告成吧。顺便歧视一把国内打印店的打印机质量,黑方格颜色太浅,咋leftXX.jpg外国打印机就打得那么神颜色。

原始畸变图片、校准工具描了角点的畸变图片和校正图片,取了同一张。分别例如以下:

添加了命令行的批处理文件,标定校准工具、图片打包下载链接:http://download.csdn.net/detail/lonelyrains/8906705

OpenCV使用标定图的更多相关文章

  1. Opencv——相机标定

    相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像. 相机标定的输入:标定图像上所有内角 ...

  2. 使用OpenCV进行标定(转载)

    转载自牛猫靖  http://www.cnblogs.com/2008nmj/p/6278076.html 使用OpenCV进行相机标定 1. 使用OpenCV进行标定 相机已经有很长一段历史了.但是 ...

  3. OpenCV相机标定

    标签(空格分隔): Opencv 相机标定是图像处理的基础,虽然相机使用的是小孔成像模型,但是由于小孔的透光非常有限,所以需要使用透镜聚焦足够多的光线.在使用的过程中,需要知道相机的焦距.成像中心以及 ...

  4. OpenCV相机标定坐标系详解

    在OpenCV中,可以使用calibrateCamera函数,通过多个视角的2D/3D对应,求解出该相机的内参数和每一个视角的外参数. 使用C++接口时的输入参数如下: objectPoints - ...

  5. 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  6. OpenCV相机标定和姿态更新

    原帖地址: http://blog.csdn.net/aptx704610875/article/details/48914043 http://blog.csdn.net/aptx704610875 ...

  7. Opencv学习笔记5:Opencv处理彩虹图、铜色图、灰度反转图

    一.概述: 人类能够观察到的光的波长范围是有限的,并且人类视觉有一个特点,只能分辨出二十几种灰度,也就是说即使采集到的灰度图像分辨率超级高,有上百个灰度级,但是很遗憾,人们只能看出二十几个,也就是说信 ...

  8. opencv生成灰度图并保存

    #include <opencv2/opencv.hpp>#include <iostream> using namespace cv;using namespace std; ...

  9. 使用OpenCV画折线图

    使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...

随机推荐

  1. 无法对数据库'XXX' 执行删除,因为它正用于复制"的解决方

    困扰二天的问题终于得以解决,貌似一个棘手的问题只要知道方法也似乎变得异常简单,记录此次的解决方法,避免遗忘. 无法对 数据库'UDS' 执行 删除,因为它正用于复制. (.Net SqlClient ...

  2. event & EventHandler

    [event & EventHandler] 在老C#中EventHandler指的是一个需要定义一个delegate,这个delegate是回调的规范.例如: public delegate ...

  3. mahout运行测试与kmeans算法解析

    在使用mahout之前要安装并启动hadoop集群 将mahout的包上传至linux中并解压即可 mahout下载地址: 点击打开链接 mahout中的算法大致可以分为三大类: 聚类,协同过滤和分类 ...

  4. vbox下安装centos (全部都是基于64位)

    1.首先提示说CPU内核不匹配,如下图: 于是查阅资料得知:64位CPU支持32位和64位,而要用64位内核,就需要主板支持,于是修改BIOS,在ADVANCE(高级)里,找到VT(也就是virtua ...

  5. myeclipse报异常:java.lang.OutOfMemoryError: Java heap space

  6. Colours

    A colour is an object representing a combination of Red, Green, and Blue (RGB) intensity values. Val ...

  7. js Object.defineProperty 使用

    语法 Object.defineProperty(obj, prop, descriptor) 参数说明: obj:必需.目标对象 prop:必需.需定义或修改的属性的名字descriptor:必需. ...

  8. hibernate 在做更新和删除的时候一定要把事务开启

    在做更新和删除的时候一定要把事务开启 在做更新和删除的时候一定要把事务开启 在做更新和删除的时候一定要把事务开启 重要的事情说三遍!!! curd之前配置文件 <property name=&q ...

  9. Android中源码Launcher主屏幕程序排列详解【安卓Launcher进化一】

    最近研究Lancher,从短信Mms的框架中过度到Launcher的bug和需求修改中,下面对launcher最简单的主屏幕程序的程序的布局的详 解,给读者一个入门的感觉,android的主屏幕一共分 ...

  10. C#指南,重温基础,展望远方!(13)C#泛型

    一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非常重要的新功能. 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样.但我们没有办法,只能 ...