北邮鲁鹏老师三维重建课程之相机标定

本文详细介绍了通过Halcon进行图像处理获取图像坐标点,然后利用OpenCV构建映射矩阵,最终求解相机内外参数的步骤。作者通过鲁鹏老师的三维重建课程,完成了相机标定的第一个作业,涉及图像坐标与世界坐标转换、奇异值分解及矩阵运算。

在看北邮鲁鹏老师的三维重建的课程过程中,去官网找到有三个作业。现将三个作业里面的第一个作业相机标定完成。总体来说,可以分为三个部分,即图像坐标点和世界坐标点的获取;映射矩阵的生成,相机内外参的求解三个部分。现总结如下:

图像坐标点的获取

上鲁鹏老师作业里边的标定图,如下图所示:

 通过该图可以看到世界坐标系建立在立体标版的原点,一个方形格子代表单位1,三个互相垂直的平面上各取了四个点,并用框标明了。因此,我们第一步就是要获得上述12个点的图像坐标。

在这里,我用halcon对图像进行处理,获取到框内外的边缘,并对角点像素坐标估算,求内外角点平均值得到图像坐标点。(这里本来想直接求角点的,最后估算了一下)

有更好的方法可以交流。

得到对应的点的关系如下:

 (0,8,7)->(363.5,1143) (0,4,7)->(320,958)  (0,8,3)->(616,1112)  (0,4,3)->(542,943)
 (8,0,9)->(212,404)    (6,0,9)->(201,523)  (8,0,1)->(667,459)  (6,0,1)->(642,559)
 (4,1,0)->(684,679)    (5,1,0)->(695,635)  (5,9,0)->(913,896)  (4,9,0)->(889,946)

read_image (Jietu20200301091513, 'E:/文件文档/鲁鹏-三维重建资料/Total3DExercises-main/MVGlab01_camera-calibration-master/images/Jietu20200301-091513.jpg')
get_image_size (Jietu20200301091513, Width, Height)
dev_clear_window ()
dev_close_window ()
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (Jietu20200301091513)
rgb1_to_gray (Jietu20200301091513, GrayImage)
*寻找第一个和第二个矩形区域
threshold (GrayImage, Region, 75, 90)
connection (Region, ConnectedRegions)
fill_up (ConnectedRegions, RegionFillUp)
select_shape (RegionFillUp, SelectedRegions1, ['rectangularity','area'], 'and', [0.7,17500], [1,50000])
*寻找第三个矩形区域
dev_clear_window ()
dev_display (Jietu20200301091513)
threshold (GrayImage, Region1, 128, 140)
connection (Region1, ConnectedRegions1)
fill_up (ConnectedRegions1, RegionFillUp1)
select_shape (RegionFillUp1, SelectedRegions2, ['rectangularity','area'], 'and', [0.7,40000], [1,80000])
*将上述三个区域合并
concat_obj (SelectedRegions1, SelectedRegions2, ObjectsConcat)
count_obj (ObjectsConcat, Number)
dev_display (Jietu20200301091513)
dev_display (ObjectsConcat)
stop ()
*分别对三个区域进行形态学处理,并获得矩形边角的角点图像坐标
for Index := 1 to Number by 1
    select_obj (ObjectsConcat, ObjectSelected, Index)
    *最大的框
    dilation_rectangle1 (ObjectSelected, RegionDilation, 31, 31)
    *将该区域像素全部置为255
    paint_region (RegionDilation, GrayImage, ImageResult, 255, 'fill')
    *膨胀操作,腐蚀操作,做差裁剪ROI
    dilation_rectangle1 (ObjectSelected, RegionDilation1, 5, 5)
    erosion_rectangle1 (RegionDilation1, RegionErosion, 21, 21)
    difference (RegionDilation1, RegionErosion, RegionDifference)
    paint_region (RegionDifference, ImageResult, ImageResult2, 0, 'fill')
    reduce_domain (ImageResult2, RegionDilation, ImageReduced)
    invert_image (ImageReduced, ImageInvert)
    edges_sub_pix (ImageInvert, Edges1, 'canny', 1, 20, 40)
    select_contours_xld (Edges1, SelectedContours, 'contour_length', 100, 30000, 100, 30000)
    dev_display (Jietu20200301091513)
    dev_display (SelectedContours)
    
endfor

 提取出边框的内外轮廓,根据内外轮廓估计角点位置。

生成图像坐标点到世界坐标点的映

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond951

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值