当前位置: 首页 > news >正文

双目立体视觉

文章目录

      • 1,前言
      • 2,原理
      • 3,组成部分
        • 3.1,数字图像采集。
        • 3.2 ,相机标定。
        • 3.3,图像预处理与特征提取。
        • 3.4 ,图像校正。
        • 3.5 ,立体匹配。
        • 3.6 ,三维重建。
      • 4,主要的算子。
        • 4.1,get_calib_data
        • 4.2,gen_binocular_rectification_map
      • 5,代码:
      • 6,效果

1,前言

双目立体视觉的开创性工作始于20世纪的60年代中期,美国MIT的Roberts通过从数字图像中提取立方体,楔形体和菱柱体等简单规则多面体的三维结构,对对物体的形状和空间关系进行描述,把过去的简单二维图像分析推广到复杂的三维场景,标志着立体视觉的诞生。双目立体视觉是立体视觉的一种重要形式,具有效率高,精度合适、系统结构简单、成本低等优点,非常适合于制造现场的在线,非接触式产品检测和质量控制。

2,原理

人之所以感受到立体视觉,是因为人的左右眼之间有6-7cm的间隔,因此左眼和右眼看到的影像会有细微的差别,所以我们很容易判断物体的远近,以及多个物体的前后关系。双目视觉的基本原理和人眼观察世界的方式类似,双目立体视觉获取图像是通过两个不同位置的相机或者一台相机通过旋转、平移拍摄同一个场景,来获取立体图像对。

假定两个相机平行放置并且相机的内部参数相同,世界坐标系中被观测目标上的任意一点 P ( x w , y w , z w ) P(x_w,y_w,z_w) P(xw,yw,zw),在左相机坐标系中的投影点为 p ( u L , v L ) p(u_L,v_L) p(uL,vL),在右相机坐标系中相面上的投影点为 p ( u R , v R ) p(u_R,v_R) p(uR,vR)。若仅用一个相机的单目视觉系统观察,只能获知点 P ( x w , y w , z w ) P(x_w,y_w,z_w) P(xw,yw,zw)可能位于左相机光心OL与点 p ( u L , v L ) p(u_L,v_L) p(uL,vL)所构成的射线上,或位于右相机光心OR与点 p ( u R , v R ) p(u_R,v_R) p(uR,vR)所构成的射线上。但是若同时用两个相机的双目视觉系统观察,并且如果能确定像点 ( u L , v L ) (u_L,v_L) (uL,vL) ( u R , v R ) (u_R,v_R) (uR,vR)对应位于同一空间特征点 P ( x w , y w , z w ) P(x_w,y_w,z_w) P(xw,yw,zw),就可以通过两个像点与相机光心所构成的两直线的交点计算出点 P ( x w , y w , z w ) P(x_w,y_w,z_w) P(xw,yw,zw)的确切位置。
在这里插入图片描述

3,组成部分

一个完整的双目立体视觉系统通常可分为六部分,如下:

3.1,数字图像采集。
3.2 ,相机标定。

对双目立体视觉而言,对他们的标定是实现立体视觉基本而又关键的一步。通常先采用单目相机的标定方法,分别得到两个相机的内外参,再通过同一世界坐标中的一组定标点来建立两个相机之间的位置关系。双目相机标定需要注意以下几个方面。

  • 相机安装的位置应考虑与被测物体的距离。两个相机之间的基线间距越大,可测距离就会越远。
  • 相机位置确定后,应将两个相机固定。除了相对位置需要固定外,两个相机还应当处于完全一致的水平面,同时避免发生相对旋转与前后位置偏差。在标定及实际测量过程中,应保证相机平台的水平位置,相机之间的相对位置及相机焦距不再发生变化。
  • 将标定板放置在两个相机都能够完全拍到的位置上。在给标定板变动位姿时应注意,无论无何如何移动,两个相机都应能看到所有标记点。
  • 两个相机的光照环境应尽可能一致。如果因为光线的干扰造成两个相机画面一明一暗,可能会影响匹配的效果,因此应注意调节光线。
3.3,图像预处理与特征提取。
3.4 ,图像校正。

标定结束后,可以使用双目相机拍摄被测物体,获取立体图像对。此时注意不要改变相机的内部参数和位姿,避免相机内部参数和外部参数失效。

双目相机拍摄的图像也会有单目相机图像可能出现的畸变,此外还可能会由于双目立体视觉平台固定的细微偏差,造成两张图像水平不一致。这种情况非常常见,可以通过对图像进行畸形矫正、旋转平移和行对齐等调整,使两张图中的特征点处于同一位置上。

