本文由 @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. Java import javax.servlet 出错

    Error: The import javax.servlet cannot be resolved The import javax.servlet.http.HttpServletRequest ...

  2. Android -- 消息处理机制源码分析(Looper,Handler,Message)

    android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...

  3. SqlServer 删除重复记录

    在给一个客户上线的系统里发现有一张表里出现了重复的数据,结果通过排查代码发现确实业务逻辑有问题,在修改了代码后需要将为数据库里的重复数据删除 在CSDN上找到解决方案,对线上的数据库尽量不要执行删除操 ...

  4. Android安装包相关知识汇总 (编译过程图给力)

    转自: https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208008519&idx=1&sn=278b7793699 ...

  5. Linux 重启Tomcat脚本

    #!/bin/test_restart.sh #Author : Javen #Desc : restart tomcat-test tomcatpath="/home/local/test ...

  6. CA证书服务器从2003迁移到2008 R2!

    1.在源 CA 服务器中备份相应的 CA :

  7. 【PAT】1028. List Sorting (25)

    题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1028 题目描述: Excel can sort records according to an ...

  8. 通过micrometer实时监控线程池的各项指标

    通过micrometer实时监控线程池的各项指标 前提 最近的一个项目中涉及到文件上传和下载,使用到JUC的线程池ThreadPoolExecutor,在生产环境中出现了某些时刻线程池满负载运作,由于 ...

  9. Geolocation 地理定位

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理及各个 ...

  10. HMM隐Markov模型的原理及应用建模

    这里不讲定量的公式.(由于我也没全然弄明确.不想误人子弟)仅仅谈高速定性理解. 隐Markov模型原理 隐Markov模型(Hidden Markov Model.HMM)的实质就是:已知几种原始分类 ...