Halcon3D gen_image_to_world_plane_map的理解和实用
一,算子的参数介绍
1.1 怎么理解的
1)就是我有一张二维图像,在自己的物体坐标系下看比如它是四方四正的,相机从各个角度拍照,会得到不同的image像素图,这些像素图像会变得扭曲,或者不平行。 gen_image_to_world_plane_map的作用是形成一个map图,将像素图返回到原始四方四正图像。
2)像不像,投影变换project
1.2 参数介绍
Map : 输出map图,用于map_image
CameraParam, 相机的的内参
WorldPose, 要映射的物体坐标系(这里是相机拍摄的角度)
WidthIn, HeightIn, 像素图的宽度和高度
WidthMapped, HeightMapped, 映射回去后,map_image将得到的图像的宽度和高度,这个值可以比实际值大,但是不可以比实际值小,小于理论值时,超出部分将被裁剪。
Scale, 这个挺有意思,可以理解为map_image得到的对应图像的每个像素的尺寸
MapType : map的计算方式
二,注意事项
在像素image往map图映射过程中,落在以pose形成的坐标系中,只有x+,y+位置的像素点才回保留,出现x-,y-位置的像素点会被剔除,这个在实例中会进行展示。
放两张图看看,被剔除的部分
正常的map图像
在一段halcon自己捋的代码里,感悟一下
ImgPath := '3d_machine_vision/multiple_cameras/'
gen_cam_par_area_scan_division (0.01619, -734.789, 7.402e-006, 7.4e-006, 324.911, 256.894, 640, 480, CamParam1)
read_image (Image1, ImgPath + 'camera1_ref')
get_image_size (Image1, Width, Height)
WindowScale := 0.66
dev_open_window (0, 0, Width * WindowScale, Height * WindowScale, 'black', WindowHandle1)
dev_open_window (0, Width * WindowScale + 6, Width * WindowScale, Height * WindowScale, 'black', WindowHandle2)
CaltabName := 'caltab_30mm.descr'
create_calib_data ('calibration_object', 1, 1, CalibDataID)
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
set_calib_data_cam_param (CalibDataID, 0, [], CamParam1)
find_caltab (Image1, CalPlate, CaltabName , 3, 112, 5)
find_marks_and_pose (Image1, CalPlate,CaltabName, CamParam1, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)
****查看物体坐标系在图片中的位置
pose_to_hom_mat3d (StartPose, HomMat3D)
affine_trans_point_3d (HomMat3D,0, 0, 0, Qx, Qy, Qz)
project_3d_point (Qx, Qy, Qz, CamParam1, Row, Column)
gen_circle (Circle, Row, Column, 10)
****00点在物体坐标系的位置
image_points_to_world_plane (CamParam1, StartPose, 0, 0, 'm', X0, Y0)
****对角点在物体坐标系中的位置
image_points_to_world_plane (CamParam1, StartPose, 480, 640, 'm', X1, Y1)
****图像在世界坐标系中的宽度,和高度
h:=Y1-Y0
w:=X1-X0
*****当映射过来的图像每个像素尺寸为0.0001时
pixsize:=0.0001
width:=round(w/pixsize)
hight:=round(h/pixsize)
*****映射过来将要形成的是一张583*806的图像
*这里要注意的是映射过来的点如果落在-x,-y轴的区域会自动被裁剪掉
gen_image_to_world_plane_map (Map, CamParam1, StartPose, Width, Height, width, hight, pixsize, 'bilinear')
map_image (Image1, Map, ImageMapped)
*****如何解决这个问题,需要将pose的中心参考点,挪到图像顶点对应的位置
set_origin_pose (StartPose, X0, Y0, 0, PoseNewOrigin)
gen_image_to_world_plane_map (Map, CamParam1, PoseNewOrigin, Width, Height, width, hight, pixsize, 'bilinear')
map_image (Image1, Map, ImageMapped)
*****完成了修正