在halcon中可以使用gen_binocular_rectification_mapmap_image算子实现立体图像对的校正。其中gen_binocular_rectification_map算子用于生成一个映射关系,该算子需要传入通过标定得到的相机内参和双目相机的相对位置关系(外部参数),然后输出两个图像的的映射图MapL和MapR并将输出结果传递给map_image算子。

由此可以获得相机校正后的图像对。校正后,两张图对应同一特征点的像素应当处于同一水平位置,确切的说,就是图像坐标系中的行坐标相同。这是为下一步立体匹配和提取视差做准备,因为立体匹配是取参考图像中点坐在的行,在另一张图像中的同一行进行搜索对应的像素。因此,校正图像是匹配成功的前提。如果标定效果不好,也将体现在校正图像上。如果校正后图像不够水平,或者有缺失、视野扩大等其他明显异常,则可以考虑重新对双目相机进行标定。

3.5 ,立体匹配。

为了获得测量对象的深度信息,需要先求出立体图像对的视差图,这就需要对校正后的图像进行立体匹配。立体匹配是双目视觉的关键、困难的一步。与普通的图像匹配不同,立体像对之间的差异是由相机观察点的不同引起的,而不是由其他如景物本身的变化、运动而引起。

立体匹配的原理是,通过找到一张图(如左视点图)的特征点,并且在对应的另一张图(如右视点图)中搜索该点,从而获得该点的坐标和灰度。

在halcon中可以使用binocular_disparity算子进行立体匹配并生成视差图。

binocular_disparity (ImageRec1,ImageRec2 , Disparity, Score, 'ncc', MaskWidth, MaskHeight, TextureThresh, MinDisparity, MaxDisparity, NumLevels, ScoreThresh, Filter, SubDisparity)
参数类型参数名作用
输入参数ImageRect1校正后的左视图(单通道灰度图像),作为参考图像。
ImageRect2校正后的右视图(单通道灰度图像),作为检测图像。
输出参数Disparity视差图(16位整数/浮点类型)。视差图像中坐标为(x,y)的点的灰度值,对应于参考图像中坐标为(x,y)的点的灰度值与检测图像中对应该坐标点的灰度值之差。
Score输出的匹配分值图像,包含参考图像上每个点的匹配最佳结果。
控制参数Method匹配算法:'correlation'(相关法)或'ncc'(归一化互相关)
MaskWidth/Height匹配窗口尺寸(推荐奇数,如15×15)
Min/MaxDisparity视差搜索范围(MaxDisparity需设为负值,如-150)
TextureThresh表示搜索窗内灰度值的最小统计分布,这对纹理比较少的局部区域有用。
ScoreThresh匹配分数的阈值,即视差图像中仅包含匹配分值超过该阈值的点,指的注意的是,选择不同的匹配方法,阈值的取值范围也不同。
3.6 ,三维重建。

三维重建的目的是由二维景物图像重构出景物的三维结构。在得到视差图像,如果要进行三维重建,可以使用一些算子计算其三维坐标。例如使用disparity_to_point_3d算子计算选定的视差图中的点的三维坐标,也可以使用disparity_image_to_xyz算子将整张视差图转换为3D点云图。

立体视觉三维建模流程

视差图
左图像
极线矫正
右图像
矫正后的左图像
矫正后的右图像
立体匹配
三角化
三维模型

4,主要的算子。

4.1,get_calib_data

get_calib_data (CalibDataID, 'camera', 1, 'pose', cLPcR) 用于从校准数据模型中提取特定相机的位姿信息.


1. 功能说明

  • 作用‌:获取索引为 1 的相机在参考坐标系(通常为索引 0 的相机坐标系)下的位姿参数(平移向量与旋转矩阵),即该相机的 外参
  • 应用场景‌:双目或多目系统中计算相机间的相对位姿,用于立体匹配、3D重建等任务。

2. 参数解析

参数说明
CalibDataIDcreate_calib_data 创建的校准模型句柄
'camera'ItemType 类型标识符,表示操作对象为相机参数
1ItemIdx 索引号,指定要查询的相机编号(例如双目系统中 0 代表左相机,1 代表右相机)
'pose'DataName 标识符,表示要获取的数据类型为位姿(包含平移和旋转参数)
cLPcR返回值变量,存储相机位姿的转换矩阵(参考坐标系 → 相机坐标系)

3. 返回值解释

  • 坐标转换‌:cLPcR 表示从参考坐标系到相机坐标系的齐次变换矩阵(形式为 [R|t]),用于将参考坐标系中的点转换为相机坐标系中的点。
    变换方向:
    • 若参考坐标系为世界坐标系(WCS),则 cLPcR 表示相机的外参(WCS → CCS)。
    • 若参考坐标系为另一台相机(如双目系统中的左相机),则 cLPcR 描述双目系统的基线位姿。

