实验一报告角点检测和摄像机标定
一、实验目的
1. 掌握Hariss角点检测的基本原理和步骤。
2. 了解摄像机标定的基本原理和常用方法。
3. 复习VB、VC的基本概念、基本语法和编程方法,并熟练使用VB或VC编写遗传算法程序。
二、实验设备
微机
三、实验原理
角点是特征点最重要的一种表现形式。对角点提取的越准确,越有助于对图像的理解和分析,同时它对于确定场景中的物体乃至于立体视觉图像配准都有很重要的作用。
在角点检测过程中,给定一个小的滑动窗口,分析可知有三种情况:1)平滑区域:无论窗口如何移动,图像强度无显著变化。2)边缘区域:沿边缘方向灰度值无明显变化。3)兴趣点区域:无论朝哪个方向移动,均会产生灰度值的巨大变化。
传统的Harris角点检测算法的主要步骤可描述如下:
① 采用Sobel算子计算梯度图像:Ix,Iy。
② 逐点计算乘积图像:Ix2,Iy2,IxIy。
③ 用高斯窗w(x, y)对乘积图像中的所有像素点进行卷积。
?0.0146?0.0213?w?x,y???0.0241??0.0213
??0.01460.02130.02410.02130.0416?0.03100.03510.03100.0213??0.03510.03980.03510.0241? (1) ?0.03100.03510.03100.0213?0.02130.02410.02130.0146??
④ 对每个像素点,计算得到矩阵C,并对矩阵C进行特征值分解,得到两个特征值?1,?2。
?Ix2?w?x,y?C???IxIy?w?x,y??
⑤ 对每个像素点,计算区域判别准则值R IxIy?w?x,y??? (2) 2Iy?w?x,y???
R?detC?k?trC?
detC??1?2trC??1??2
式中,k一般取值0.06。 (3)
⑥ 通过判断R值的大小,检测角点。判断标准如下:如果是平滑区域,|R|很小;如果是边缘区
域,R<0;如果是兴趣点区域,R>0。
四、预习要求
1. 认真阅读教材中Harris角点检测的基本原理与步骤。
2. 复习VB、VC的基本概念、基本语法和编程方法。
五、实验内容及步骤
基本要求:(每位同学必须完成)
1. 上机编写程序,解决Harris角点检测问题,
2. 调试程序。
3. 根据实验结果,撰写实验报告。
提高要求:在角点检测基础上,完成摄像机的标定,标定方法不限。
六、Harris角点检测的代码实现
harris类
1. #ifndef HARRIS_H
2. #define HARRIS_H
3. #include "opencv2/opencv.hpp"
4.
5. class harris
6. {
7. private:
8. cv::Mat cornerStrength; //opencv harris函数检测结果,也就是每个像素的角点响应函数值
9. cv::Mat cornerTh; //cornerStrength阈值化的结果
10. cv::Mat localMax; //局部最大值结果
11. int neighbourhood; //邻域窗口大小
12. int aperture;//sobel边缘检测窗口大小(sobel获取各像素点x,y方向的灰度导数)
13. double k;
14. double maxStrength;//角点响应函数最大值
15. double threshold;//阈值除去响应小的值
16. int nonMaxSize;//这里采用默认的3,就是最大值抑制的邻域窗口大小
17. cv::Mat kernel;//最大值抑制的核,这里也就是膨胀用到的核
18. public:
19. harris():neighbourhood(3),aperture(3),k(0.01),maxStrength(0.0),threshold(0.01),nonMaxSize(3){ 20.
21. };
22.
23. void setLocalMaxWindowsize(int nonMaxSize){
24. this->nonMaxSize = nonMaxSize;
25. };
26.
27. //计算角点响应函数以及非最大值抑制
28. void detect(const cv::Mat &image){
29. //opencv自带的角点响应函数计算函数
30. cv::cornerHarris (image,cornerStrength,neighbourhood,aperture,k);
31. double minStrength;
32. //计算最大最小响应值
33. cv::minMaxLoc (cornerStrength,&minStrength,&maxStrength);
34.
35. cv::Mat dilated;
36. //默认3*3核膨胀,膨胀之后,除了局部最大值点和原来相同,其它非局部最大值点被
37. //3*3邻域内的最大值点取代
38. cv::dilate (cornerStrength,dilated,cv::Mat());
39. //与原图相比,只剩下和原图值相同的点,这些点都是局部最大值点,保存到localMax
40. cv::compare(cornerStrength,dilated,localMax,cv::CMP_EQ);
41. }
42.
43. //获取角点图
44. cv::Mat getCornerMap(double qualityLevel) {
45. cv::Mat cornerMap;
46. // 根据角点响应最大值计算阈值
47. threshold= qualityLevel*maxStrength;
48. cv::threshold(cornerStrength,cornerTh,
49. threshold,255,cv::THRESH_BINARY);
50. // 转为8-bit图
51. cornerTh.convertTo(cornerMap,CV_8U);
52. // 和局部最大值图与,剩下角点局部最大值图,即:完成非最大值抑制
53. cv::bitwise_and(cornerMap,localMax,cornerMap);
54. return cornerMap;
55. }
56.
57. void getCorners(std::vector<cv::Point>&points,
58. double qualityLevel) {
59. //获取角点图
60. cv::Mat cornerMap= getCornerMap(qualityLevel);
61. // 获取角点
62. getCorners(points, cornerMap);
63. }
64.
65. // 遍历全图,获得角点
66. void getCorners(std::vector<cv::Point>&points,
67. const cv::Mat& cornerMap) {
68.
69. for( int y = 0; y < cornerMap.rows; y++ ) {
70. const uchar* rowPtr = cornerMap.ptr<uchar>(y);
71. for( int x = 0; x < cornerMap.cols; x++ ) {
72. // 非零点就是角点
73. if (rowPtr[x]) {
74. points.push_back(cv::Point(x,y));
75. }
76. }
77. }
78. }
79.
80. //用圈圈标记角点
81. void drawOnImage(cv::Mat &image,
82. const std::vector<cv::Point>&points,
83. cv::Scalar color= cv::Scalar(255,255,255),
84. int radius=3, int thickness=2) {
85. std::vector<cv::Point>::const_iterator it=points.begin();
86. while (it!=points.end()) {
87. // 角点处画圈
88. cv::circle(image,*it,radius,color,thickness);
89. ++it;
90. }
91. }
92.
93. };
94.
95. #endif // HARRIS_H
测试代码:
[cpp] view plaincopyprint?
1. cv::Mat image, image1 = cv::imread ("test.jpg");
2. //灰度变换
3. cv::cvtColor (image1,image,CV_BGR2GRAY);
4.
5.
6. // 经典的harris角点方法
7. harris Harris;
8. // 计算角点
9. Harris.detect(image);
10. //获得角点
11. std::vector<cv::Point> pts;
12. Harris.getCorners(pts,0.01);
13. // 标记角点
14. Harris.drawOnImage(image,pts); 15.
16. cv::namedWindow ("harris");
17. cv::imshow ("harris",image);
18. cv::waitKey (0);
19. return 0;
测试结果:
Harbin Institute of Technology
实验报告
课程名称: 机器视觉及其应用
实验名称: 摄像机标定上机验证
院 系: 自动化测试与控制系
班 级: 1036103
实 验 人: 胡洋
学 号: 6100100311
教 师: 陈凤东
实验时间: 2013.11.8
哈尔滨工业大学
《机器视觉及其应用》实验报告
一、 实验名称:
摄像机标定上机验证
二、 实验人员:胡洋
三、 实验日期:2013.11.8
四、 实验目的:
上机验证摄像机标定方法
五、 实验原理:
摄像机标定是一个确定摄像机内部参数(包括几何与光学参数)和外部参数(包括摄像机相对世界坐标的位置及方向)的过程。
摄像机标定的目的是建立摄像机世界坐标系中坐标与其相应图像像素坐标(u,v)之间的关系。最终实现利用计算机采集得到的二维图像来恢复待测物体的三维信息的目的。
摄像机标定方法是视觉系统实现的前提和基础。目前现有的摄像机标定技术大体可以分成两类:传统的摄像机标定方法和摄像机自标定方法。
传统的摄像机标定方法是在一定的摄像机模型基础上,基于形状、尺寸已知的特定参照物,利用参照物上的特征点的世界坐标和相应的像素坐标之间的关系,通过一系列数学变换和计算方法,求取摄像机模型的内外参数。传统的摄像机标定方法需要高精度的已知结构信息,过程复杂,但是标定精度高,适用于多种摄像机模型。
而摄像机自标定方法则不依赖特定的标定参照物,仅仅利用摄像机获取的一系列图像信息来确定摄像机参数。摄像机自标定方法对环境适应较好,可以无人参与下完成标定,但是精度低,鲁棒性不足,不适用于测量场合。
传统的摄像机标定方法按其求解的方法可分为三类:线性方法、非线性优化方法和考虑畸变补偿的两步法[15]。
线性方法不需要迭代,速度较快。但是定标过程中忽略了摄像机镜头的非线性畸变,使得定标精度受到影响。一般的线性求解方法是透镜变换方法和直接线性变换(DLT)方法,他们都是利用一定数目的已知特征点的成像信息和公式(2-18)的投影变换矩阵求解。
(2-18)
本实验采用传统的摄像机标定方法。在传统的标定方法中,标定参照的标准件的精度对标定结果的影响较大。但3D立体靶标的制作成本较高,且加工精度受加工条件的限制。基于2D平面靶标提出了摄像机标定方法避免了一般传统方法对设备要求较高,操作繁琐等缺点,同时标定精度高。
在标定过程中,要求平面靶标至少有两个不同的姿态,摄像机和平面靶标都可以自由的移动,不需要知道运动参数,且不论摄像机从任何角度拍摄靶标,摄像机内部参数都为常数,只有外部参数发生变化。该标定示意图如图7所示。
第一步:求解测量平面与图像平面之间的单应性矩阵。测量平面上的三维点记为,其相应图像平面上的二维点记为,则相应的齐次坐标分别为与。摄像机基于针孔成像模型,空间点与图像点之间的关系为:
(2-19)
图7 二维平面标靶标定示意图
其中,s为一任意的非零尺寸因子,A矩阵称为摄像机的内部参数矩阵,定义为:
(2-20)
为主点坐标,、分别是轴和轴的尺度因子,是轴和轴的不垂直因子。旋转矩阵R与平移向量T称为摄像机的外部参数矩阵。
为了不失一般性,可以假设测量平面位于世界坐标系的平面。记旋转矩阵的第列为,则由式(2-19)可得式(2-21)。
(2-21)
将式子(2-21)进一步简化,得到:
(2-22)
其中,H就是要求得的测量平面与图像平面之间的单应性矩阵。则为一3*3的矩阵,λ为一个常数因子。
由于摄像机图像平面的点的坐标可以通过图像处理的方式获取。所以每张图片都可以计算出一个H矩阵。
第二步:摄像机内部参数的求解。记,则有:
(2-23)
因为r1和r2是标准正交的。所以可以得到关于内参的两个限制条件:
(2-24)
(2-25)
设
(2-26)
可知B矩阵是一个对阵矩阵,所以可以写成一个六维向量形式:。设中的第列向量为,那么可以将公式(2-24)改写为:
(2-27)
(2-28)
最后根据内参限制条件(2-24)、(2-25)得到:
(2-29)
V矩阵是2*6矩阵,也就是说每张图像可以建立起两个方程,b矩阵有六个未知数,也就是说至少三张图片就可以求出b矩阵。b矩阵的解出,相机内参矩阵A也就可以解出来了,而从每张图像的R矩阵、T向量也就可以得到了。
双目摄像机与单目摄像机的区别是:双目摄像机中还需要确定两个摄像机之间的位置关系,其中,R0和T0分别表示旋转矩阵和平移向量。通过标定确定两个摄像机的内部参数以及外部参数,其中,R1、T1与R2、T2分别表示左、右摄像机与世界坐标系的相对位置。
假定空间中任意一点在世界坐标系、左摄像机坐标系和右摄像机坐标系下的非齐次坐标分别为xw、x1、x2,则有:
(2-30)
消去xw,得到:
(2-31)
两个摄像机之间的位置关系R0、T0可以用以下关系式表示:
(2-32)
第三步:参数优化。因为初始的参数已经求解出来了,所以将每张图像的控制点根据求解的参数重新投影回三维空间,最小化与真实值的差异,其实就是建立非线性最小化模型。这里用的是Levenberg-Marquardt迭代算法,从而计算出所有参数的准确值。
第四步:使用HALCON软件工具,验证上述标定过程。
六:实验结果:
##############################################################################
#
# Camera : Parameter
# > Focus
# > Kappa
# > Sx
# > Sy
# > Cx
# > Cy
# > ImageWidth
# > ImageHeight
#
ParGroup: Camera: Parameter;
"Internal camera parameters";
Focus:foc: 0.0161849378171021;
DOUBLE:0.0:;
"Focal length of the lens";
Kappa:kappa: -640.051221234071;
DOUBLE::;
"Radial distortion coefficient";
Sx:sx: 7.40120921533656e-006;
DOUBLE:0.0:;
"Width of a cell on the sensor";
Sy:sy: 7.4e-006;
DOUBLE:0.0:;
"Height of a cell on the sensor";
Cx:cx: 333.413508715616;
DOUBLE::;
"X-coordinate of the image center";
Cy:cy: 244.960933309793;
DOUBLE::;
"Y-coordinate of the image center";
ImageWidth:imgw: 652;
INT:1:32768;
"Width of the images";
ImageHeight:imgh: 494;
INT:1:32768;
"Height of the images";
#
# HALCON Version 11.0 -- Fri Nov 01 14:33:12 2013
#
外参数标定:
七:实验总结和分析:
通过实验前的理论准备,对摄像机的坐标标定原理及方法有了一定认识,在实验中,了解了实际应用中标定的基本操作方法和HALCON软件工具的使用方法和编程手段,以及其中常用的一些算法函数等,理论与实际相结合,从而对摄像机的各种坐标系转换和坐标标定有了更深入的理解,为以后更深入的学习打下了一定基础。
第1页共1页20xx002464Z20xx000967L20xx国认监认字275号检测CANSL0653报告编号公沪检131252…
REDONE摄像机测试报告首先要说它不仅仅是一台摄像机它更象一个高级图像系统并不是人人都能用的高端工作流它不是人们想象的HVX20…
监控摄像头测试报告一防爆摄像头测试截图摄像机工作模式20倍光学变焦8倍电子变焦二红河项目发回摄像头测试截图摄像机工作模式30倍光学…
第1页共1页20xx002464Z20xx000967L20xx国认监认字275号检测CANSL0653报告编号公沪检131252…
技术文件技术文件名称微高摄像头可靠性检测报告技术文件编号MK04ZC0111051202版本A01共6页包括封面拟制党鹏洁审核深圳…
20xx20xx年中国监控摄像机行业市场调研与发展前景预测报告监控摄像机是用在安防方面的准也摄像机他的像素和分辨率比电脑的视频头要…