精华内容
下载资源
问答
  • halcon相机标定
    千次阅读
    2021-09-13 15:45:37

    1.准备标定板

    在halcon中使用gen_caltab算子快捷地生成标定板图像,用于标定板的制作。

    gen_caltab算子原型如下

    gen_caltab(:: XNum,YNum,MarkDist,DiameterRatio,CalPlateDescr,CalPlatePSFile :)

     其中XNum、YNum分别表示每行和每列的园点标记的数量。MarkDist表示两个标记之间的间隔距离,单位是m。DiameterRatio用来设置标记点的直径,表示一个比例关系,直径的长度就是用间隔MarkDist乘以比例DiameterRatio的结果。CalPlateDescr为标定板描述文件的存放路径。CalPlatePSFile为生成的图像文件,即".ps"文件的存放路径,可以直接用Photoshop打开进行编辑。

    gen_caltab (7, 7, 0.0125, 0.5, 'E:/caltab.descr', 'E:/caltab.ps')

     只使用内参(相机参数)进行校正

    *初始化一个相机参数
    StartCamPar := [0.012,0,0.00000375,0.00000375,328,246,656,492]
    *1.相机焦距
    *2.相机的畸变系数Kappa,单位是m-2
    *3.单个像元的宽,单位是m
    *4.单个像元的高,单位是m
    *5.中心点的X轴的坐标,单位是像素
    *6.中心点的Y轴的坐标,单位是像素
    *7.8.图像的宽高,单位像素
    *建立一个CalibDataID,该参数相当于标定对象的集合,包含相机标定所需的信息
    create_calib_data ('calibration_object', 1, 1, CalibDataID)
    *设置相机的类型
    set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
    *生成标定文件
    gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
    *设置标定板数据的路径
    set_calib_data_calib_object (CalibDataID,0, 'caltab.descr')
    *设置图像的数量
    NumImages:=9
    for I :=1 to NumImages by 1
        *是否显示错误信息变量
        ShowErrorMsg:=false
        try
            read_image (Image, 'E:/Images/calibration/'+I)
            *寻找标定板
            find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
            *方式一
            *获得标定板外框轮廓
            get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
            *获取标定板标志轮廓
            get_calib_data_observ_contours (Marks, CalibDataID, 'marks', 0, 0, I)
            *显示标定板外框轮廓
            dev_display (Caltab)
            *显示标志版标志轮廓
            dev_display (Marks)
            *方式一
            *方式二
            *get_calib_data (CalibDataID, 'camera', 0, 'type', CameraType)
            *方式二
            *从校准数据模型中获取基于点的观测数据
            get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose) 
        catch (Exception)
            *设置显示错误信息变量为true
            ShowErrorMsg:=true
            
        endtry
        
    endfor
    *使用calibrate_cameras算子对相机进行标定,用于计算相机的内外参数
    calibrate_cameras (CalibDataID, Error)
    *使用get_calib_data
    get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
    get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
    clear_calib_data (CalibDataID)
    *使用相机参数校正畸变
    *CameraParameters为相机的内部参数
    CameraParameters := CamParam[1:8]
    *CameraPose为相机的外部参数,即位变
    CameraPose := Pose
    stop()
    *读取待校正的图像
    read_image (Image1, 'E:/Images/calibration/10.bmp')
    *对于area(diversion)相机模型(7个参数)
    change_radial_distortion_cam_par('adaptive',CameraParameters,0,CarParamVirtualFixed)
    *对于area(多项式)相机模型(12个参数)
    *change_radial_distortion_cam_par('adaptive',CameraParameters,[0,0,0,0,0],CarParamVirtualFixed)
    *上述相机模型选一种后进行下面的map_image
    *创建一个投射图,其描述图像与其相应正在改变的径向畸变,而对于12个参数的畸变包括径向和切向畸变
    gen_radial_distortion_map(Map,CameraParameters,CarParamVirtualFixed,'bilinear')
    map_image(Image1,Map,ImageMapped)

     使用了内参(相机参数)和外参(位置参数)

    *初始化一个相机参数
    StartCamPar := [0.012,0,0.00000375,0.00000375,328,246,656,492]
    *1.相机焦距
    *2.相机的畸变系数Kappa,单位是m-2
    *3.单个像元的宽,单位是m
    *4.单个像元的高,单位是m
    *5.中心点的X轴的坐标,单位是像素
    *6.中心点的Y轴的坐标,单位是像素
    *7.8.图像的宽高,单位像素
    *建立一个CalibDataID,该参数相当于标定对象的集合,包含相机标定所需的信息
    create_calib_data ('calibration_object', 1, 1, CalibDataID)
    *设置相机的类型
    set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
    *生成标定文件
    gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
    *设置标定板数据的路径
    set_calib_data_calib_object (CalibDataID,0, 'caltab.descr')
    *设置图像的数量
    NumImages:=9
    for I :=1 to NumImages by 1
        *是否显示错误信息变量
        ShowErrorMsg:=false
        try
            read_image (Image, 'E:/Images/calibration/'+I)
            *寻找标定板
            find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
            *remove_calib_data_observ (CalibDataID, 0, 0, 0)
            *获得标定板外框轮廓
            get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
            *获取标定板标志轮廓
            get_calib_data_observ_contours (Marks, CalibDataID, 'marks', 0, 0, I)
            *显示标定板外框轮廓
            dev_display (Caltab)
            *显示标志版标志轮廓
            dev_display (Marks)
            *从校准数据模型中获取基于点的观测数据
            get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose) 
            *get_calib_data (CalibDataID, 'camera', 0, 'type', CameraType)
        catch (Exception)
            *设置显示错误信息变量为true
            ShowErrorMsg:=true
            
        endtry
        
    endfor
    *使用calibrate_cameras算子对相机进行标定,用于计算相机的内外参数
    calibrate_cameras (CalibDataID, Error)
    *使用get_calib_data
    get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
    get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
    clear_calib_data (CalibDataID)
    *使用相机参数校正畸变
    *CameraParameters为相机的内部参数
    CameraParameters := CamParam[1:8]
    *CameraPose为相机的外部参数,即位变
    CameraPose := Pose
    stop()
    *读取待校正的图像
    read_image (Image1, 'E:/Images/calibration/10.bmp')
    scaleParam:=1920/1080.0
    *scaleParam:=656/492.0
    *调整原点的位姿
    set_origin_pose (CameraPose, -0.066324, -0.047, 0, rectificationPose)
    *生成用于校正的映射图,用于描述图像坐标系与世界坐标系之间的映射
    gen_image_to_world_plane_map (rectificationMap, CameraParameters, rectificationPose, 656, 492, 656, 492, scaleParam/656, 'bilinear')
    *利用映射图rectificationMap进行图像校正
    map_image (Image1, rectificationMap, ImageMapped)
    *dev_clear_window ()
    dev_display (ImageMapped)
    *初始化一个相机参数
    StartCamPar := [0.012,0,0.00000375,0.00000375,328,246,656,492]
    *1.相机焦距
    *2.相机的畸变系数Kappa,单位是m-2
    *3.单个像元的宽,单位是m
    *4.单个像元的高,单位是m
    *5.中心点的X轴的坐标,单位是像素
    *6.中心点的Y轴的坐标,单位是像素
    *7.8.图像的宽高,单位像素
    *建立一个CalibDataID,该参数相当于标定对象的集合,包含相机标定所需的信息
    create_calib_data ('calibration_object', 1, 1, CalibDataID)
    *设置相机的类型
    set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
    *生成标定文件
    gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
    *设置标定板数据的路径
    set_calib_data_calib_object (CalibDataID,0, 'caltab.descr')
    *设置图像的数量
    NumImages:=7
    for I :=1 to NumImages by 1
        *是否显示错误信息变量
        ShowErrorMsg:=false
        try
            read_image (Image, 'E:/Images/calibration/'+I)
            *寻找标定板
            find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
            *remove_calib_data_observ (CalibDataID, 0, 0, 0)
            *获得标定板外框轮廓
            get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
            *获取标定板标志轮廓
            get_calib_data_observ_contours (Marks, CalibDataID, 'marks', 0, 0, I)
            *显示标定板外框轮廓
            dev_display (Caltab)
            *显示标志版标志轮廓
            dev_display (Marks)
            *从校准数据模型中获取基于点的观测数据
            get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose) 
            
            *remove_calib_data (CalibDataID, 'tool', I)
        catch (Exception)
            *设置显示错误信息变量为true
            ShowErrorMsg:=true
            
        endtry
        
    endfor
    *使用calibrate_cameras算子对相机进行标定,用于计算相机的内外参数
    calibrate_cameras (CalibDataID, Error)
    *使用get_calib_data
    get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
    get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
    *使用相机参数校正畸变
    *CameraParameters为相机的内部参数
    CameraParameters := CamParam[1:8]
    *CameraPose为相机的外部参数,即位变
    CameraPose := Pose
    stop()
    *读取待校正的图像
    read_image (Image1, 'E:/Images/calibration/10.bmp')
    get_image_pointer1(Image1, Pointer, Type, Width, Height)
    gen_rectangle1 (ImageRect, 0, 0, Height-1, Width-1)
    gen_contour_region_xld (ImageRect, ImageBorder, 'border')
    contour_to_world_plane_xld(ImageBorder, ImageBorderWCS, CameraParameters,CameraPose, 1)
    smallest_rectangle1_xld (ImageBorderWCS, MinY, MinX, MaxY, MaxX)
    set_origin_pose(CameraPose, MinX, MinY, 0.01, PoseForEntireImage)
    image_points_to_world_plane(CameraParameters,PoseForEntireImage,[Height/2, Height/2, Height/2+1], [Width/2, Width/2+1, Width/2], 1, WorldPixelX, WorldPixelY)
    distance_pp(WorldPixelY[0], WorldPixelX[0], WorldPixelY[1], WorldPixelX[1],WorldLength1)
    distance_pp(WorldPixelY[0], WorldPixelX[0], WorldPixelY[2], WorldPixelX[2],WorldLength2)
    ScaleForSimilarPixelSize := (WorldLength1+WorldLength2)/2
    *  -> determine output image size such that entire input image fits into it
    ExtentX := MaxX-MinX
    ExtentY := MaxY-MinY
    WidthRectifiedImage := ExtentX/ScaleForSimilarPixelSize
    HeightRectifiedImage := ExtentY/ScaleForSimilarPixelSize
    *  create mapping with the determined parachuangjia
    *创建一个投射图,其描述图像平面与坐标轴系统中平面Z为零之间的映射
    gen_image_to_world_plane_map(Map, CameraParameters, PoseForEntireImage, Width, Height, WidthRectifiedImage, HeightRectifiedImage, \
                                ScaleForSimilarPixelSize, 'bilinear')
    clear_calib_data (CalibDataID)
    * Map the images
    map_image (Image1, Map, ImageMapped)
    *Endfor
    *https://www.gkbc8.com/thread-13594-1-1.html
    gen_empty_obj (images)
    read_image (Image1, 'E:/Images/aerial.bmp')
    read_image (Image2, 'E:/Images/barbara.bmp')
    read_image (Image3, 'E:/Images/dollar.bmp')
    concat_obj (images, Image1, images)
    concat_obj (images, Image2, images)
    concat_obj (images, Image3, images)
    count_obj (images, Number1)
    remove_obj (images, images, 2)
    count_obj (images, Number2)
    select_obj (images, image, 1)
    dev_clear_obj (images)
    gen_empty_obj (images)
    count_obj (images, Number3)
    *tuple_length
    set_color ([H1BCA0393490], 'green')
    set_tposition ([H1BCA0393490], 24, 12)
    set_font ([H1BCA0393490], Number3)
    write_string ([H1BCA0393490], 'hello')

    Calibration校准halcon算子,持续更新_CSDN博客-CSDN博客

    更多相关内容
  • halcon相机标定

    2022-06-22 17:11:51
    halcon相机标定

    一、相机标定的目的:

            1、摄像头拍出来的原始图片是存在畸变的,我们需要通过标定来矫正这种畸变。

            2、相机坐标系 到 世界坐标系 的转化,需要知道图片上像素点的距离转化到实际中代表多长。

            3、标定分为内参和外参,内参和相机本身的材质等有关,和其它无关,正常情况下只需标定一次即可。外参和位姿(摄像头和成像平面的相对位置)有关,每次改变都需要重新标定。

    二、halcon相机标定流程

    1、创建标定板

    需要设置标定板的数据。

    2、设置相机内部参数的初始值,不同镜头不一样

    【焦距,畸变,像素尺寸宽,像素尺寸高,中心点坐标宽,中心点坐标高,图像尺寸】

    3、标定板初始化

    4、使用标定图像,进行全自动标定

    5、获取内参+外参

    三、标定方式一:使用标定助手,自动生成代码

    基本流程如下截图:

    1、新建一个标定

     2、按顺序依次设置相关参数

     3、导出代码,勾选需要的功能插入代码即可

     

    四、标定方式二:自己写代码

    *====创建标定板
    * XNum                 每行黑色标志圆点的数量。
    * YNum                 每列黑色标志圆点的数量。
    * MarkDist             两个就近黑色圆点中心之间的距离。单位是meter
    * DiameterRatio        黑色圆点直径与两圆点中心距离的比值。
    * CalTabDescrFile      标定板描述文件的文件路径(.descr),是保存文件的路径
    * CalTabPSFile         标定板图像文件的文件路径(.ps)
    gen_caltab(7,7,0.017,0.47,'0615.descr','0615.ps')
               
    *====标定内参
    dev_close_window ()
    dev_open_window (0, 0, 648, 486, 'black', WindowHandle)
    dev_update_off ()
    dev_set_draw ('margin')
    dev_set_line_width (3)
    OpSystem := environment('OS')
    set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
               
    
    *====标定相机
    *设置相机内部参数的初始值,不同镜头不一样【焦距,畸变,像素尺寸宽,像素尺寸高,中心点坐标宽,中心点坐标高,图像尺寸】
    StartCamPar := [0.0015,0,1.4e-006,1.4e-006,1296,972,2592,1944]
    
    *创建标定数据模型,
    * CalibSetup:创建的内容
    * NumCameras:相机个数
    * NumCalibObjects :标定项目数
    * CalibDataID:标定句柄
    create_calib_data ('calibration_object', 1, 1, CalibDataID)
    
    *使用set_calib_data_cam_param 算子设置相机内部初始值
    * CalibDataID:标定句柄
    * CameraIdx:相机序号
    * CameraType:相机模型种类;面阵相机Division畸变模型’area_scan_division’;polynomial畸变模型’area_scan_polynomial’。。。。。。
    * CameraParam :与相机模型种类相对应的参数;面阵相机Division畸变模型’area_scan_division’([Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]);polynomial畸变模型’area_scan_polynomial’([Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight])。。。。。。
    set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
    *标定板初始化
    set_calib_data_calib_object (CalibDataID, 0, '0615.descr')          
    stop ()
    
    list_files ('image', ['files','follow_links','recursive'], ImageFiles)
    tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
    for index := 0 to |ImageFiles| - 1 by 1
            try
                read_image (Image, ImageFiles[index])
                get_image_size(Image, Width, Height)
                dev_set_part (0, 0, Height, Width)
                dev_display (Image)
                *使用标定图像,直接用halcon全自动,进行标定
                find_calib_object (Image, CalibDataID, 0, 0, index, [], [])
                get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, index)
        catch (Exception)
            dev_get_exception_data (Exception, 'error_message', Message)
            dev_get_exception_data (Exception, 'error_code', Value)
            throw ([Exception,'image/' + index + '.jpg'])
        endtry
        
        dev_set_color ('green')
        dev_display (Caltab)
    endfor
    
    stop ()
    
    calibrate_cameras (CalibDataID, Error)
    *得到标定数据:内参+外参
    get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
    get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', PoseCalib)
               
    *输出计算的相机内参,内参 CamParam
    write_cam_par (CamParam, 'camera_parameters.dat')
                          
    Message:= '相机内参已经写入文件中'
    disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'false')
    clear_calib_data (CalibDataID)
    stop()
               
               
    *====标定外参
    dev_set_draw ('margin')
    dev_set_line_width (1)
    set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
               
    *从文件中读取内参 存储文件:camera_parameters.dat
    try
        read_cam_par ('camera_parameters.dat', CamParam)
    catch (Exception)
        stop ()
    endtry
               
    *开始计算
    open_file('data.csv','output', FileHandle)
    fwrite_string(FileHandle,'Dis_pix*0.0299204,Dis_m*1000,Distance')
    fnew_line (FileHandle)
    close_file(FileHandle)
               
    *选择一张作为标定作为最终标定位姿(任意一张都可以)
    index:=1
    read_image (Image,'image/'+index+'.jpg')
    dev_display (Image)
    CaltabName := '0615.descr'
    create_calib_data ('calibration_object', 1, 1, CalibDataID)
    
    set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', CamParam)
    set_calib_data_calib_object (CalibDataID, 0, CaltabName)
    find_calib_object (Image, CalibDataID, 0, 0, 1, [], [])
    get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, 1)
    *算子作用:从标定板中读取圆心数据
    * CalibDataID,标定参数模型句柄
    * CameraIdx,相机的索引,默认值为0
    * CalibObjIdx,校准对象的索引,默认值为0
    * CalibObjPoseIdx,观察到的校准对象的索引,默认值为0(以上是输入参数)
    * Row,检测到点的行坐标。
    * Column,检测到点的纵坐标。
    * Index,检测到的点与观测标定对象点的对应。
    * Pose,与观测相机相比,大致估计观测到的校准对象的姿势,参数元数个数:7
    get_calib_data_observ_points (CalibDataID, 0, 0, 1, RCoord, CCoord, Index, PoseForCalibrationPlate)
    dev_set_color ('green')
    dev_display (Caltab)
    dev_set_color ('red')
    disp_caltab (WindowHandle, CaltabName, CamParam, PoseForCalibrationPlate, 1)
    dev_set_line_width (1)
    disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5))
    * caltab_points (CaltabName, X, Y, Z)
    * calibrate_cameras (CalibDataID, Error)
    * To take the thickness of the calibration plate into account, the z-value
    * of the origin given by the camera pose has to be translated by the
    * thickness of the calibration plate.
    * Deactivate the following line if you do not want to add the correction.
    *转换3d坐标系原点
    * PoseIn,原始3D坐标系,元素个数为7
    * DX,X方向平移量
    * DY,Y方向平移量
    * DZ,Z方向平移量(上面都是输入参数)
    * PoseNewOrigin,输出参数,新的3D坐标系,元素个数为7
    set_origin_pose (PoseForCalibrationPlate, 0, 0, 0, PoseCalib)
    * disp_continue_message (WindowHandle, 'black', 'true')
    * stop ()
    
    *====畸变矫正
    *求理想内参
     * 参数1:自适应 
     * 参数2:填入第1步中得到的内参 
     * 参数3:径向畸变写0
     * 参数4:返回径向畸变为0的内参
    change_radial_distortion_cam_par ('adaptive', CamParam, 0, CamParamOut)
    *用理想内参矫正图像,先求一个Map映射
     * 参数1:返回Map映射
     * 参数2:有畸变的内参
     * 参数3:径向畸变为0的内参
     * 参数4:插值算法
    gen_radial_distortion_map (Map, CamParam, CamParamOut, 'bilinear')
    *然后使用Map映射来矫正有径向畸变的图像
    map_image (Image, Map, ImageMapped)
    dev_display (ImageMapped)
    write_image (ImageMapped, 'jpg', 0, './test')
    stop ()
    
    
    *====坐标转换
    *点点转换
    *用同一个世界坐标系来计算
        *  @brief 将像素坐标转换到世界坐标系中(z=0)
    
        *  @param cameraParam    [IN] 相机内参
        *  @param worldPose        [IN] 世界坐标系在摄像机坐标系中的3D位姿
        *  @param Rows [IN] 要转换的点的行坐标
        *  @param Cols   [IN] 要转换的点的列坐标
        *  @param scale    [IN] 坐标系的单位尺寸
        *  @param x        [OUT] 在世界坐标系中的点的X坐标
        *  @param y        [OUT] 在世界坐标系中的点的Y坐标
    image_points_to_world_plane(CamParam, PoseCalib,RCoord, CCoord, 'mm', X1, Y1)
    distance_pp(Y1[0],X1[0],Y1[1],X1[1],Distance)           
    stop()
    
    *轮廓转换
    * Calibration 01: Sample Task: Transform contours into world coordinates
    * Calibration 01: **********************************************************
    * Calibration 01: First, obtain an XLD in image coordinates which relates to some
    * Calibration 01: interesting features in the image. Here, we simply generate a contour
    * Calibration 01: connecting the mark center points of the plate
    gen_contour_polygon_xld (TmpObj_ImageContour, RCoord, CCoord)
    * Calibration 01: Then, we convert it to world coordinates (using [mm])
    contour_to_world_plane_xld (TmpObj_ImageContour, TmpObj_WorldContour, CamParam, PoseCalib, 'mm')
    * Calibration 01: Extract mark center points in world coordinates [mm]
    get_contour_xld (TmpObj_WorldContour, TmpCtrl_WorldX, TmpCtrl_WorldY)
    stop ()

    五、图像畸变矫正

    上述标定过程获取的内参为有畸变的内参,这里要进行畸变矫正,流程如下:

    1、获取理想内参

    2、用理想内参矫正图片,求map映射

    3、用map矫正有畸变的图片

    六、利用外参进行坐标转换,图像坐标->世界坐标

    1、选择一张图片作为标定,确定最终标定位姿(任意一张都可以)

    展开全文
  • Halcon相机标定代码.hdev 1.初始化 for example: Full image (640*480) Subsampling (320*240) ImageWidth 640 320 ImageHeight 480 240 2.标定板初始化 CaltabName := 'caltab_30mm.descr'//标定板描述...
  • 用于halcon软件辅助的相机标定,有相关详细每步分析与介绍
  • HALCON 相机标定例程

    2018-08-22 16:40:18
    利用HALCON进行相机坐标系标定,有代码,有图片,下载即可运行
  • HALCON相机标定基础知识及过程

    千次阅读 2021-10-11 09:42:10
    一、标定目标 二、标定基础知识 刚体变换:变换前后两点间的距离依旧保持不变 镜头光轴:镜头中心的线 世界坐标系与相机坐标系的关系就是相机的外参 1、坐标系 世界坐标系:物体在真实世界的三维坐标。 相机坐标系...

    一、标定目标
    在这里插入图片描述
    二、标定基础知识
    刚体变换:变换前后两点间的距离依旧保持不变
    镜头光轴:镜头中心的线
    世界坐标系与相机坐标系的关系就是相机的外参
    1、坐标系
    世界坐标系:物体在真实世界的三维坐标。
    相机坐标系:相机光学中心为原点,光轴与世界坐标系的z轴重合。
    图像坐标系xoy:相机拍摄图像的坐标系,与像素坐标系平移即可得到。单位通常为mm,原点是图像的中心点,是相机光轴与相面的交点。
    像素坐标系uov:二维直角坐标系,反应cmos/ccd芯片中像素的排列情况,单位是像素,原点在左上角。
    在这里插入图片描述2、坐标系转换
    (1)世界坐标系到相机坐标系的转换
    只需要平移旋转,只涉及刚体变换。转换示意图如下图所示
    在这里插入图片描述
    旋转细节:
    在这里插入图片描述
    绕三个轴分别进行旋转:
    在这里插入图片描述
    三个旋转方向相乘,得到旋转矩阵

    在这里插入图片描述
    在这里插入图片描述
    (2)相机坐标系到图像坐标系的转换
    属于从3d到2d的映射关系,利用相似三角形得到。
    在这里插入图片描述(3)图像坐标系到像素坐标系的转换

    在这里插入图片描述

    (4)坐标系转换结论
    在这里插入图片描述
    三、halcon标定步骤
    1.gen_caltab(7,7,0.0125,0.5,‘caltab.descr’,‘caltab.ps’) //生成一个标定板描述文件,7*7大小,两个圆心之间的距离0.0125米,0.5是黑色圆点直径与两圆心中心距离的比值,描述文件,ps文件。(ps文件可以打印标定板)
    2.输完代码后,单击右键打开算子窗口,改描述文件路径,保存即可。
    3.标定板占据视野三分之一-二分之一大小;
    助手-打开新的image-自动检测接口-实时-参数设定(关注曝光时间)
    4.采集标定板照片15-20张,保证每一张都在视野范围内,保证每个角度都有照片,倾斜的角度
    标定助手calibration-安装-把生成的标定板描述文件载入-输入像元大小、焦距-标定-图像采集助手-显示图像确定即可-选择参考位姿(一般选择正的角度)-把实时勾掉-点击标定
    5.结果-保存(摄像机参数是内参,摄像机位姿是外参)

    展开全文
  • 超详细 halcon 相机标定 附代码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...
  • Halcon标定助手中可以通过勾选使用示例中“将测量结果变换到世界坐标系中”导出标定板其中两点中心距。首先,采集一组标定板不同位姿图片,利用Halcon标定助手进行标定。实验测量距离分别为10.1181、10.1359、10....

    Halcon相机标定及导出标定板实际圆心距离(Halcon学习笔记)
    首先,采集一组标定板不同位姿图片,利用Halcon标定助手进行标定。
    在这里插入图片描述
    在Halcon标定助手中可以通过勾选使用示例中“将测量结果变换到世界坐标系中”导出标定板其中两点中心距。
    在这里插入图片描述
    以下为手工编写测两点中心距程序的流程:
    在这里插入图片描述
    在此基础上,如下所示,在标定板放置平面上放置一把游标卡尺,测量卡尺上每两个1之间的实际距离:
    在这里插入图片描述
    实验测量距离分别为10.1181、10.1359、10.1592。

    展开全文
  • HALCON相机标定相机内参相机外参

    万次阅读 多人点赞 2019-08-27 11:54:48
    HALCON相机标定相机内参相机外参halcon 相机标定图文解释,使用halcon标定过程。这几天一直在搞相机的标定。过程中遇到了许许多多的问题,为了让广大自动化行业的小白避免踩坑,用这个帖子总结一下相机的标定。接...
  • 对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变,其中径向畸变是由透镜造成的,切向畸变是由成像...
  • halcon相机标定及常见问题解决
  • 深入理解halcon相机标定

    万次阅读 多人点赞 2020-04-08 17:55:21
    目录相机标定简介深度说明1、相机标定参数介绍2、标定板详细介绍问题1:halcon是否只能使用halcon专用的标定板?问题2:halcon标定板如何生成?问题3:halcon标定板如何摆放,拍照数量有无限制?标定步骤1、设置相机...
  • 简要 Halcon相机标定

    千次阅读 2020-09-07 13:02:16
    相机标定前言一、标定是什么?二、标定步骤1.制作标定板2.拍摄标定图片3.设置参数4.标定板初始化4.创建数据模型4.加载所有图像,寻找标定板区域,确定圆心,将结果加载到组元中5.标定(计算和保存参数)5.矫正总结 ...
  • halcon相机标定Demo

    2018-11-18 16:07:15
    使用halcon标定板计算相机外部、内部参数,消除面阵相机成像中存在径向畸变。
  • halcon 相机标定-畸变校正参考

    千次阅读 2020-05-19 17:34:56
    1 halcon相机标定和图像矫正 对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变,其中径向...
  • 由于条件限制拿到了halcon标定相机的参数,但由于自己畸变矫正采用opencv形式,但halcon官网给出5畸变系数到opencv不可转换。实际转换公式为: void calibParaL (Mat &cameraMatrix, Mat &distCoeffs) { ...
  • halcon相机标定及畸变矫正

    千次阅读 2020-06-29 11:34:00
    1 halcon相机标定和图像矫正 对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变,其中径向畸变是由...
  • halcon相机标定及图像矫正(代码)

    千次阅读 2019-10-02 18:40:47
    1 halcon相机标定和图像矫正 对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标...
  • 基于Halcon的单相机标定程序以及详细讲解。
  • 眼在手移动相机手眼标定,其中包含标定板图像和配套的机器人末端姿态文件
  • Halcon相机标定

    千次阅读 2014-11-04 13:52:07
    相关算子:相关算子: 1.create_calib_data( : : CalibSetup, NumCameras, NumCalibObjects : ...NumCameras:相机数目 NumCalibObjects:图片中标定板个数 CalibDataID:标定模型句柄(标示符) 2.set_ca
  • Halcon 相机标定

    千次阅读 2020-04-10 15:58:16
    Halcon标准标定板: 1. 带有矩形标记的标定
  • 第二节 相机标定3.2.1 简单的啰嗦几十句有时候我啰嗦归啰嗦,但是不代表说的话是废话。所以该看的你还是得看一下的,老铁。比如接下来的话:第一、不管多好的相机,硬件传感器拍摄出来的照片都是有畸变的,这个畸变...
  • HALCON进行相机标定,并且矫正,转换成c++语言在vs上跑(用vs2010的编译环境,然后调用halcon视觉库就可以了)
  • HALCON 完整的相机标定成,可以调试运行的Halcon 程序
  • Halcon之单相机标定

    千次阅读 2022-02-05 19:06:00
    Halcon之单相机标定

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,017
精华内容 406
关键字:

halcon相机标定