4. 典型调用流程

  1. 模型创建‌:create_calib_data 创建校准模型,并设置相机初始参数和标定板数据。
  2. 标定执行‌:调用 find_marks_and_pose 提取标定点,再通过 calibrate_cameras 完成标定。
  3. 数据提取‌:执行 get_calib_data 查询标定后的相机位姿参数。

5. 注意事项

  • 数据有效性‌:仅在完成 calibrate_cameras 后调用此操作符才能获取有效位姿数据。

  • ‌ 坐标系定义:

    • 默认参考坐标系为索引 0 的相机坐标系,可通过校准模型配置修改参考坐标系。
    • 位姿中的旋转参数遵循 HALCON 的旋转顺序(通常为 ZYX 欧拉角)。
  • 标定板补偿‌:若需要校正标定板厚度对位姿的影响,可使用 set_origin_pose 调整原点位置。


4.2,gen_binocular_rectification_map

是 HALCON 中用于双目相机图像校正的核心算子,旨在生成两相机的几何映射图,使极线对齐,简化立体匹配和三维重建流程。


1. 功能与输入输出

  • 核心功能‌:根据双目系统的内参和外参,生成图像到公共整流平面的映射图(Map1Map2),确保校正后图像的极线水平对齐。

  • ‌ 输入参数:

    • CamParam1CamParam2:双目相机的标定内参(包括畸变参数),需通过 calibrate_cameras 标定获得。
    • RelPose:相机 2 相对于相机 1 的外参(平移和旋转矩阵),由标定过程计算得出28。
    • SubSampling:下采样比例(默认 1:1),用于优化计算效率。
    • Method:校正方法(如 geometricphotometric),决定算法的精度和速度。
    • MapType:映射类型(如 coord_map_sub_pix),定义输出映射图的坐标系表示形式。
  • ‌ 输出参数:

    • Map1Map2:双目相机的校正映射图,用于后续 map_image 的图像校正。
    • CamParamRect1CamParamRect2:校正后的相机内参(调整后的焦距、主点等)。
    • CamPoseRect1CamPoseRect2:校正后相机在公共坐标系下的位姿。

2. 典型应用流程

  1. 双目标定
    使用 calibrate_cameras 标定双目系统,获取 CamParam1CamParam2RelPose28。

  2. 生成映射图
    调用 gen_binocular_rectification_map,输入标定参数生成映射图:

  3. 图像校正
    利用 map_image 将原始图像校正至公共坐标系:

  4. 立体匹配与深度计算
    通过 binocular_disparity 计算视差图,结合 disparity_to_distance 转换为深度信息。


3. 关键注意事项

  • 参数精度要求‌:输入的内参(CamParam1/2)和外参(RelPose)需精确,否则会导致极线未对齐,影响视差匹配结果。
  • 极线约束‌:校正后图像中的对应点位于同一水平线,确保立体匹配仅需在水平方向搜索匹配点。
  • 畸变处理‌:若原始图像已进行畸变校正,需通过 change_radial_distortion 调整标定参数后再使用本算子。
  • 性能优化‌:通过 SubSampling 参数降低分辨率(如设置为 2),可提升计算速度,但可能导致精度下降。

5,代码:

