• 大小: 6KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: Matlab
  • 标签: 棋盘格  角点  标定  

资源简介

通过canny算子提取棋盘格图像边缘,然后使用Hough算法提取边缘图中直线,利用直线交点对全图角点检测结果进行过滤,最终达到自动可靠准确地提取出所有图像中棋盘格的角点坐标,可用于相机或投影仪的标定。

资源截图

代码片段和文件信息

clc
clear
close all
%结果数据是CC
% rootFolder = fullfile(‘D:\Data\2016.5.18棋盘格‘);
rootFolder = fullfile(‘D:\程序\总‘);

imgSets = imageSet(rootFolder);
count=imgSets.Count(11);
row=7;%棋盘格的行数
col=10;%棋盘格的列数
rho=12;%ρ为图像中角点弥散斑直径。
bianchang=160;%棋盘格的边长
theta=0.2;%角度步进
jd=cell(1count);
for img=1:count
    I=read(imgSetsimg);%读取第i幅图
    I=rgb2gray(I);
    %做标准差为3的高斯滤波,然后以0.08为低门槛,0.2为高门槛,进行canny边缘检测
    %考虑到棋盘格信息对比度明显,选择较高的灰度梯度门槛值进行边缘检测
    %可以考虑使用OTSU算法对棋盘格图像进行预处理
    [BWthresh]=edge(I‘canny‘[0.2*0.40.2]3);%BW为二值化的边缘图像
%     figure;imshow(I[]);
%     figure;imshow(BW[]);
    %%
    %hough变换检测竖线
    [HTR]=hough(BW‘RhoResolution‘rho‘Theta‘-10:theta:10);
    P=houghpeaks(Hcol+3‘threshold‘ceil(0.2*max(H(:))));%预留4个裕量
    lines=houghlines(BWTRP‘FillGap‘bianchang*1.5‘MinLength‘bianchang*3);
%     h2=figure;
%     imshow(I‘InitialMagnification‘30);
%     title(‘霍夫变换直线检测‘);
%     grid on;
%     axis on;
%     hold on;
    shu=[];
    ps=[];
    for k=1:length(lines)
        xy=[lines(k).point1;lines(k).point2];
        dis=(xy(11)+xy(21))/2;
        shu=[shudis];
        sign=0;
        if length(shu)>1
            for i=1:length(shu)-1
                if abs(dis-shu(i))                    shu(end)=[];%删除重复直线
                    sign=1;
                    break
                end
            end
        end
        if sign
            continue
        end
        t=lines(k).theta;
        r=lines(k).rho;
        %写成x=p1*y+p2的形式避免斜率为无穷
        p=[-tan(t*pi/180)r/cos(t*pi/180)];
        ps=[ps;p];
%         y=1:max(size(I));
%         x=polyval(py);
%         plot(xy‘LineWidth‘2‘Color‘‘green‘);
    end
    %删除可能存在的棋盘格边缘线
    %限制条件:棋盘格必须位于图像正中,偏差不能超过一个棋盘格
    %这里是偷懒了、、凑合用
    switch length(shu)
        case col+1
            for u=1:2
                [m1index1]=max(shu);
                m1=size(I2)-m1;
                [m2index2]=min(shu);
                if m1                    ps(index1:)=[];
                    shu(index1)=[];
                else
                    ps(index2:)=[];
                    shu(index2)=[];
                end
            end
        case col
            [m1index1]=max(shu);
            m1=size(I2)-m1;
            [m2index2]=min(shu);
            if m1                ps(index1:)=[];
                shu(index1)=[];
            else
                ps(index2:)=[];
                shu(index2)=[];
            end
    end
    if length(shu)        disp(strcat(‘第‘num2str(img)‘张棋盘格竖线漏检‘));
    end
        
    %%
    %hough变换检测横线
    [HTR]=hough(BW‘RhoResolution‘rho‘Theta‘[-90:theta:-8080:theta:90-theta]);
    P=houghpeaks(Hrow+3‘threshold‘ceil(0.2*max(H(:))));
    lines=houghlines(BWTRP‘FillGap‘bianchang*1.5‘MinLength‘bianchang*3);
    heng=[];
    ph=[];
    for k=1:length

评论

共有 条评论