13:图像处理—畸变矫正详解
1.制作标定板和描述文件
(用PS软件打印)
* 0.00375 mark 点间距 , 不是 点的直径//倒数第二个就是描述文件
gen_caltab(7,7,0.00375,0.5,'caltab_30mm.descr','30-30.ps')
* 1 比 1 打印 。Photoshop 格式
2.把标定板调正
调正的目的是为了确定一个正中心的参考姿态(放在循环读取标定图像之后,获取外参的基准)
方法一:
*实时调整 相机视野内的标定板中心点的位置和角度 。 角度 保持在0度 ±4度。 位置在中心点 600,800 ±3.
*************************************************************1.初始化******************************************************************************
* 关闭窗口
dev_close_window ()
* 更新程序计数器,更新变量,更新图形窗口
dev_update_off ()
* 设置区域填充模式
dev_set_draw ('margin')
* 读取图像
read_image (Image, './图像/1.bmp')
* 获取图像类型,宽度,高度,缓存数据get_image_pointer1 (Image, Pointer, Type, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width/5, Height/5, 'black', WindowHandle1)
* 设置字体信息
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
* 显示图像
dev_display (Image)
get_image_size(Image, Width, Height)
* 右下角显示运行字样字符串
disp_continue_message (WindowHandle1, 'black', 'true')
*
*************************************************************2.校正相机****************************************************************************
* 标定文件名
CaltabName := 'caltab_30mm.descr'
* [Focus,Kappa,Sx,Sy,Cx,Cy,Width,Height]
*Focus 镜头的焦距
*Kappa 畸变值
*Sx,Sy 像元尺寸 4.8 0.0000048 =4.8 *e-6 m
*Cx 640, Cy 512
*Width,Height 1280,1024
*3072 2048
StartCamPar := [0.008,0,2.4e-006,2.4e-006,3072/2,1024,3072,2048]*创建标定数据模型
*CalibDataID 准备一个标定句柄!
create_calib_data ('calibration_object', 1, 1, CalibDataID)*1.设置相机类型并初始化标定数据模型里的摄像机内部参数
*面扫描 多项式 area_scan_division
set_calib_data_cam_param (CalibDataID, 0, \'area_scan_division', StartCamPar)
*2.为校正句柄 指定校正文件 'caltab_30mm.descr'
set_calib_data_calib_object (CalibDataID, 0, CaltabName)*读取图像
read_image (Image1, './图像/1.bmp')
*图像增强
scale_image(Image1, Image, 1.0, 0)
*显示图像
dev_display (Image)
*获取校正板内边框以内的区域
find_caltab (Image, Caltab, CaltabName, 3, 110, 5)
*设置输出对象显示颜色
dev_set_color ('green')
*显示校正板内边框以内的区域
dev_display (Caltab)
*提取出图像中MARK点的位置并计算出摄像机外部参数
find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar,\128, 10, 18, 0.9, 15, 100, \RCoord, CCoord, StartPose)*设置输出对象显示颜色
dev_set_color ('red')
*设置半径为2.5
tuple_gen_const(|RCoord|,2.5, Radius)
*显示MARK所有点的位置disp_circle (WindowHandle1, RCoord, CCoord, Radius)
dev_set_color ('blue')
*显示MARK中心点的位置
disp_circle (WindowHandle1, RCoord[24], CCoord[24], 6)*设置第一行的起始点和终点
StartRow:=RCoord[0]
StartColumn:=CCoord[0]
EndRow:=RCoord[6]
EndColumn:=CCoord[6]
dev_set_color('yellow')*设置第一行的所有点
Row:=[]
Column:=[]
Row:=RCoord[0:6]
Column:=CCoord[0:6]
stop()
*显示第一行的所有点
gen_cross_contour_xld(Cross, Row, Column, 6, 0.785398)dev_set_line_width(3)
dev_set_color('red')
*由点生成直线
gen_contour_polygon_xld (Contour, Row, Column)*拟合直线
fit_line_contour_xld (Contour, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)*生成直线
gen_contour_polygon_xld (Contour, [RowBegin,RowEnd], [ColBegin,ColEnd])*显示直线起点
disp_circle (WindowHandle1, RCoord[0], CCoord[0], 6)
*显示终点
disp_circle (WindowHandle1, RCoord[6], CCoord[6], 6)*计算直线角度
angle_lx(RowBegin,ColBegin,RowEnd,ColEnd,Phi)Angle:=deg(Phi)
disp_message (WindowHandle1, 'RCoord= '+RCoord[24], ' WindowHandle', RCoord[24], CCoord[24], 'yellow', 'false')
disp_message (WindowHandle1,'CCoord= '+CCoord[24], ' WindowHandle', RCoord[24]+40, CCoord[24], 'yellow', 'false')
disp_message (WindowHandle1, 'angle= '+Angle, 'WindowHandle', RCoord[0], CCoord[0], 'red', 'false')
dev_update_time ('on')
disp_continue_message (WindowHandle1, 'black', 'true')*移动到中心点(仿射变换)
get_image_size(Image, Width1, Height1)
vector_angle_to_rigid(RCoord[24], CCoord[24], rad(Angle), Height1/2, Width1/2, 0, HomMat2D)
affine_trans_image(Image, ImageAffinTrans, HomMat2D, 'constant', 'false')*保存调正的图像
write_image(ImageAffinTrans, 'bmp', 0, 'TZ11')
stop ()
方法二:
*实时调整 相机视野内的标定板中心点的位置和角度 。 角度 保持在0度 ±4度。 位置在中心点 600,800 ±3.
*************************************************************1.初始化******************************************************************************
* 关闭窗口
dev_close_window ()
* 更新程序计数器,更新变量,更新图形窗口
dev_update_off ()
* 设置区域填充模式
dev_set_draw ('margin')
* 读取图像
read_image (Image, 'pic02.png')
* 获取图像类型,宽度,高度,缓存数据
get_image_pointer1 (Image, Pointer, Type, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle1)
* 设置字体信息
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
* 显示图像
dev_display (Image)
* 右下角显示运行字样字符串
disp_continue_message (WindowHandle1, 'black', 'true')
*
*************************************************************2.校正相机****************************************************************************
* 标定文件名
CaltabName := 'caltab_56mm.descr'
* [Focus,Kappa,Sx,Sy,Cx,Cy,Whith,Height]
StartCamPar := [0.0184898,-548.002,8.33409e-006,8.3e-006,275.291,255.374,1600,1200]
*创建标定数据模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机类型并初始化标定数据模型里的摄像机内部参数
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*为校正模型指定校正文件
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
*读取图像
read_image (Image, 'pic02.png')
*显示图像
dev_display (Image)
*获取校正板内边框以内的区域
find_caltab (Image, Caltab, CaltabName, 3, 112, 5)
*设置输出对象显示颜色
dev_set_color ('green')
*显示校正板内边框以内的区域
dev_display (Caltab)
*提取出图像中MARK点的位置并计算出摄像机外部参数
find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)
*设置输出对象显示颜色
dev_set_color ('red')
*显示MARK点的位置
disp_circle (WindowHandle1, RCoord, CCoord, gen_tuple_const(|RCoord|,2.5))
dev_set_color ('blue')
*显示MARK点的位置
disp_circle (WindowHandle1, RCoord[24], CCoord[24], 6)
StartRow:=RCoord[0]
StartColumn:=CCoord[0]
EndRow:=RCoord[6]
EndColumn:=CCoord[6]
dev_set_color('yellow')
Row:=[]
Column:=[]
for i:=0 to 6 by 1
Row:=[Row,RCoord[i]]
Column:=[ Column,CCoord[i]]
endfor
stop()
gen_cross_contour_xld(Cross, Row, Column, 6, 0.785398)
gen_contour_polygon_xld (Contour, Row, Column)
fit_line_contour_xld (Contour, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
gen_contour_polygon_xld (Contour, [RowBegin,RowEnd], [ColBegin,ColEnd])
disp_circle (WindowHandle1, RCoord[0], CCoord[0], 6)
disp_circle (WindowHandle1, RCoord[6], CCoord[6], 6)
angle_lx(RowBegin,ColBegin,RowEnd,ColEnd,Phi)
Angle:=Phi*180/3.1415926
disp_message (WindowHandle1, 'RCoord= '+RCoord[24], ' WindowHandle', RCoord[24], CCoord[24], 'yellow', 'false')
disp_message (WindowHandle1,'CCoord= '+CCoord[24], ' WindowHandle', RCoord[24]+40, CCoord[24], 'yellow', 'false')
disp_message (WindowHandle1, 'angle= '+Angle, 'WindowHandle', RCoord[0], CCoord[0], 'red', 'false')
dev_update_time ('on')
disp_continue_message (WindowHandle1, 'black', 'true')*移动到中心点
get_image_size(Image, Width1, Height1)
vector_angle_to_rigid(RCoord[24], CCoord[24], rad(Angle), Height1/2, Width1/2, 0, HomMat2D)
affine_trans_image(Image, ImageAffinTrans, HomMat2D, 'constant', 'false')write_image(ImageAffinTrans, 'png', 0, 'pic06.png')
stop ()
3.内外参标定
* 关闭窗口
dev_close_window ()
* 更新程序计数器,更新变量,更新图形窗口
dev_update_off ()
* 设置区域填充模式
dev_set_draw ('margin')
* 读取图像
read_image (Image, 'MPic/pic01.png')
* 获取图像类型,宽度,高度,缓存数据
get_image_pointer1 (Image, Pointer, Type, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle1)
* 设置字体信息
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
* 显示图像
dev_display (Image)
* 右下角显示运行字样字符串
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()* 标定文件名
CaltabName := 'caltab_56mm.descr'
* [Focus,Kappa,Sx,Sy,Cx,Cy,Width,Height]
StartCamPar := [0.008, 0, 5.2e-006, 5.2e-006, 800, 600, 1600, 1200]
*创建标定数据模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机类型并初始化标定数据模型里的摄像机内部参数
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*为校正模型指定校正文件
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
NumImages := 8
for i := 0 to NumImages by 1*读取图像read_image (Image, 'MPic/pic'+(i+1)$'02d')*显示图像dev_display (Image)gen_rectangle1(Rectangle, 1, 1, 1200,1600)reduce_domain(Image, Rectangle, ImageReduced1)min_max_gray ( ImageReduced1, Image, 5, Min, Max, Range)scale_image (Image, ImageScaled, 255 / Range, -Min * 255 / Range)*获取校正板内边框以内的区域find_caltab (ImageScaled, Caltab, CaltabName, 3, 112, 5)*设置输出对象显示颜色dev_set_color ('green')*显示校正板内边框以内的区域dev_display (Caltab)*提取出图像中MARK点的位置并计算出摄像机外部参数find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, \128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)*设置输出对象显示颜色dev_set_color ('red')*显示MARK点的位置disp_circle (WindowHandle1, RCoord, CCoord, gen_tuple_const(|RCoord|,2.5))dev_set_part (0, 0, Height-1, Width-1)*收集观察数据set_calib_data_observ_points (CalibDataID, 0, 0, i, RCoord, CCoord, 'all', StartPose)
endfor
dev_update_time ('on')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
*开始校正摄像机
calibrate_cameras (CalibDataID, Error)
*获取优化以后的摄像机内部参数
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
******保存相机内参,且该函数只能保存内参***
write_cam_par(CamParam,'cam.dat')
****************************
*获取优化以后的校正对象姿势,相对于当前参考相机。(这个位姿就是上面调正后的标定板位姿)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,0], 'pose', PoseCalib)
write_pose(PoseCalib, 'poseOrigin.dat')
4.单像素对应的距离
*矫正后再测量
*选取两个像素点 2个点求距离
Image_X1:=100
Image_Y1:=100Distance_XY:=500
Image_X2:=Image_X1+Distance_XY
Image_Y2:=Image_Y1+Distance_XYgen_cross_contour_xld(Cross1, Image_X1, Image_Y1, 46, 0.785398)
gen_cross_contour_xld(Cross2, Image_X2, Image_Y2, 76, 0.785398)
*考虑标定板厚度的影响 PoseNewOrigin在这里
*[0.0209422, -0.0257558, 0.56891, 7.69086, 10.9034, 359.249, 0]* 0 旋转轴种类
* pose1:=[0,0,0.003,0,0,0,0]
* pose_compose(PoseCalib,pose1,PoseCompose1)* 0.003 标定板的厚度 3mm 0.003m
*第一个参数是标定的外参
set_origin_pose(PoseCalib,0,0,-0.003,PoseNewOrigin)*将像素坐标转化为世界坐标(单位m)第一个参数是标定的内参
image_points_to_world_plane(CamParam, PoseNewOrigin, Image_Y1, Image_X1, 'm', World_X1, World_Y1)
image_points_to_world_plane(CamParam ,PoseNewOrigin, Image_Y2, Image_X2, 'm', World_X2, World_Y2)*******************************************************************************************
*计算世界坐标距离
distance_pp(World_Y1, World_X1, World_Y2, World_X2, DistanceWorld)
*计算像素坐标
distance_pp(Image_X1,Image_Y1,Image_X2,Image_Y2,DistanceImage)*每个像素对应的世界坐标距离
DistanceOnePixel:=DistanceWorld/DistanceImage
5.求偏移值,把图像移到正中间
WindowHandle1Out := WindowHandle1disp_3d_coord_system (WindowHandle1Out, CamParam, PoseNewOrigin, 0.05)*调整世界坐标到中心偏移量
OffSetX:=(Width/2)*DistanceOnePixel
OffSetY:=(Height/2)*DistanceOnePixelset_origin_pose (PoseNewOrigin, -OffSetX, -OffSetY, 0, PoseNewOriginFinal)
6.消除畸变和视角畸变
*内参 CamParam,
* 外参 PoseNewOriginFinal,
*图像的宽度和高度, 像素Width, Height, Width, Height,
*单像素对应距离DistanceOnePixelgen_image_to_world_plane_map(Map1, CamParam, PoseNewOriginFinal, Width, Height, \Width, Height,DistanceOnePixel, 'bilinear')write_object(Map1, 'Map1.obj')read_object(Map1, 'Map1.obj')
*5.验证 和 测试 !
for Index := 1 to 1 by 1read_image(Image1, 'MPic/pic'+Index$'02d'+'.png')* 在这里对原始图像 Image1, 进行畸变矫正,ImageMapped1。map_image(Image1,Map1, ImageMapped1)*验证精度是否足够dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle3)dev_display(ImageMapped1)column:=611dev_set_color('blue')dev_set_line_width(3)gen_contour_polygon_xld (Polygon, [451,451], [column,column+0.056/DistanceOnePixel])dev_set_color('red')dev_set_line_width(1)gen_cross_contour_xld(Cross1, 451, column, 46, 0.785398)gen_cross_contour_xld(Cross2, 451, column+0.056/DistanceOnePixel, 46, 0.785398)disp_message (WindowHandle3, '56cm', 'window', 205, 195, 'red', 'false')dev_display (Polygon)dev_display (Cross1)dev_display (Cross2)disp_continue_message (WindowHandle3, 'black', 'true')stop()
endfor
附录
* This program measures the length of scratches in world
* coordinates in a perspectively distorted image
*************************************************************1.初始化******************************************************************************
* 关闭窗口
dev_close_window ()
* 更新程序计数器,更新变量,更新图形窗口
dev_update_off ()
* 设置区域填充模式
dev_set_draw ('margin')
* 读取图像
read_image (Image, 'picture/image1.png')
* 获取图像类型,宽度,高度,缓存数据
get_image_pointer1 (Image, Pointer, Type, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle1)
* 设置字体信息
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
* 显示图像
dev_display (Image)
* 右下角显示运行字样字符串
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
*
*************************************************************2.校正相机****************************************************************************
* read_cam_par ('cam.dat', CamParam)* 标定文件名
CaltabName := 'caltab_56mm.descr'
* [Focus,Kappa,Sx,Sy,Cx,Cy,Whith,Height]
StartCamPar := [0.008, 0, 5.2e-006, 5.2e-006, 640, 512, 1280, 1024]
*创建标定数据模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机类型并初始化标定数据模型里的摄像机内部参数
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*为校正模型指定校正文件
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
NumImages := 8
for i := 1 to NumImages by 1*读取图像read_image (Image, 'picture/image'+i$'01d')*显示图像dev_display (Image)gen_rectangle1(Rectangle, 1, 1, 1024,1280)reduce_domain(Image, Rectangle, ImageReduced1)min_max_gray ( ImageReduced1, Image, 5, Min, Max, Range)scale_image (Image, ImageScaled, 255 / Range, -Min * 255 / Range)*获取校正板内边框以内的区域find_caltab (ImageScaled, Caltab, CaltabName, 3, 112, 5)*设置输出对象显示颜色dev_set_color ('green')*显示校正板内边框以内的区域dev_display (Caltab)*提取出图像中MARK点的位置并计算出摄像机外部参数find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)*设置输出对象显示颜色dev_set_color ('red')*显示MARK点的位置disp_circle (WindowHandle1, RCoord, CCoord, gen_tuple_const(|RCoord|,2.5))dev_set_part (0, 0, Height-1, Width-1)*收集观察数据set_calib_data_observ_points (CalibDataID, 0, 0, i, RCoord, CCoord, 'all', StartPose)
endfor
dev_update_time ('on')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
*开始校正摄像机
calibrate_cameras (CalibDataID, Error)
*获取优化以后的摄像机内部参数
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)*获取优化以后的校正对象姿势,相对于当前参考相机。第一张图作为参考位姿
get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', PoseCalib)
******保存相机内参,且该函数只能保存内参***
write_cam_par(CamParam,'cam.dat')
write_pose(PoseCalib, 'poseOrigin.dat')stop()*都是两个点求距离************************************************************************************************************************矫正后再测量
*选取两个像素点 2个点求距离
Image_X1:=100
Image_Y1:=100
Distance_XY:=500
Image_X2:=Image_X1+Distance_XY
Image_Y2:=Image_Y1+Distance_XY*考虑标定板厚度的影响 PoseNewOrigin在这里set_origin_pose(PoseCalib,0,0,0.003,PoseNewOrigin)
*将像素坐标转化为世界坐标(单位m)
image_points_to_world_plane(CamParam, PoseNewOrigin, Image_Y1, Image_X1, 'm', World_X1, World_Y1)
image_points_to_world_plane(CamParam ,PoseNewOrigin, Image_Y2, Image_X2, 'm', World_X2, World_Y2)*******************************************************************************************
*计算世界坐标距离
distance_pp(World_Y1, World_X1, World_Y2, World_X2, DistanceWorld)
*计算像素坐标
distance_pp(Image_X1,Image_Y1,Image_X2,Image_Y2,DistanceImage)*每个像素对应的世界坐标距离
DistanceOnePixel:=DistanceWorld/DistanceImage
*调整世界坐标到中心偏移量
OffSetX:=(Width/2)*DistanceOnePixel
OffSetY:=(Height/2)*DistanceOnePixel*
*************************************************************3.图像转换****************************************************************************
*这张图 是 世界坐标系的参考姿态图 ,与外参demo 中游标卡尺的坐标系是类似的作用
read_image (ImagePespective, 'picture/image1.png')
*调整相机外参
*假如需要重新拍一张图 ,这个图 与世界坐标系 的姿态一致。由于是平面,不考虑 x y 的变化,只考虑z方向角度的变化。
*所以这里是第5个值 需要替换 ,RZ
*PoseCalibRot 是机器人的坐标系
* tuple_replace (PoseNewOrigin, 5, PoseCalib[5], PoseCalibRot)
********************************************************************************************将摄像机位姿进行X,Y,Z的平移(矩阵乘积) 设定世界坐标
set_origin_pose (PoseNewOrigin, -OffSetX, -OffSetY, 0, PoseNewOriginFinal)
*生成map,消除径向畸变和视角畸变
gen_image_to_world_plane_map(Map1, CamParam, PoseNewOriginFinal, Width, Height, Width, Height,DistanceOnePixel, 'bilinear')
write_object(Map1, 'Map1.obj')
*矫正图像
map_image(ImagePespective,Map1, ImageMapped1)
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle3)
dev_display(ImageMapped1)
column:=511
*0.00021932gen_contour_polygon_xld (Polygon, [451,451], [column,column+0.056/DistanceOnePixel])
dev_set_color('blue')
gen_cross_contour_xld(Cross, 451, column, 16, 0.785398)disp_message (WindowHandle3, '56cm', 'window', 205, 195, 'red', 'false')dev_display (Polygon)disp_continue_message (WindowHandle3, 'black', 'true')
stop()
详细完整步骤:
调平角度的目的是为了设定一个正中心的标定板外参位姿为参考
*实时调整 相机视野内的标定板中心点的位置和角度 。 角度 保持在0度 ±4度。 位置在中心点 600,800 ±3.
*************************************************************1.初始化******************************************************************************
* 关闭窗口
dev_close_window ()
* 更新程序计数器,更新变量,更新图形窗口
dev_update_off ()
* 设置区域填充模式
dev_set_draw ('margin')
* 读取图像
read_image (Image, './图片/1')
* 获取图像类型,宽度,高度,缓存数据
get_image_size(Image, Width, Height)
* get_image_pointer1 (Image, Pointer, Type, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle1)
* 设置字体信息
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
* 显示图像
dev_display (Image)
* 右下角显示运行字样字符串
disp_continue_message (WindowHandle1, 'black', 'true')
*
*************************************************************2.校正相机****************************************************************************
* 标定文件名
CaltabName := 'caltab_30mm.descr'
* [Focus,Kappa,Sx,Sy,Cx,Cy,Whith,Height]* 焦距 初始畸变 像元尺寸 中心点 图像的宽 和 高
StartCamPar := [0.008,0,4.8e-006,4.8e-006,640,512,1280,1024]
*创建标定数据模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机类型并初始化标定数据模型里的摄像机内部参数
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*为校正模型指定校正文件
set_calib_data_calib_object (CalibDataID, 0, CaltabName)*读取图像
read_image (Image, './图片/1')
*显示图像
dev_display (Image)
*获取校正板内边框以内的区域
find_caltab (Image, Caltab, CaltabName, 3, 112, 5)
*设置输出对象显示颜色
dev_set_color ('green')
*显示校正板内边框以内的区域
dev_display (Caltab)
*提取出图像中MARK点的位置并计算出摄像机外部参数
find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)
*设置输出对象显示颜色
dev_set_color ('red')
*显示MARK点的位置
disp_circle (WindowHandle1, RCoord, CCoord, gen_tuple_const(|RCoord|,2.5))
dev_set_color ('blue')
*显示MARK点的位置
disp_circle (WindowHandle1, RCoord[24], CCoord[24], 6)
StartRow:=RCoord[0]
StartColumn:=CCoord[0]
EndRow:=RCoord[6]
EndColumn:=CCoord[6]
dev_set_color('yellow')
Row:=[]
Column:=[]for i:=0 to 6 by 1
Row:=[Row,RCoord[i]]
Column:=[ Column,CCoord[i]]
endfor
stop()
gen_cross_contour_xld(Cross, Row, Column, 6, 0.785398)
gen_contour_polygon_xld (Contour, Row, Column)
fit_line_contour_xld (Contour, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
gen_contour_polygon_xld (Contour, [RowBegin,RowEnd], [ColBegin,ColEnd])
disp_circle (WindowHandle1, RCoord[0], CCoord[0], 6)
disp_circle (WindowHandle1, RCoord[6], CCoord[6], 6)
angle_lx(RowBegin,ColBegin,RowEnd,ColEnd,Phi)
Angle:=Phi*180/3.1415926
disp_message (WindowHandle1, 'RCoord= '+RCoord[24], ' WindowHandle', RCoord[24], CCoord[24], 'yellow', 'false')
disp_message (WindowHandle1,'CCoord= '+CCoord[24], ' WindowHandle', RCoord[24]+40, CCoord[24], 'yellow', 'false')
disp_message (WindowHandle1, 'angle= '+Angle, 'WindowHandle', RCoord[0], CCoord[0], 'red', 'false')
dev_update_time ('on')
disp_continue_message (WindowHandle1, 'black', 'true')*移动到中心点
get_image_size(Image, Width1, Height1)
vector_angle_to_rigid(RCoord[24], CCoord[24], rad(Angle), Height1/2, Width1/2, 0, HomMat2D)
affine_trans_image(Image, ImageAffinTrans, HomMat2D, 'constant', 'false')write_image(ImageAffinTrans, 'bmp', 0, './图片/0')
stop ()
完整标定畸变矫正程序:
* This program measures the length of scratches in world
* coordinates in a perspectively distorted image*3.外参-畸变图像校正-cameracal -调正了第一个图作为外参pose
*set_origin_pose(PoseCalib,0,0,0.003,PoseNewOrigin) 因为首张图已经被调整 因此该处dx dy 为0*************************************************************1.初始化******************************************************************************
* 关闭窗口
dev_close_window ()
* 更新程序计数器,更新变量,更新图形窗口
dev_update_off ()
* 设置区域填充模式
dev_set_draw ('margin')
* 读取图像
read_image (Image, '图片/1')
* 获取图像类型,宽度,高度,缓存数据
get_image_pointer1 (Image, Pointer, Type, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle1)
* 设置字体信息
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
* 显示图像
dev_display (Image)
* 右下角显示运行字样字符串
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()* 1.内参标定 CamParam, PoseCalib
gen_self_Campar_and_PoseOrigin (WindowHandle1, Height, Width,\CamParam, PoseCalib, CalibDataID)
stop()*2.单像素对应距离 DistanceOnePixel
gen_self_DistanceOnePixel (PoseCalib, CamParam, PoseNewOrigin,\DistanceOnePixel)*3.求偏离值 把图像移动到正中间!
gen_self_FinalPose (WindowHandle1, CamParam, PoseNewOrigin, \Width, Height, DistanceOnePixel, PoseCalib, PoseNewOriginFinal)*4.map 消除径向畸变和视角畸变
read_image (ImagePespective, '图片/1')*内参 CamParam,
* 外参 PoseNewOriginFinal,
*图像的宽度和高度, 像素Width, Height, Width, Height,
*单像素对应距离DistanceOnePixel 8.11503e-05
* DistanceOnePixel:=0.000 08 29788 0.08mm 1
gen_image_to_world_plane_map(Map1, CamParam, PoseNewOriginFinal, Width, Height, \Width, Height,DistanceOnePixel, 'bilinear')DistanceOnePixel:=0.0000828126
write_object(Map1, 'Map1.obj')
*3.83674e-05*0.0000383674
read_object(Map1, 'Map1.obj')
*5.验证 和 测试 !
for Index := 1 to 1 by 1read_image(Image1, '图片/6')* 在这里对原始图像 Image1, 进行畸变矫正,ImageMapped1。* 不失真的图 map_image(Image1,Map1, ImageMapped1)*364 30mm 1像素 0.08mm * 2像素 1280 1024 2560 *2000=500万像素distance_pp(452 ,454 , 452 ,818, Distance)*误差 0.2mm误差*0.0302043
* X:=Distance*DistanceOnePixel*验证精度是否足够dev_get_window(WindowHandle)
* dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle3)dev_display(ImageMapped1)column:=459dev_set_color('blue')dev_set_line_width(3)*调正 ----验证 畸变矫正的效果Genimage (ImageMapped1, Image, ImageAffinTrans, WindowHandle1)dev_clear_window()dev_display(ImageAffinTrans)gen_contour_polygon_xld (Polygon, [452,452], [column,column+0.030/DistanceOnePixel])dev_set_color('red')dev_set_line_width(1)gen_cross_contour_xld(Cross1, 451, column, 46, 0.785398)gen_cross_contour_xld(Cross2, 451, column+0.030/DistanceOnePixel, 46, 0.785398)disp_message (WindowHandle, '30cmm', 'window', 205, 195, 'red', 'false')dev_display (Polygon)dev_display (Cross1)dev_display (Cross2)disp_continue_message (WindowHandle, 'black', 'true')stop()
endfor
三大函数
* 1.内参标定 CamParam, PoseCalib
* read_cam_par ('cam.dat', CamParam)* 标定文件名
CaltabName := 'caltab_30mm.descr'
* [Focus,Kappa,Sx,Sy,Cx,Cy,Width,Height]
StartCamPar := [0.008, 0, 4.8e-006, 4.8e-006, 640, 512, 1280, 1024]
*创建标定数据模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机类型并初始化标定数据模型里的摄像机内部参数
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*为校正模型指定校正文件
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
NumImages := 12list_image_files('./图片', 'default', [], ImageFiles)for i := 0 to NumImages by 1*读取图像read_image (Image, ImageFiles[i])*显示图像dev_display (Image)gen_rectangle1(Rectangle, 1, 1, 1024,1280)reduce_domain(Image, Rectangle, ImageReduced1)min_max_gray ( ImageReduced1, Image, 5, Min, Max, Range)scale_image (Image, ImageScaled, 255 / Range, -Min * 255 / Range)*获取校正板内边框以内的区域find_caltab (ImageScaled, Caltab, CaltabName, 3, 112, 5)*设置输出对象显示颜色dev_set_color ('green')*显示校正板内边框以内的区域dev_display (Caltab)*提取出图像中MARK点的位置并计算出摄像机外部参数find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, \128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)*设置输出对象显示颜色dev_set_color ('red')*显示MARK点的位置disp_circle (WindowHandle1, RCoord, CCoord, gen_tuple_const(|RCoord|,2.5))dev_set_part (0, 0, Height-1, Width-1)*收集观察数据set_calib_data_observ_points (CalibDataID, 0, 0, i, RCoord, CCoord, 'all', StartPose)
* stop()
endfor
dev_update_time ('on')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
*开始校正摄像机 [-2.76405e-05, -7.47002e-06, 0.0684394, 10.0298, 5.70187, 358.571, 0]
calibrate_cameras (CalibDataID, Error)
*获取优化以后的摄像机内部参数
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
******保存相机内参,且该函数只能保存内参***
write_cam_par(CamParam,'cam.dat')
****************************
*获取优化以后的校正对象姿势,相对于当前参考相机。
get_calib_data (CalibDataID, 'calib_obj_pose', [0,0], 'pose', PoseCalib)
write_pose(PoseCalib, 'poseOrigin.dat')
return ()
*2.单像素对应距离 DistanceOnePixel
*矫正后再测量
*选取两个像素点 2个点求距离
Image_X1:=100
Image_Y1:=100Distance_XY:=500
Image_X2:=Image_X1+Distance_XY
Image_Y2:=Image_Y1+Distance_XYgen_cross_contour_xld(Cross1, Image_X1, Image_Y1, 46, 0.785398)
gen_cross_contour_xld(Cross2, Image_X2, Image_Y2, 76, 0.785398)
*考虑标定板厚度的影响 PoseNewOrigin在这里
*[0.0209422, -0.0257558, 0.56891, 7.69086, 10.9034, 359.249, 0]* 0 旋转轴种类
* pose1:=[0,0,0.003,0,0,0,0]
* pose_compose(PoseCalib,pose1,PoseCompose1)* 0.003 标定板的厚度 3mm 0.003m
set_origin_pose(PoseCalib,0,0,0,PoseNewOrigin)
*将像素坐标转化为世界坐标(单位m)
image_points_to_world_plane(CamParam, PoseNewOrigin, Image_Y1, Image_X1, 'm', World_X1, World_Y1)
image_points_to_world_plane(CamParam ,PoseNewOrigin, Image_Y2, Image_X2, 'm', World_X2, World_Y2)*******************************************************************************************
*计算世界坐标距离
distance_pp(World_Y1, World_X1, World_Y2, World_X2, DistanceWorld)
*计算像素坐标
distance_pp(Image_X1,Image_Y1,Image_X2,Image_Y2,DistanceImage)*每个像素对应的世界坐标距离
DistanceOnePixel:=DistanceWorld/DistanceImage
return ()
*3.求偏离值 把图像移动到正中间!
WindowHandle1Out := WindowHandle1disp_3d_coord_system (WindowHandle1Out, CamParam, PoseNewOrigin, 0.05)*调整世界坐标到中心偏移量
OffSetX:=(Width/2)*DistanceOnePixel
OffSetY:=(Height/2)*DistanceOnePixel*
*************************************************************3.图像转换****************************************************************************
*这张图 是 世界坐标系的参考姿态图 ,与外参demo 中游标卡尺的坐标系是类似的作用*调整相机外参
*假如需要重新拍一张图 ,这个图 与世界坐标系 的姿态一致。由于是平面,不考虑 x y 的变化,只考虑z方向角度的变化。
*所以这里是第5个值 需要替换 ,RZ
*PoseCalibRot 是机器人的坐标系set_origin_pose (PoseNewOrigin, -OffSetX, -OffSetY, 0, PoseNewOriginFinal)return ()
相关文章:
13:图像处理—畸变矫正详解
1.制作标定板和描述文件 (用PS软件打印) * 0.00375 mark 点间距 , 不是 点的直径//倒数第二个就是描述文件 gen_caltab(7,7,0.00375,0.5,caltab_30mm.descr,30-30.ps) * 1 比 1 打印 。Photoshop 格式 2.把标定板调正 调正的目的是为了…...
Prompt compress 技术探究-LLMLingua
Prompt summary:是通过精心设计的提示词(prompt)引导大型语言模型(如 GPT-4)生成特定风格或结构的摘要。其目标不仅是压缩信息,还包括满足特定的格式要求、风格偏好或任务需求,所以和一般的文本…...
Python|Pyppeteer实现自动登录小红书(32)
前言 本文是该专栏的第32篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 本文中,笔者以小红书为例,基于Pyppeteer实现自动登录“小红书”。 需要注意的是,对Pyppeteer不太熟悉的同学,可往前翻阅本专栏前面介绍的Pyppeteer知识点,本专栏将带你了解并熟练使…...
Milvus(13):自定义分析器、过滤器
1 自定义分析器 1.1 标准标记符 Milvus 中的standard 令牌分割器根据空格和标点符号分割文本,适用于大多数语言。要配置使用standard 令牌转换器的分析器,请在analyzer_params 中将tokenizer 设置为standard 。 analyzer_params {"tokenizer&quo…...
调试Cortex-M85 MCU启动汇编和链接命令文件 - 解题一则
调试Cortex-M85 MCU启动汇编和链接命令文件 - 解题一则 苏勇 Andrew, 2025-05 最近在Keil中调试一款新的Cortex-M85内核MCU的SDK代码时,从原有其它芯片的工程中引入了汇编语言编写的启动代码和配套的sct文件,结果总是报错,清理到最后&#…...
SpringMVC——第五章:视图View
一、SpringMVC中视图的实现原理 1.Spring MVC视图支持可配置 在Spring MVC中,视图View是支持定制的,例如我们之前在 springmvc.xml 文件中进行了如下的配置: <!--视图解析器--> <bean id"thymeleafViewResolver" class…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.4 数据重复与去重(IDENTITY COLUMN/UNIQUE约束)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据分析实战:数据质量分析之数据重复与去重(IDENTITY COLUMN/UNIQUE约束)3.4 数据重复与去重3.4.1 数据重复的影响与识别3.4.…...
数据分析之药物-基因-代谢物
记录一下最近的数据分析过程: 假如我有一个Dataframe,有两列[Drug, Gene],我想构造一个矩阵,行名为Drug,列名为Gene,值为0或者1,其中0表示药物的靶点是该基因,0表示不是靶点。 &am…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 缺失值检测与处理全攻略:NULL值填充与删除策略实战3.2 缺失值检测与处理3.2.1 缺失值类型与业务影响3.2.1.1 缺失值的三种形态3.2.1.2 业务影响分级 3.2.2 缺失值…...
科普简洁版:同态加密——密码学的未来瑰宝
文章目录 一、同态加密的基本概念1.1 什么是同态加密1.2 同态加密的数学本质1.3 同态加密的类型 二、主要同态加密方案详解2.1 ElGamal加密2.2 Paillier加密2.3 Gentry的完全同态加密方案2.4 BGV方案2.5 BFV方案2.6 CKKS方案 三、同态加密的关键技术3.1 噪声管理技术3.2 多项式…...
时序分解 | Matlab基于WOA-MVMD鲸鱼算法优化多元变分模态分解
时序分解 | Matlab基于WOA-MVMD鲸鱼算法优化多元变分模态分解 目录 时序分解 | Matlab基于WOA-MVMD鲸鱼算法优化多元变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 WOA-MVMD鲸鱼算法优化多元变分模态分解时间序列信号分解 可直接运行 分解效果好 适合作为创…...
模型部署与提供服务
工具准备 FastApi (提供接口服务) LLamafactory(模型测试) AutoDL-SSH(隧道工具) 结构目录 app ├── api.sh ├── lawbot_infer.py ├── main.py ├── models.py ├── prompts │ ├── chat.jinja2 │ ├── prediction.jinja2 │…...
【Linux】深入理解程序地址空间
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是程序地址空间 二、深入理解程序地址空间 1. 引例 2. 理解地址转化 3. 再谈程序地址空间 4. 补充知识 总结 前言 在现代操作系…...
基于AWS Marketplace的快速解决方案:从选型到部署实战
1. 引言:为什么选择AWS Marketplace? 在数字化转型的背景下,企业需要快速获取成熟的软件工具和服务以降低开发成本。AWS Marketplace 作为亚马逊云科技的官方应用商店,提供超过万款预配置的第三方和AWS原生解决方案,涵…...
Android 常用输入控件
一 控件名称 TextView二 示例代码 <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.a…...
ubuntu修改时区和设置24小时格式时间
这里写目录标题 一、修改时区二、设置24小时格式时间endl 一、修改时区 使用timedatectl命令更改当前时区为东八区[rootubuntu24-16:~]# timedatectl list-timezones | grep -i shanghai Asia/Shanghai [rootubuntu24-16:~]# timedatectl set-timezone Asia/Shanghai [rootubu…...
Android之Button、ImageButton、ChipGroup用法
一 控件名称及UI代码 Button、ImageButton、ChipGroup <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app=&qu…...
【中间件】brpc_基础_用户态线程中断
bthread之用户态线程中断 源码 1 简介 interrupt_pthread 核心功能是 通过信号机制中断阻塞的 pthread 线程,以实现线程的协作式中断。 2 核心功能与设计 2.1 信号选择与注册 信号选择:使用 SIGURG 作为中断信号。 原因:SIGURG 通常用于…...
MATLAB中tabulate函数——先验概率的简单估计
load fisheriris X meas(:,1:2); Y species; labels unique(Y); tabulate(Y)ValueCountPercentsetosa5033.33%versicolor5033.33%virginica5033.33%...
修复笔记:SkyReels-V2 项目中的 torch.load 警告
#工作记录 一、问题描述 在运行项目时,出现以下警告: FutureWarning: You are using torch.load with weights_onlyFalse (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pic…...
[特殊字符] 人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总) [特殊字符]
Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 所谓 "语言模型",就是只用来处理语言文字(或者符号…...
自监督学习(Self-supervised Learning)李宏毅
目录 Self-supervised Learning简介: BERT : How to use BERT case1:sequence to class 语言积极性OR消极性判断 case2:sequence to sequence句子中的词语词性标注 case3:sequence2 to class两个句子是不是一个为前提一个为…...
数字化时代下,软件测试中的渗透测试是如何保障安全的?
在如今数字化与信息化的时代,软件测试中存在渗透测试,其位置十分重要,它借助模拟恶意攻击的方式,去发现软件系统所存在的漏洞以及安全问题,这是保障软件安全的关键环节,接下来我会对它的各个方面进行详细介…...
内容中台的AI中枢是什么?
智能算法与知识图谱融合引擎 现代内容中台的核心竞争力在于智能算法与知识图谱的深度融合,这种技术组合构建了动态演化的认知网络。通过将机器学习模型与领域知识图谱进行耦合,系统不仅能识别文本、图像、视频等多模态数据的关联特征,还能实…...
PostgreSQL 的 REINDEX 命令
PostgreSQL 的 REINDEX 命令 REINDEX 是 PostgreSQL 中用于重建索引的重要命令,它可以解决索引损坏、索引膨胀或性能下降等问题。 一 REINDEX 基本语法 -- 重建单个索引 REINDEX [ ( option [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] name REIND…...
GNOME扩展:Bing壁纸
难点 网络请求(Soup) 下载文件(Soup) 读写设置(Gio.Settings) 源码 import GLib from "gi://GLib"; import Gio from gi://Gio; import St from gi://St; import Soup from gi://Soup;import { Extension } from resource:///org/gnome/shell/extensions/extens…...
BUUCTF——Fake XML cookbook
BUUCTF——Fake XML cookbook 进入靶场 只有一个登录框 先弱口令万能密码试一下吧 弱口令和万能密码都失败了 找其他突破口 F12看看 发现xml代码 function doLogin(){var username $("#username").val();var password $("#password").val();if(user…...
【数据结构】线性表--链表
【数据结构】线性表--链表 一.前情回顾二.链表的概念三.链表的实现1.链表结点的结构:2.申请新结点函数:3.尾插函数:4.头插函数:5.尾删函数:6.头删函数:7.在指定结点之前插入:8.在指定结点之后插…...
2022年第十三届蓝桥杯省赛B组Java题解
2022年第十三届蓝桥杯省赛B组Java题解 个人心得: 2022年蓝桥杯省赛Java B组共包含10道题目,其中填空题2道(A、B),编程题8道(C-J)。题目覆盖数论、字符串处理、动态规划、数据结构等核心知识点…...
【操作系统】死锁
1. 定义 死锁是指两个或多个进程(或线程)在执行过程中,因争夺资源而造成的一种僵局,每个进程都无限期地等待其他进程释放它们所持有的资源。在这种情况下,没有任何进程能够继续执行,除非有外部干预。 2. …...
Ubuntu22.04及以上版本buildroot SIGSTKSZ 报错问题
本文提供一种解决 Buildroot SIGSTKSZ 报错途径 解决途径来源参考:Buildroot error when building with Ubuntu 21.10 其出现原因在于 GNU C Library 2.34 release announcement: Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _DYNAMIC_STACK_SIZE_SOU…...
postgresql数据库基本操作
1. 连接 PostgreSQL 数据库 首先,使用 psql 命令行工具连接到数据库。如果是本地连接,命令格式如下: psql -U postgres -d <数据库名称> -h <主机地址>其中: -U postgres:表示以 postgres 用户身份登录…...
【运维】构建基于Python的自动化运维平台:用Flask和Celery打造高效管理工具
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着企业IT基础设施的复杂性不断增加,手动运维已无法满足高效管理的需求。本文详细介绍如何基于Python构建一个自动化运维平台,利用Flask…...
ES6入门---第三单元 模块三:async、await
async function fn(){ //表示异步:这个函数里面有异步任务 let result await xxx //表示后面结果需要等待 } 读取文件里数据实例: const fs require(fs);//简单封装 fs封装成一个promise const readFile function (fileName){return…...
洛谷 P2866 [USACO06NOV] Bad Hair Day S
题目描述 农夫约翰有 N 头奶牛正在过乱头发节。 每一头牛都站在同一排面朝右,它们被从左到右依次编号为 1,2,⋯,N。编号为 i 的牛身高为 hi。第 N 头牛在最前面,而第 1 头牛在最后面。 对于第 i 头牛前面的第 j 头牛,如果 hi>hi1…...
TS 变量类型生成
TS简单类型注解 let count:number 15 let myName:string MIO let isLoading:boolean false let a:null null let b:undefined undefined let s:symbol Symbol()console.log(hello ts)TS数组类型 数组类型两种写法: 问题:数组中只能存在单一类型数…...
工业大模型:从设备诊断到工艺重构
引言 工业大模型正在引发制造业认知革命。据埃森哲研究,到2026年全球工业大模型市场规模将突破280亿美元,其中工艺优化应用占比达42%。本文将系统解析工业大模型的"预训练-领域适配-应用落地"技术路径,并通过设备健康诊断与工艺参数生成的实践案例,展示如何构建…...
【项目篇之统一内存操作】仿照RabbitMQ模拟实现消息队列
我们的操作分为两种,一种是在内存上进行统一的操作,一种是在硬盘上面操作,今天我写的文章是编写了一个MemoryDataCenter类来实现了 在内存上面的统一操作: 实现统一内存操作 如何使用内存来组织数据 创建一个类来统一管理内存上的…...
强化学习机器人模拟器——GridWorld:一个用于强化学习的 Python 环境
GridWorld 是一个为强化学习(Reinforcement Learning, RL)实验设计的多功能 Python 环境。它提供了一个可定制的二维网格,智能体(agent)需要从起始位置导航到目标位置,避开障碍物、穿越泥泞单元格并收集奖励。本篇博客将详细介绍 grid_world.py 代码中实现的 GridWorld 环…...
DeepSeek Copilot idea插件推荐
🌌 DeepSeek Copilot for IntelliJ IDEA 让 AI 成为你的编程副驾驶,极速生成单元测试 & 代码注释驱动开发! 🚀 简介 DeepSeek Copilot 是一款为 IntelliJ IDEA 打造的 AI 编程助手插件,它能够智能分析你的代码逻辑…...
vue-cropper实现图片裁剪
一、什么是vue-cropper? Vue-Cropper 是一个基于 Vue.js 的图片裁剪组件库,专为 Web 应用设计。当你在网上搜索的时候发现还有一个叫cropper的库,下面是他们的区别: 特性cropper.jsvue-cropper框架依赖纯 JavaScript&am…...
MPI,Pthreads和OpenMP等并行实验环境配置
(假设你已按照文档前面的步骤正确安装了 VMware 和 Ubuntu 20.04) 第一部分:安装 C/OpenMP/Pthreads 环境(修正后) 打开终端: 在 Ubuntu 中启动终端应用程序。 更新软件包列表: sudo ap…...
Spring AI Advisors API:AI交互的灵活增强利器
Spring AI Advisors API:AI交互的灵活增强利器 前言 在当今的软件开发领域,随着人工智能技术的飞速发展,将AI融入应用程序变得越来越普遍。Spring AI作为一个强大的框架,为开发者提供了便捷的方式来实现这一目标。其中的Advisor…...
排序功法入门指南【江湖算法笔记】
话说江湖风云变幻,各路英雄好汉行走江湖,总得有个名号排行。若问“东邪西毒南帝北丐”谁强谁弱,总得排个座次不是?这排序之道,恰似武功秘籍,练好了能号令群雄,练岔了怕是要被笑掉大牙࿰…...
Free Draft Model!Lookahead Decoding加速大语言模型解码新路径
Free Draft Model!Lookahead Decoding加速大语言模型解码新路径 大语言模型(LLMs)在当今AI领域大放异彩,但其自回归解码方式锁死了生成效率。本文将为你解读一种全新的解码算法——Lookahead Decoding,它无需Draft Mo…...
Spring AI 实战:第八章、Spring AI Tool Calling之与时俱进
引言:AI的"知识截止日期"尴尬 如果你想问大模型"明天是星期几?",猜猜TA会怎么答复你~ @GetMapping("/tools/simple/test") public String simpleTest() {return chatClient.prompt...
PyTorch数据集与数据集加载
PyTorch中的Dataset与DataLoader详解 1. Dataset基础 Dataset是PyTorch中表示数据集的抽象类,我们需要继承它并实现两个关键方法: from torch.utils.data import Datasetclass CustomDataset(Dataset):def __init__(self, data, labels):""…...
探秘 Git 底层原理:理解版本控制的基石
Git 是一款开源的分布式版本控制系统,在软件开发领域广泛应用,能有效管理项目的版本变更,Git 已经成为了版本控制的代名词。日常使用中,我们通过git commit提交代码,用git push推送变更,这些便捷操作背后&a…...
chili3d调试10 网页元素css node deepwiki 生成圆柱体 生成零件图片
.input是input的外框,.input input是input的内框 沙雕 全部input都换成textarea了 自己的方法用接口定义,把自己的方法pub出去,定义在内部拉出去只是取个值 这其实是mainwindow端pub回来的 窗口pub端把数据pub回 mainwindow端让mainwindow端…...
【计网】互联网的组成
回顾: 互联网(Internet):它是一个专有名词,是一个特定的互连网,它是指当下全球最大的、最开放的、由众多网络相互连接而形成的特定的的互连网,采用TCP/IP协议族作为通信规则。 一、互联网的组成部分 从互联网的工作方…...