* 参考案例库:board_components.hdev* 通过双目立体视觉提取主板不同高度的元器件
* 
* -------------------------------------------------------
* (1)           双目立体相机标定
* 
dev_update_off ()
* Set the image path (make sure, that you have set HALCONIMAGES to the HALCON image directory)
ImgPath := 'stereo/board/'
CalDescrFile := 'caltab_30mm.descr'
* Read the first images to get their size
read_image (ImageL, ImgPath + 'calib_l_01')
read_image (ImageR, ImgPath + 'calib_r_01')
* Reopen the windows with an appropriate size
dev_close_window ()
get_image_size (ImageL, WidthL, HeightL)
dev_open_window (0, 0, WidthL, HeightL, 'black', WindowHandle1)
dev_set_draw ('margin')
dev_set_color ('green')
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
get_image_size (ImageR, WidthR, HeightR)
dev_open_window (0, WidthL + 12, WidthL, HeightL, 'black', WindowHandle2)
dev_set_draw ('margin')
dev_set_color ('green')
set_display_font (WindowHandle2, 14, 'mono', 'true', 'false')
* Calibrate the stereo setup
* (determine the internal and external camera parameters).
* 
* 设置相机内参的初始值
StartCamPar := [0.0125,0,1.48e-5,1.48e-5,WidthL / 2.0,HeightL / 2.0,WidthL,HeightL]
create_calib_data ('calibration_object', 2, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 'all', 'area_scan_division', StartCamPar)* 标定板描述文件:caltab_30mm.descr。
* Distance between mark centers [meter]: 0.00375
set_calib_data_calib_object (CalibDataID, 0, CalDescrFile)
* 
* Read all used calibration images
read_image (ImagesL, ImgPath + 'calib_l_' + [1:15]$'02d')
read_image (ImagesR, ImgPath + 'calib_r_' + [1:15]$'02d')
* 进行双目立体相机标定
* 获取标定后的左右相机内参以及右相机在左相机坐标系的位姿
calibrate_stereo_setup (ImagesL, ImagesR, WindowHandle1, WindowHandle2, CalibDataID, StartCamPar, CalDescrFile, CamParamL, CamParamR, cLPcR, Errors)
* 生成两相机的几何映射图,使极线对齐,简化立体匹配和三维重建的过程
* 映射图用于对图像进行校正,使左右图像共极线
gen_binocular_rectification_map (MapL, MapR, CamParamL, CamParamR, cLPcR, 1, 'geometric', 'bilinear', RectCamParL, RectCamParR, CamPoseRectL, CamPoseRectR, RectLPosRectR)
* 
* 校正左相机图像
map_image (ImagesL, MapL, ImagesRectL)
* 校正右相机图像
map_image (ImagesR, MapR, ImagesRectR)
* 确定校正后的左右图像是否共极线
check_epipolar_constraint (ImagesRectL, ImagesRectR, RectCamParL, RectCamParR, WindowHandle1, WindowHandle2, CalDescrFile, EpipolarError)
if (EpipolarError[1] > 0.3)* 标定的共极线偏差过大disp_continue_message (WindowHandle2, 'black', 'true')stop ()
endif
disp_continue_message (WindowHandle2, 'black', 'true')
stop ()
clear_calib_data (CalibDataID)
* --------------------------------------------------------
* (2)   处理双目立体视觉
* 
* Parameters from above if calibration was not performed:
* CamParamL := [0.0131205,-665.85466,1.4803422e-005,1.48e-005,155.90117,126.703971,320,240]
* CamParamR := [0.0131712,-728.9579,1.4799849e-005,1.48e-005,163.265701,119.310684,320,240]
* cLPcR := [0.15350044,-0.003732778,0.04481715,0.1736607,319.8612,359.8945,0]
* Define parameter values for binocular_disparity and binocular_distance, respectively.
MaskWidth := 17
MaskHeight := 17
TextureThresh := 5
MinDisparity := 10
MaxDisparity := 40
NumLevels := 1
ScoreThresh := 0.1
* Get stereo image pair
dev_set_window (WindowHandle1)
read_image (ImageL, ImgPath + 'board_l_01')
emphasize (ImageL, ImageL, 7, 7, 1)
* 校正左图像
map_image (ImageL, MapL, ImageRectifiedL)
dev_display (ImageRectifiedL)
dev_set_window (WindowHandle2)
read_image (ImageR, ImgPath + 'board_r_01')
emphasize (ImageR, ImageR, 7, 7, 1)
* 校正右图像
map_image (ImageR, MapR, ImageRectifiedR)
dev_display (ImageRectifiedR)
disp_message (WindowHandle1, '校正左图像', 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle2, '校正右图像', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle2, 'black', 'true')
stop ()
binocular_disparity (ImageRectifiedL, ImageRectifiedR, Disparity, Score, 'ncc', 11, 11, 0, -30, 30, 1, 0.5, 'none', 'none')* 计算校准后立体图像对的距离.
binocular_distance (ImageRectifiedL, ImageRectifiedR, DistanceImage, ScoreImageDistance, RectCamParL, RectCamParR, RectLPosRectR, 'ncc', MaskWidth, MaskHeight, TextureThresh, MinDisparity, MaxDisparity, NumLevels, ScoreThresh, 'left_right_check', 'interpolation')
* Display the distance image
dev_set_window (WindowHandle1)
dev_clear_window ()
dev_display (DistanceImage)
* Correct the distance image for the tilt of the stereo camera system.
*   (Attention: the distance values are not measured
*    in the rectified coordinate system anymore!)
* 定义一个区域,表示参考平面上的三个区域
gen_circle (Circle, [15,208,95], [58,32,211], [8,8,8])
union1 (Circle, RegionDefiningReferencePlane)
tilt_correction (DistanceImage, RegionDefiningReferencePlane, DistanceImageCorrected)
dev_set_window (WindowHandle2)
dev_clear_window ()
dev_display (DistanceImageCorrected)
disp_message (WindowHandle1, 'Distance image', 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle2, 'After tilt correction', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle2, 'black', 'true')
stop ()
MinHeight := -0.0005
MaxHeight := 0.05
* 将距离转换为参考平面上方的高度.
height_range_above_reference_plane (DistanceImageCorrected, HeightAboveReferencePlaneReduced, MinHeight, MaxHeight)
visualize_height_ranges (ImageRectifiedL, HeightAboveReferencePlaneReduced, WindowHandle2, 0.0004, 0.0015, 0.0015, 0.0025, 0.0025, 0.004)
dev_set_window (WindowHandle1)
dev_clear_window ()
dev_display (HeightAboveReferencePlaneReduced)
disp_message (WindowHandle2, 'Segmented components', 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle1, 'Height above reference plane', 'window', 12, 12, 'black', 'true')

