本文由 @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. SQL Server 表,记录 死锁解决办法

    我自己的数据库表记录死锁后的 根据以下资料的 解决方案: 1. 先根据以下语句 查询 哪些表被 死锁,及 死锁的  spid SELECT request_session_id spid,OBJECT ...

  2. 解决eclipse中运行web项目时弹出的"Port 8080 required by Tomcat 9.0 Server at localhost is already in use...

    1.tomcat默认端口是8080,可以修改通过tomcat的端口 修改tomcat\conf\server.xml     结果运行程序,还是报"Port 8080 required by ...

  3. Jedis API 详细示例

    Jedis API 详细示例 https://www.jianshu.com/p/125357ee7651

  4. SPOJ 8222 NSUBSTR(SAM)

    这几天看了N多论文研究了下后缀自己主动机.刚開始蛋疼的看着极短的代码和clj的论文硬是看不懂,后来结合其它几篇论文研究了下.总算是明确了一些 推荐文章http://blog.sina.com.cn/s ...

  5. ArcGIS Add-In调试无法重新生成

    在调试ArcGIS Add-In时,出现错误:无法注册程序集"……\Projects\ArcGISAddIn\ArcGISAddIn\bin\Debug\ArcGISAddIn.dll&qu ...

  6. 华为P6-C00电信版,刷机总是失败? FAIL

    关于这个刷机失败的问题,我只想说一点: 华为P6-C00电信版刷机时,不是任意版本都可以刷到任意版本的.我只往上刷过,那就是华为的升级文档中有说明:“只有以下版本才可以升级到此版本”. 如果你的手机的 ...

  7. alarm 和 sleep

    http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seconds指定 ...

  8. 查看IE浏览器安装的插件

      请移步至文章:http://blog.sina.com.cn/u/6452627072  

  9. 如何防止SQL注入 http://zhangzhaoaaa.iteye.com/blog/1975932

    如何防止SQL注入 博客分类: 技术转载数据库 转自:http://021.net/vpsfaq/152.html -----解决方案--------------------------------- ...

  10. 【JS】jQuery中将数组转换成字符串join()和push()使用

    1.push()将元素依次添加至数组:2.join()将数组转换成字符串,里面可以带参数分隔符,默认[,] <script type = text/javascript> $(docume ...