机器视觉_实验2_第1页
机器视觉_实验2_第2页
机器视觉_实验2_第3页
机器视觉_实验2_第4页
机器视觉_实验2_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验二多边形边长测量一、实验目的1 掌握哈夫变换方法检测直线的基本原理和步骤。2 . 复习 VB/VC/Matlab的基本概念、基本语法和编程方法,并熟练使用VB/VC/Matlab编写遗传算法程序。二、实验设备微机三、实验原理距离测量基本步骤:1)对定位距离的两条直线进行识别和拟合。(关键步骤)2)得到直线方程后,根据数学方法计算两线间的距离。两种经典的直线拟合(检测)算法:最小二乘法、哈夫(霍夫 )变换法直线函数:y=ax+b,a、b是待定常数。Hough 变换 Hough , 1962 是一种利用图像全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。它通过将源图像上的点映射到

2、用于累加的参数空间,实现对已知解析式曲线的识别。由于Hough 变换利用了图像全局特性,所以受噪声和边界间断的影响较小,比较鲁棒( Robust)。Hough 变换常用来对图像中的直线和圆进行识别。点 - 线对偶性:图像空间XY中共线的点,对应在参数空间PQ 中相交的线。参数空间PQ中相交于一点的所有直线,在图像空间XY里都有共线的点与之对应。结论:在PQ平面上相交直线最多的点,对应在XY平面上的直线就是解。假设: 1)图像上的直线是一个容器;2)直线上的点(图像中的特定像素)是放在容器中的棋子。由于图像上任一像素可以同时属于多根直线, 即可看成每个棋子(像素) 可以同时放在多个容器中(直线)

3、 。Hough 变换的基本思想:依次检查图像上的每个棋子(特定像素)。对每个棋子,找到所有包含它的容器(直线) ,并为每个容器的计数器加 1。遍历结束后,统计每个容器所包含的棋子数量。当图像上某个直线包含的特定像素足够多时,就可以认为直线存在。具体步骤:将 r量化,得到二维矩阵Mr;根据极坐标表示法,r 是直线到原点的距离。设图像的对角线长度为n,固定左上角为原点,则r的取值范围为0, n 。10, 359 。此时, M 是一个 n 行 360 列的二维矩阵。矩阵中任一元素Mr 所存储的值就是图像中由参数(r,)决定的直线上所拥有的像素数。初始化时,矩阵M置为0。遍历图像,对像素(xi, yi

4、)(xi, yi) ,依次代入直线的极坐标方程,计算 r 的值,根据当前r加 1,即: Mr=Mr+1 。分析 Mr,如果 MrT ,就认为存在一条有意义的线段,(r,)是该线段的拟合参数。T 是一个非负整数,由图像中景物的先验知识决定,与图像大小有关。由(r,) 和(xi,yi)共同确定图像中的线段,并连接 断裂部分。四、预习要求1 查阅资料,理解并掌握哈夫变换方法检测直线的基本原理与步骤。2 复习 VB/VC/Matlab的基本概念、基本语法和编程方法。五、实验内容及步骤1 . 上机编写程序,以“六边形.bmp ”为实验对象,利用哈夫变换方法检测出六边形各边边长。程序代码:#include

5、#include#include#include#include"stdafx.h""opencv2/highgui/highgui.hpp""opencv2/imgproc/imgproc.hpp"<iostream><stdio.h>usingnamespace cv;usingnamespace std;Mat src, edges;Mat src_gray;Mat standard_hough, probabilistic_hough;/ 标准霍夫变换,概率的霍夫变换intmin_threshold =

6、 10;/最小阈值为 10intmax_trackbar = 200;/最大的跟踪条为 200char *standard_name = "Standard Hough Lines Demo" ;char *probabilistic_name ="Probabilistic Hough Lines Demo"ints_trackbar = max_trackbar;intp_trackbar = max_trackbar;voidhelp();voidStandard_Hough( int,void *);voidProbabilistic_Hough