6,效果

相机标定: ** 左右相机共极线 **
特征点在左右相机的Row相同
在这里插入图片描述

校正后的左右图像:

在这里插入图片描述
处理结果:标记出指定高度的元器件

在这里插入图片描述

相关文章:

双目立体视觉

文章目录 1,前言2,原理3,组成部分3.1,数字图像采集。3.2 ,相机标定。3.3,图像预处理与特征提取。3.4 ,图像校正。3.5 ,立体匹配。3.6 ,三维重建。 4,主要的算…...

机器人弧焊二八混合气体节约

焊接技术在现代工业生产中作为关键环节之一,其效率和成本直接影响到整个制造流程的经济性与环保性。近年来,随着节能减排理念深入人心,各行业都在积极探索绿色制造方案。在焊接领域,二八混合气体的应用结合WGFACS智能流量调节系统…...

Linux进程通讯和原子性

在Linux系统中,进程间通信(IPC)和原子性是并发编程中的核心问题。以下是对这些概念的详细分步解释: 一、进程间通信(IPC)方法 1. 管道(Pipe) 匿名管道:用于父子进程等有…...

深度学习之用CelebA_Spoof数据集搭建一个活体检测-一些模型训练中的改动带来的改善

实验背景 在前面的深度学习之用CelebA_Spoof数据集搭建一个活体检测-模型搭建和训练,我们基于CelebA_Spoof数据集构建了一个用SqueezeNe框架进行训练的活体2D模型,采用了蒸馏法进行了一些简单的工作。在前面提供的训练参数中,主要用了以下几…...

Oracle APEX IR报表列宽调整

1. 问题:如何调整Oracle APEX IR报表列宽 1-1. 防止因标题长而数据短,导致标题行的文字都立起来了,不好看。 1-2. 防止因数据太长而且中间还没有空格,把列撑开的太宽也不换行,不好看。 2. 解决办法 针对如上问题解…...

6大核心记忆方法

