机器视觉_实验

上传人:yh****1 文档编号:125720159 上传时间:2020-03-19 格式:DOC 页数:22 大小:850.50KB
返回 下载 相关 举报
机器视觉_实验_第1页
第1页 / 共22页
机器视觉_实验_第2页
第2页 / 共22页
机器视觉_实验_第3页
第3页 / 共22页
机器视觉_实验_第4页
第4页 / 共22页
机器视觉_实验_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《机器视觉_实验》由会员分享,可在线阅读,更多相关《机器视觉_实验(22页珍藏版)》请在金锄头文库上搜索。

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

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

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

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

5、代码:#include stdafx.h#include opencv2/highgui/highgui.hpp#include opencv2/imgproc/imgproc.hpp#include #include using namespace cv;using namespace std;Mat src, edges;Mat src_gray;Mat standard_hough, probabilistic_hough;/标准霍夫变换,概率的霍夫变换int min_threshold = 10;/最小阈值为10int max_trackbar = 200;/最大的跟踪条为200cha

6、r*standard_name = Standard Hough Lines Demo;char*probabilistic_name = Probabilistic Hough Lines Demo;int s_trackbar = max_trackbar;int p_trackbar = max_trackbar;void help();void Standard_Hough(int, void*);void Probabilistic_Hough(int, void*);int main()src = imread(六边形.bmp, 1);if (src.empty()help();r

7、eturn -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, Standard_Hough);namedWindow(probabilistic_name, CV_WINDOW_AUTOSIZE);createTrackbar(Thresh, probabilistic_na

8、me, &p_trackbar, max_trackbar, Probabilistic_Hough);/初始化Standard_Hough(0, 0);Probabilistic_Hough(0, 0);waitKey(0);return 0;void help()printf(t Hough Transform to detect lines n);printf(t-n);printf(Usage:./HoughLines_Demon);void Standard_Hough(int, void*)vectors_lines;cvtColor(edges, standard_hough,

9、CV_GRAY2BGR);/用标准霍夫变换HoughLines(edges, s_lines, 1, CV_PI / 180, min_threshold + s_trackbar, 0, 0);/显示结果for (int i = 0; i s_lines.size(); i+)float r = 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*(-si

10、n_t), cvRound(y0 + alpha*cos_t);Point pt2(cvRound(x0 - alpha*(-sin_t), cvRound(y0 - alpha*cos_t);line(standard_hough, pt1, pt2, Scalar(255, 0, 0), 1, CV_AA);imshow(standard_name, standard_hough);imwrite(六边形.bmp, standard_hough);void Probabilistic_Hough(int, void*)vectorp_lines;cvtColor(edges, probab

11、ilistic_hough, CV_GRAY2BGR);/用概率霍夫变换HoughLinesP(edges, p_lines, 1, CV_PI / 180, min_threshold + p_trackbar, 30, 10);/显示结果for (size_t i = 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, probabil

12、istic_hough);imwrite(六边形.bmp, probabilistic_hough);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#include opencv2high

13、guihighgui.hpp#include opencv2calib3dcalib3d.hpp#include #include #include using namespace cv;using namespace std;Mat src, src_gray, dst_norm_scaled, src_copy;int thresh = 0;int max_thresh = 100;int maxCorners = 0;int maxTrackbar = 50;/最大的跟踪条为50char*source_window = Source image;char*corners_window =

14、 Corners detected;/void cornerHarris_demo(int, void*);/int main()src= imread(六边形.bmp, 1);cvtColor(src, src_gray, CV_BGR2GRAY);/建立一个窗口和跟踪条namedWindow(source_window, CV_WINDOW_AUTOSIZE);createTrackbar(Harris, source_window, &thresh, max_thresh, cornerHarris_demo);createTrackbar(ShiTomasi, source_window, &maxCorners, maxTrackbar, cornerHarris_demo);namedWindow(

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 设计及方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号