测量宽度(标定像素)

*从网上摘得程序,然后自己学习注释,若有问题,可指出。谢谢!!!**

*测量多少个像素

read_image (Image, 'C:/Users/fengkuixiang/Desktop/22.jpg')
*读取图像

get_image_size (Image, Width, Height)

dev_close_window()

dev_open_window (0, 0,400,500, 'black', WindowHandle)

dev_set_draw ('margin')
*设置所画的区域,若'fill'是一个面,'margin'是轮廓

dev_set_color ('black')
*设置画的颜色

rgb1_to_gray(Image,ImageGray)
*彩色RGB图像变成灰度图像

dev_display(ImageGray)

*设置ROI

row := 438
column := 262
*注意row和column是矩形的中心,需要自己调整

angle := rad(90)
*这个是矩形旋转的角度,角度是正的按逆时针转,负的按顺时针转

length1 := 450

length2 := 10
*在length1<length2的情况下,measure——pairs没有值,不管怎样调整参数。
*length1和length2是矩形的两个半轴的长,明白了这个下面在计算多边形轮廓的时候要用到
*注意这里的矩形框的参数是自己调整的

gen_rectangle2 (Rectangle, row, column, angle, length1, length2)
*运算符gen_rectangle2生成了一个或多个矩形,它们的中心(行、列)、方向和半边缘长度
*分别为Length1和Length2。方位用圆弧表示,表示横轴和纵长之间的角度

gen_measure_rectangle2 (row, column, angle, length1,length2, Width, Height, 'nearest_neighbor', MeasureHandle1)
*负责提取与矩形主轴垂直的直线边缘。在参数行和列中传递矩形的中心,
*矩形的主轴方向,以及两个轴的长度,即它的直径是长方形的一半,length1,length2,。
 
disp_continue_message (WindowHandle, 'black', 'true')
*此过程在屏幕右下角以给定颜色显示“单击”运行“以继续”。
*如果参数框设置为“true”,文本将写入一个白盒中,这对于不规则背景非常有用。
 
stop()

measure_pairs (Image, MeasureHandle1, 1, 132, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
*measure_pair的作用是提取垂直于长方形或环形圆弧主轴的直线边缘对。
* '1'表示σ的高斯平滑,‘132’最低边缘幅度,‘all’确定边缘如何分组到边缘对的灰度值转换的类型,
*第一个检测到的edge定义了RowEdgeFirst和ColumnEdgeFirst的Transition即根据测量对象的位置,
*返回具有明暗转换的边缘对或具有暗明暗转换的边缘对。‘all’如果Select设置为“all”,则返回所有
*边缘对。如果将其设置为“first”,则只返回提取的边缘对中的第一个,而将其设置为“last”,则只
*返回最后一个。

disp_continue_message (WindowHandle, 'black', 'true')

stop()

*可视化结果

*根据分组的个数,来画线,这个个数就是RowEdgeFirst组的个数,也就是边缘的个数

for i := 0 to |RowEdgeFirst|-1 by 1    

    *这个算子是画出多边形的亚像素轮廓,其中第二个和第三个参数可以是元素,即表示有多个点,两个点组成一条直线

    *至于每一个点是怎么计算的,我们已经知道了旋转的角度和每一条边的中心点,这个大家自己就可以在纸上用三角函数得出来每一个开始结束点

    *的坐标了

    gen_contour_polygon_xld ( EdgeFirst, [RowEdgeFirst[i] - sin(rad(90) - angle)*length2,RowEdgeFirst[i] + sin(rad(90) - angle)*length2], [ColumnEdgeFirst[i] - cos(rad(90) - angle)*length2,ColumnEdgeFirst[i] + cos(rad(90) - angle)*length2])
*从元组行中给出的多边形生成XLD轮廓轮廓
    
    gen_contour_polygon_xld (EdgeSecond, [RowEdgeSecond[i] - sin(rad(90) - angle)*length2,RowEdgeSecond[i] + sin(rad(90) - angle)*length2], [ColumnEdgeFirst[i] - cos(rad(90) - angle)*length2,ColumnEdgeFirst[i] + cos(rad(90) - angle)*length2])

    dev_set_color ('blue')

    dev_display (EdgeFirst)

    dev_set_color ('red')

    dev_display (EdgeSecond)

    dev_set_color ('blue')

    *这是设置文本在那里显示

    if (i = 0)

        set_tposition (WindowHandle, 50 , 20)

    else

        set_tposition (WindowHandle, RowEdgeFirst[i] + 40, ColumnEdgeFirst[i]+20)
*后面两个值是显示的位置,同上可以修改
        
    endif

    write_string (WindowHandle, 'width: '+IntraDistance[i]+' pix')
 *从文本显示的地方写入字符串,写出像素
 
endfor

disp_continue_message (WindowHandle, 'black', 'true')

stop ()

close_measure (MeasureHandle1)
* 销毁

dev_update_window ('on')
*dev_update_window指定操作符调用返回的所有图标
*对象是否必须显示在活动图形窗口中(DisplayMode = 'on'---默认)
*或不显示(DisplayMode = 'off')。
 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab中,摄影测量相机标定可以使用Camera Calibrator和Stereo Camera Calibrator工具来实现。Camera Calibrator适用于单目相机标定,而Stereo Camera Calibrator适用于双目相机标定。 相机标定是确定相机的内外参数和畸变参数的过程。通常通过使用具有对应关系的像点和物点的点对来解出模型的未知参数。大多数相机标定的目标是标定相机的内参和畸变参数,因为相机位姿在工作过程中是不断变化的。但有些应用也需要同时标定出相机的外参,即相机的位姿。 相机自标定方法是一种特殊的相机标定方法,它不需要知道图像点的三维坐标,而是利用计算某一点在不同拍摄角度的场景图中的相对关系来确定相机标定的参数。这种方法能够完成一些未知相机参数的标定,使得在相机任意运动或复杂未知场景下的相机标定成为可能。 目前,常用的相机自标定方法有基于Kruppa方程的自标定法和分层逐步标定法。这些方法都是通过相机内参数的约束关系来求解参数,完全忽略相机系统外部的环境。因此,这种标定方法比其他方法更灵活,但稳定性稍低。 综上所述,在Matlab中,可以使用Camera Calibrator和Stereo Camera Calibrator工具来实现摄影测量相机标定,以确定相机的内外参数和畸变参数。同时,也可以考虑使用相机自标定方法来完成相机标定,特别是在相机位姿不断变化或复杂未知场景下的情况下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值