以下是结合脑科学原理和高效学习策略总结的 6大核心记忆方法,帮助你摆脱“学完就忘”的困境: 一、间隔重复与分散学习 遵循艾宾浩斯遗忘曲线:学习后20分钟遗忘58%,1天后遗忘66%。通过设定复习节点(如学后1天、3天、1周…...

conda更换清华源

1、概览 anaconda更换速度更快、更稳定的下载源,在linux环境测试通过。 2、conda源查看 在修改之前可以查看下现有conda源是什么,查看conda配置信息,如下: cat ~/.condarc 可以看到你的conda源,以我的conda源举例&am…...

5月15日星期四今日早报简报微语报早读

5月15日星期四,农历四月十八,早报#微语早读。 1、中国至越南河内国际道路运输线路正式开通; 2、免签国1,中乌(兹别克斯坦)互免签证协定6月生效; 3、杭州“放大招”支持足球发展:足…...

网络损伤仪功能介绍与应用场景剖析

以下是关于 网络损伤仪(Network Impairment Emulator) 的核心功能介绍及其应用场景的详细说明: 一、网络损伤仪的核心功能 带宽限制(Bandwidth Throttling) 模拟不同网络带宽(如从1Mbps到10Gbps&#xff09…...

超时检测机制和心跳包机制(Heartbeat)

一、超时检测机制 1. I/O 函数超时设置 1.1 select/poll/epoll 的超时参数 select c struct timeval timeout {3, 0}; // 3秒超时 int n select(maxfd1, &readfds, NULL, NULL, &timeout); if (n 0) printf("select timeout\n"); // 超时无事件poll c …...

经典卷积神经网络

目录 经典卷积神经网络 一、卷积神经网络基础回顾 二、LeNet:开启 CNN 先河 三、AlexNet:突破性进展 四、ZFNet:继承与优化 五、GoogLeNet:引入 Inception 模块 六、VggNet:深度与简单结构的融合 七、ResNet&a…...

Reactor模型详解与C++实现

Reactor模型详解与C实现 一、Reactor模型核心思想 Reactor模式是一种事件驱动的并发处理模型,核心通过同步I/O多路复用实现对多个I/O源的监听,当有事件触发时,派发给对应处理器进行非阻塞处理。 关键特征: 非阻塞I/O&#xff…...

观测云产品更新 | 安全监测、事件中心、仪表板AI智能分析等

观测云更新 安全监测 新增 SIEM 功能模块:实时分析企业各类系统(如服务器、应用、网络设备)的日志和事件数据,自动发现潜在威胁,帮助团队迅速定位异常,充分发挥安全监控中枢的作用。 注意:目…...

【HTML】个人博客页面

目录 页面视图​编辑 页面代码 解释&#xff1a; HTML (<body>): 使用了更加语义化的HTML5标签&#xff0c;例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹&#xff0c;结构清晰。添加了分页导航。使用了Font…...

OrangePi Zero 3学习笔记(Android篇)10 - SPI和从设备

目录 1. 配置内核 2. 修改设备数 3. 修改权限 4. 验证 Zero 3的板子有2个SPI Master接口&#xff0c;其中SPI0接的是板载16MB大小的SPI Nor Flash&#xff0c;SPI1则是导出到26pin的接口上。 spi和i2c有点不同&#xff0c;spi是直接生成spi虚拟设备&#xff0c;所以在dev里…...

《Java 大视界——Java 大数据在智能电网分布式能源协同调度中的应用与挑战》

随着风电、光伏等分布式能源大规模接入电网&#xff0c;传统调度系统面临数据规模激增、响应延迟显著、多源异构数据融合困难等核心问题。本文聚焦Java生态下的大数据技术体系&#xff0c;深入探讨其在智能电网实时监测、负荷预测、资源优化配置等场景中的落地实践。通过分析Sp…...

基于正点原子探索者开发板的简易音乐播放器

1、概述 本次实验的名称叫做“基于正点原子探索者开发板的简易音乐播放器”。本实验的功能框图如下&#xff1a; 从图上我们可以清晰的看到本实验所需的实现的功能、以及每个功能需要怎么实现。 这次实验使用的是正点原子的探索者开发板&#xff0c;此开发板采用的MCU是STM32F4…...

【CF】Day59——Codeforces Round 914 (Div. 2) D

D. Set To Max 题目&#xff1a; Easy 思路&#xff1a; 简单题 由于题目的数据给的很小&#xff0c;所以我们可以用 n 的复杂度过&#xff0c;那我们来观察一下我们应该怎么操作 显然&#xff0c;如果 a[i] > b[i] 时是无法构造的&#xff0c;同时 a[i] b[i] 时就不用管…...

【Linux专栏】Linux进程间关系和守护进程

文章目录 1、进程间关系1.1 进程组1.2 组长进程 2、会话&#xff1f;2.1 查看会话2.2 创建会话 3、控制终端4、作业控制4.1 前台/后台进程 5、守护进程5.1 如何创建守护进程&#xff1f;5.2 杀掉守护进程 1、进程间关系 主要描述两个名称概念&#xff1a;即进程组和组长进程。…...

AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比

AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比 核心功能对比 特性PostgreSQL AutoVACUUMOracle GATHER_DATABASE_STATS_JOB_PROC主要目的空间回收 统计信息更新仅优化器统计信息收集底层机制MVCC(多版本并发控制)维护CBO(基于成本的…...

go依赖查询工具之godepgraph(分析main.go的依赖树)

文章目录 go依赖查询工具之godepgraph&#xff08;分析main.go的依赖树&#xff09;什么是服务间的隐式耦合&#xff1f;分析main.go的依赖树方法1. godepgraph (配合 Graphviz 可视化) - 最直观【推荐】方法2. go list go依赖查询工具之godepgraph&#xff08;分析main.go的依…...

市场差分探头信号输出形式的一些因素考量

在5G/6G通信、新能源汽车电控等高频测量场景中&#xff0c;差分探头的信号输出架构直接影响测试系统的信噪比与可靠性。根据IEEE仪器与测量协会2024年度报告&#xff0c;单端输出方案的市场渗透率较2020年提升42%&#xff0c;这一趋势背后蕴含着深刻的技术变革逻辑。 一、核心…...

SQL练习——day01

力扣——SQL练习总结 DENSE_RANK()窗口函数 这是排名函数的一种&#xff0c;它在处理相同值时&#xff0c;会给相同的值分配相同的排名&#xff0c;并且后续的排名不会跳过。比如有三个分数并列第一&#xff0c;那么它们的排名都是 1&#xff0c;接下来的分数排名就是 2&#…...

断点续传使用场景,完整前后端实现示例,包括上传,下载,验证

断点续传在多个场景中非常有用&#xff0c;包括但不限于大文件上传、跨国或跨区域文件传输、移动设备文件传输、备份和同步以及软件更新等。接下来&#xff0c;我将为你提供一个基于Java的后端实现示例&#xff0c;结合前端逻辑来完成整个断点续传的功能&#xff0c;包括上传、…...

Xinference推理框架

概述 GitHub&#xff0c;官方文档。 核心优势 性能优化&#xff1a;通过vLLM、SGLang等引擎实现低延迟推理&#xff0c;吞吐量提升2-3倍&#xff1b;企业级支持&#xff1a;支持分布式部署、国产硬件适配及模型全生命周期管理&#xff1b;生态兼容&#xff1a;无缝对接LangC…...

技术更新频繁,团队如何适应变化

构建持续学习机制、引入技术雷达与预研机制、通过敏捷方法快速响应变化、推动跨团队知识协作与传承 是应对技术更新频繁、团队保持适应力的核心策略。其中&#xff0c;构建持续学习机制尤为关键。通过制度化、场景化的学习安排&#xff0c;团队可以主动追踪新技术趋势&#xff…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-MCP大模型上下文解析 我们首先来看一下 整个MCP的一个基本的一个流程&#xff0c;他解决的一个问题。我们回到这里&#xff0c;他解决的一个问题是什么呢&#xff1f;他解决这个问题就是你的大…...

游戏代码混淆的作用与应用分析

1. 防止逆向工程 核心保护对象&#xff1a;游戏引擎、算法&#xff08;如物理模拟、AI行为树&#xff09;、加密逻辑等。实例&#xff1a;Unity游戏使用 ConfuserEx 混淆C#代码&#xff0c;使反编译工具&#xff08;如dnSpy&#xff09;只能显示杂乱命名&#xff0c;难以理解逻…...

信息系统运行管理员:临阵磨枪版

信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料&#xff0c;力求完整覆盖考点细节) 第一部分&#xff1a;基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息&#xff1a; 含义&#xff1a;香农 - 减少随机不确定性的东西&#xff1b…...

PWM(脉宽调制)的配置参数[预分频器\自动重载值]的自动计算

文章目录 前言一、数据结构二、二分法搜索最佳预分频器和自动重载值三、示例 前言 pwm是嵌入式开发过程中很常见的一个模块&#xff0c;而配置pwm的过程中就少不了频率参数的计算&#xff0c;大多数32位机的pwm频率都由时钟、预分频器&#xff08;prescaler&#xff09;、自动…...

manuskript开源程序是面向作家的开源工具

一、软件介绍 文末提供程序和源码下载 manuskript开源程序是面向作家的开源工具&#xff0c;Manuskript 可在 GNU/Linux、Mac OS X 和 Windows 上运行。 二、Features 特征 Manuskript provides a rich environment to help writers create their first draft and then furt…...

antd 主题色定制

定制方案&#xff1a; 1. 全局定制 整个应用范围内的组件都生效 全局文件 theme.css :root:root {--adm-color-primary: #a062d4; } antd-mobile 中的主题变量也是在 :root 下声明的&#xff0c;所以在有些情况会由于优先级的问题无法覆盖。通过 :root:root 显式地让你所…...

召回11:地理位置召回、作者召回、缓存召回

GeoHash 召回 属于地理位置召回&#xff0c;用户可能对附近发生的事情感兴趣。GeoHash 是一种对经纬度的编码&#xff0c;地图上每个单位矩形的 GeoHash 的前几位是相同的&#xff0c;GeoHash 编码截取前几位后&#xff0c;将相同编码发布的内容按时间顺序&#xff08;先是时间…...

leetcode0767. 重构字符串-medium

1 题目&#xff1a;重构字符串 官方标定难度&#xff1a;中 给定一个字符串 s &#xff0c;检查是否能重新排布其中的字母&#xff0c;使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行&#xff0c;返回空字符串 “” 。 示例 1: 输入: s “aab” 输出: “…...

vue基本介绍

Vue是一款流行的JavaScript前端框架&#xff0c;以下是其基本介绍&#xff1a; 发展历程 - 2014年&#xff0c;尤雨溪发布了Vue的第一个版本。 - 此后&#xff0c;Vue不断发展和完善&#xff0c;陆续发布了多个版本&#xff0c;功能逐渐强大&#xff0c;社区也日益活跃。 …...

【vue】【环境配置】项目无法npm run serve,显示node版本过低

解决方案&#xff1a;安装高版本node&#xff0c;并且启用高版本node 步骤&#xff1a; 1、查看当前版本 node -v2、配置nvm下载镜像源 1&#xff09;查看配置文件位置 npm root2&#xff09;找到settings.txt文件 修改镜像源为&#xff1a; node_mirror: https://npmmirro…...

第35周Zookkeeper+Dubbo JDK不同版本介绍

一、JDK 新特性全解析 JDK9 - 模块化&#xff1a;化繁为简的魔法 模块化特性&#xff1a;JDK9 给 Java 程序带来模块化特性&#xff0c;就像把一个大公司划分成多个部门&#xff0c;每个部门&#xff08;模块&#xff09;各司其职。模块比包更大&#xff0c;一个模块包含多个…...

【ORB-SLAM3】CreateNewKeyFrame()函数阅读

void Tracking::CreateNewKeyFrame() void Tracking::CreateNewKeyFrame() {// 如果局部建图线程正在初始化且没做完或关闭了,就无法插入关键帧if(mpLocalMapper->IsInitializing() && !mpAtlas->isImuInitialized())return;if(!mpLocalMapper->SetNotStop(t…...

腾讯开源实时语音大模型VITA-audio,92mstoken极速响应,支持多语言~

简介 VITA-Audio 是一个由腾讯优图实验室&#xff08;Tencent Youtu Lab&#xff09;、南京大学和厦门大学的研究人员共同开发的项目&#xff0c;旨在解决现有语音模型在流式生成&#xff08;streaming&#xff09;场景下生成第一个音频令牌&#xff08;token&#xff09;时的高…...

使用 TypeScript + dhtmlx-gantt 在 Next.js 中实现

1. 安装依赖&#xff08;确保已安装&#xff09; npm install dhtmlx-gantt2. 创建 pages/gantt.tsx use clientimport { useRef, useEffect } from react import { gantt } from dhtmlx-gantt import dhtmlx-gantt/codebase/dhtmlxgantt.cssinterface Task {id: number | st…...

web第四次课后作业--页面操作实现数据库的增删查改

一、环境配置 1. 创建一个java web&#xff08;maven构建&#xff09;的项目2. 配置tomcat3. 连接数据库二、页面呈现 登录页面 详细信息 删除一条信息后 更新 更新后的信息 三、目录结构 四、代码实现 4.1 denglu.jsp <% page language"java" cont…...

DeepSearch:字节新一代 DeerFlow 框架

项目地址&#xff1a;https://github.com/bytedance/deer-flow/ 【全新的 Multi-Agent 架构设计】独家设计的 Research Team 机制&#xff0c;支持多轮对话、多轮决策和多轮任务执行。与 LangChain 原版 Supervisor 相比&#xff0c;显著减少 Tokens 消耗和 API 调用次数&#…...

uniapp中vue3和pinia安装依赖npm install失败

目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 用uni-app开发小程序的时候&#xff0c;使用了vue3pinia,安装依赖的时候发现vue和pinia的版本问题&#xff0c;安装失败&#xff0c; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve np…...

【java】synchronized关键字详解

目录 一、线程同步与线程安全问题线程不安全Demo线程不安全的原因 二、synchronized关键字关键字锁粒度修饰对象修饰代码块修饰方法修饰静态方法修饰类 synchronized 锁总结 synchronized加锁原理MarkWordsynchronized锁升级synchronized锁原理synchronized关键字总结 其他同步…...

使用 `perf` 和火焰图(Flame Graph)进行性能分析

在现代软件开发中&#xff0c;性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时&#xff0c;识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf 以及火焰图&#xff08;Flame Graph&#xff09…...

Cocos Creator 3.8.5 构建依赖环境配置文档

Cocos Creator 3.8.5 构建依赖环境配置文档 文章目录 Cocos Creator 3.8.5 构建依赖环境配置文档✅ 构建依赖汇总表✅ 构建平台配置说明&#x1f449; Windows 构建&#x1f449; Android 构建 ✅ 推荐构建环境组合&#xff08;稳定&#xff09;✅ 常见问题提示 适用于打包 An…...

# FlyEnv 环境下 MySQL 操作全攻略:从基础到字段修改

在使用 FlyEnv 搭建开发环境时&#xff0c;MySQL 数据库的操作是开发过程中不可或缺的一环。无论是修改字段结构&#xff0c;还是执行其他常见操作&#xff0c;都需要熟练掌握相关技能。下面将为你详细介绍 FlyEnv 环境下 MySQL 的操作&#xff0c;以及修改字段的多种方法。 一…...

C语言_自动义类型:联合和枚举

1. 联合体 1.1 联合体类型的声明 与结构体相似&#xff0c;联合体也是有一个或多个成员&#xff08;可以是不同类型&#xff09;构成&#xff1b;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间&#xff0c;所以联合体也叫&#xff…...

Golang基础知识—cond

cond 通常指 sync.Cond&#xff0c;它是标准库 sync 包中用于实现 条件变量 的同步原语。条件变量在多 goroutine 协作场景中非常有用&#xff0c;尤其在需要根据特定条件协调多个 goroutine 的执行顺序时。 sync.Cond 的核心作用 条件变量用于 等待某个条件满足 或 通知其他等…...

深入探索向量数据库:构建智能应用的新基础

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…...