7、(int , void *);intmain()src = imread(" 六边形 .bmp" , 1);if(src.empty()help();return-1;cvtColor(src, src_gray,CV_RGB2GRAY);Canny(src_gray, edges, 50, 200, 3);namedWindow(standard_name, CV_WINDOW_AUTOSIZE);createTrackbar("Thresh" , standard_name, &s_trackbar, max_trackbar, Standa

8、rd_Hough);namedWindow(probabilistic_name,CV_WINDOW_AUTOSIZE);createTrackbar("Thresh" , probabilistic_name, &p_trackbar, max_trackbar, Probabilistic_Hough);/ 初始化Standard_Hough(0, 0);Probabilistic_Hough(0, 0);waitKey(0);return0;void help()printf(printf(printf("t Hough Transform to d

9、etect lines n");"t-n");"Usage:./HoughLines_Demo<image_name>n" );void Standard_Hough( int ,void *)vector <Vec2f>s_lines; cvtColor(edges, standard_hough,CV_GRAY2BGR);/ 用标准霍夫变换 HoughLines(edges, s_lines, 1,CV_PI / 180, min_threshold + s_trackbar, 0, 0);/ 显示结果for ( i

10、nti = 0; i < s_lines.size(); i+)floatr = s_linesi0, t = s_linesi1;double cos_t = cos(t), sin_t = sin(t);double x0 = r*cos_t, y0 = r*sin_t;double alpha = 1000;Point pt1(cvRound(x0 + alpha*(-sin_t), cvRound(y0 + alpha*cos_t); Point pt2(cvRound(x0 - alpha*(-sin_t), cvRound(y0 - alpha*cos_t); line(st

11、andard_hough, pt1, pt2, Scalar (255, 0, 0), 1, CV_AA);imshow(standard_name, standard_hough);imwrite(" 六边形 .bmp" , standard_hough);void Probabilistic_Hough( int ,void *)vector <Vec4i >p_lines; cvtColor(edges, probabilistic_hough,CV_GRAY2BGR);/ 用概率霍夫变换HoughLinesP(edges, p_lines, 1,CV_P

12、I / 180, min_threshold + p_trackbar, 30, 10);/ 显示结果for ( size_ti = 0; i < p_lines.size(); i+)Vec4i l = p_linesi;line(probabilistic_hough,Point (l0, l1),Point (l2, l3),Scalar (255, 0, 0), 1,CV_AA);imshow(probabilistic_name, probabilistic_hough);imwrite(" 六边形 .bmp" , probabilistic_hough);

13、2 . 利用实验一的Harris 角点检测程序,检测“六边形.bmp”中六边形的各边边长。源程序:#include"stdafx.h"#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"#include"opencv2corecore.hpp"#include"opencv2legacylegacy.hpp"#include"opencv2nonfreenonfree.hpp"#i

14、nclude"opencv2highguihighgui.hpp"#include"opencv2calib3dcalib3d.hpp"#include<vector>#include<iostream>#include<stdio.h>usingnamespace cv;usingnamespace std;Mat src, src_gray, dst_norm_scaled, src_copy;intthresh = 0;intmax_thresh = 100;intmaxCorners = 0;intmaxTra

15、ckbar = 50;/ 最大的跟踪条为50char *source_window = char *corners_window ="Source image" ;"Corners detected"/void cornerHarris_demo(int ,void *);/intmain()src= imread(" 六边形 .bmp" , 1);cvtColor(src, src_gray,CV_BGR2GRAY);/ 建立一个窗口和跟踪条namedWindow(source_window, CV_WINDOW_AUTOSIZE)

16、;createTrackbar("Harris", source_window, &thresh, max_thresh, cornerHarris_demo);createTrackbar("ShiTomasi" , source_window, &maxCorners, maxTrackbar, cornerHarris_demo);namedWindow(corners_window,CV_WINDOW_AUTOSIZE);namedWindow(source_window, CV_WINDOW_AUTOSIZE);cornerHa

17、rris_demo(0, 0);/waitKey(0);return (0);void cornerHarris_demo(int ,void *)src.copyTo(src_copy);Mat dst, dst_norm;dst=Mat:zeros(src.size(),CV_32FC1);/intblockSize= 2;intapertureSize= 3;double k= 0.04;/cornerHarris(src_gray, dst, blockSize, apertureSize, k,BORDER_DEFAULT);/normalize(dst, dst_norm, 0,

18、255, NORM_MINMAX, CV_32FC1, Mat(); convertScaleAbs(dst_norm, dst_norm_scaled);/for ( intj = 0; j < dst_norm.rows; j+)for ( inti = 0; i < dst_norm.cols; i+)if( int )dst_norm.at<float>(j, i)>thresh + 60)circle(dst_norm_scaled, Point (i, j), 6, Scalar (0), -1, 8, 0); circle(src_copy, Point (i, j), 5, Scalar (255, 0, 0), -1, 8, 0);if(maxCorners < 1)maxCorners = 1;/vector <Point2f > corners;double qualityLevel = 0.01;double minDistance = 10;bool useHarrisDetector=false ;/Mat cormat;/goodFeaturesToTrack(src

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论