测量角度的十字路口
这个例子展示了如何测量两束光之间的角度和交点bwtraceboundary
,这是一个边界跟踪程序。机器视觉的应用程序中的一个常见任务是免提使用图像采集和图像处理技术测量。
步骤1:加载图像
读到gantrycrane.png
感兴趣的和画箭头指向两束。这是一个形象的龙门起重机用于组装的桥梁。
RGB = imread (“gantrycrane.png”);imshow (RGB);文本(大小(RGB, 2),大小(RGB, 1) + 15,“图片由杰夫·马瑟”,…“字形大小”7“HorizontalAlignment”,“对”);103线(328 [300],[85],“颜色”,(1 1 0));140线(255 [268],[85],“颜色”,(1 1 0));文本(150、72、测量这些光束的夹角的,“颜色”,“y”,…“FontWeight”,“大胆”);
步骤2:提取感兴趣的地区
作物图像获得只有梁龙门起重机的选择。这一步,就能很容易地提取边缘的两个金属梁。
%可以获得矩形的坐标区域使用%由imtool显示像素信息start_row = 34;start_col = 208;cropRGB = RGB (start_col start_row: 163: 400:);imshow (cropRGB)
% (X, Y)补偿存储起来,供以后使用;减去1,以便每个抵消%对应之前的最后一个像素的区域利益offsetX = start_col-1;offsetY = start_row-1;
步骤3:阈值图像
将图像转换成黑白的后续提取边缘坐标bwtraceboundary
例行公事。
I = rgb2gray (cropRGB);BW = imbinarize(我);BW = ~ BW;%补充图像(感兴趣的对象必须是白色)imshow (BW)
第四步:找到最初的每个边界点
的bwtraceboundary
常规要求您指定一个单点边界。这个点作为起始位置的边界跟踪的过程。
提取的边缘梁越低,图像中选择一列和检查,直到从背景像素对象像素。这个位置存储起来,供以后使用bwtraceboundary
例行公事。重复这个过程对于其他梁,但这一次跟踪水平。
昏暗的大小= (BW);%的水平梁col1 = 4;第一行=找到(BW (:, col1), 1);%的梁row2 = 12;col2 =找到(BW (row2:), 1);
第五步:跟踪边界
的bwtraceboundary
例程用于提取(X, Y)边界点的位置。为了最大化的准确性角度和交点计算,重要的是要提取尽可能多的分属于光束边缘。你应该确定点实验的数量。因为单杠的初始点是通过扫描从北到南,是安全设置初始搜索一步指向外部的对象,即。“北”。
boundary1 = bwtraceboundary (BW(第一行,col1),“N”8,70);%设置搜索方向为逆时针,为了跟踪向下。boundary2 = bwtraceboundary (BW (row2、col2),“E”90年,8日,“计数器”);imshow (RGB);持有在;%申请补偿为了画出原始图像情节(offsetX + boundary1 (:, 2), offsetY + boundary1 (: 1),‘g’,“线宽”2);情节(offsetX + boundary2 (:, 2), offsetY + boundary2 (: 1),‘g’,“线宽”2);
第六步:适合行边界
尽管(X, Y)坐标对上一步得到的,并不是所有的点正好躺在一条线。哪些应该被用来计算角度和交点?假设所有的点是同样重要的是,获得合适的线的边界像素的位置。
一条线的方程是y =[* 1] *[一个;b]。你可以求出参数a和b在最小二乘意义上使用polyfit
。
有所= polyfit (boundary1 (:, 2), boundary1 (: 1), 1);ab2 = polyfit (boundary2 (:, 2), boundary2 (: 1), 1);
第七步:找到交集的角度
使用找到角点积。
vect1 =[1有所(1)];%创建一个向量基于线方程vect2 = [1 ab2 (1)];dp =点(vect1 vect2);%计算向量的长度length1 =√总和(vect1 ^ 2));length2 =√总和(vect2 ^ 2));%获得较大的交叉角的度角= 180 -这些“可信赖医疗组织”(dp / (length1 * length2)) * 180 /π
角= 129.4971
第八步:找到交点
解决两个方程的系统为了获得(X, Y)坐标交点。
十字路口=[1,有所(1);1,ab2(1)] \[有所(2);ab2 (2)];%申请补偿为了计算在原来的位置,%即不裁剪,形象。十字路口=路口+ [offsetY;offsetX]
十字路口=2×1143.0917 - 295.7494
第九步:绘制结果。
inter_x =路口(2);inter_y =路口(1);%画出一个“X”的十字路口情节(inter_x inter_y,“y”,“线宽”2);文本(inter_x-60 inter_y-30, [sprintf (' % 1.3 f '角),“{\保监会}”),…“颜色”,“y”,“字形大小”14岁的“FontWeight”,“大胆”);interString = sprintf (”(% 2.1 f, % 2.1 f)”、inter_x inter_y);文本(interString inter_x-10 inter_y + 20日,…“颜色”,“y”,“字形大小”14岁的“FontWeight”,“大胆”);
这个主题有帮助吗?