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

通过该图可以看到世界坐标系建立在立体标版的原点,一个方形格子代表单位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
提取出边框的内外轮廓,根据内外轮廓估计角点位置。

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

最低0.47元/天 解锁文章
1154

被折叠的 条评论
为什么被折叠?



