www.gusucode.com > 基于机器视觉的外螺纹中径参数测量研究 > code3/基于机器视觉的外螺纹中径参数测量研究/luowenzhongjing.m

    %因为指定了用canny和霍夫变换,所以没什么好说的,用这些求出所需的数据就行

%因为没要求,就把他当做一个普通螺纹吧,简单化处理
%网上查找到,螺纹中径基本尺寸的计算 =螺纹大径-螺距乘以系数值。系数值取0.6495
%所以求大径,求螺距
%图片尺寸很小,不知道拍摄条件。如打光,工件情况等。
clear all 
close all
clc
src=imread('2.png');
% src=rgb2gray(src);%原图是png格式,我另存为的时候转换为三通道bmp格式,所以重新转为灰度图。
src= imcrop(src,[100, 0, 210, 500]);  % x坐标 y坐标  宽度 高度。
 figure;
imshow(src)
%显然该图像是背光拍摄。
[rows,cols]=size(src);
for i=1:rows
    for j=1:cols
        if src(i,j)<30
            src(i,j)=255;
        else
            src(i,j)=0;
        end
    end
end


%提取边缘
BW=edge(src,'canny','sobel');%基于高斯拉普拉斯算子的检测
f=BW;
[H, theta, rho]= hough(f,'RhoResolution', 0.5);    
%imshow(theta,rho,H,[],'notruesize'),axis on,axis normal    
%xlabel('\theta'),ylabel('rho');    
    
peak=houghpeaks(H,5);    
hold on    
    
lines=houghlines(f,theta,rho,peak);    
figure,imshow(f,[]),title('Hough Transform Detect Result'),hold on    
for k=1:length(lines)     
    xy=[lines(k).point1;lines(k).point2];   
    plot(xy(:,1),xy(:,2),'LineWidth',4,'Color',[.6 .6 .6]);    
end   
%显然 拿到的线段是正确的
%分析:xy=[lines(k).point1;lines(k).point2];    中的点显然是线段的端点,利用这些段
%就能求出所需数据。 由于客户指定了方法所以才这么做,比这简单的方法多得是。
%调整[H, theta, rho]= hough(f,'RhoResolution', 0.5); 0.5的值,可以获得不同的线段。
%有了各种线段和端点,自然求中径的方法就很多了。
luoju=((lines(1).point1(1,1)-lines(3).point1(1,1))^2+(lines(1).point1(1,2)-lines(3).point1(1,2))^2)^(1/2)
P=lines(2).point1;
Q1=lines(1).point2;
Q2=lines(3).point2;
dajing = abs(det([Q2-Q1;P-Q1]))/norm(Q2-Q1)
zhongjing=dajing-luoju*0.6945
imshow(lines);