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

基于ESP32-CAM的双目视觉系统:构建低成本VR远程观察平台

1. 项目概述与核心思路

想不想把眼前的世界,实时地、立体地带到你的VR眼镜里?这个想法听起来像是科幻电影里的场景,但今天,借助几块几十块钱的ESP32-CAM开发板和一些常见的电子元件,我们自己就能动手实现。这个项目的核心,就是构建一个“移动的双眼”——一个由两个ESP32-CAM组成的双目摄像头系统,它能像人的双眼一样,以约6.5厘米的间距捕捉带有视差的立体图像,并通过Wi-Fi实时推送到你的手机屏幕上。当你把手机放进VR眼镜盒,一个沉浸式的3D观察窗口就诞生了。

但这还不够酷。为了让这个“电子头”也能像我们的头一样转动,我们引入了伺服电机云台和头部追踪器。云台负责根据指令转动摄像头,而戴在你头上的追踪器(内置MPU6050陀螺仪)则实时感知你头部的转动角度,并通过无线信号控制云台同步运动。这样一来,你转动头部,远在另一个房间甚至更远处的摄像头也会同步转动,仿佛你真的“身临其境”,通过这双电子眼观察世界。这不仅仅是简单的视频传输,而是一个融合了立体视觉、实时流媒体、无线控制和姿态传感的综合性嵌入式物联网项目,非常适合对机器人视觉、远程操作或VR/AR交互感兴趣的创客和开发者。

整个系统的架构可以清晰地分为三个逻辑层:感知层(双目摄像头+头部追踪陀螺仪)、控制与转发层(ESP32-CAM主控+NodeMCU伺服控制器)和呈现与交互层(智能手机+VR眼镜)。感知层负责采集视觉和姿态数据;控制层负责处理数据、驱动执行机构并建立网络通信;呈现层则负责将立体视频流合成为3D画面并提供沉浸式观看体验。理解这个分层架构,对于后续的硬件连接、软件编程和问题排查都至关重要。

2. 硬件选型、清单与电路设计解析

工欲善其事,必先利其器。一份清晰合理的硬件清单和连接方案是项目成功的基石。下面我将所有物料分为核心功能模块进行归类,并解释每个部分的选择理由和连接要点。

2.1 核心视觉模块:ESP32-CAM双摄像头

这是项目的眼睛,选择ESP32-CAM的原因非常直接:高集成度与性价比。一块小小的板子上集成了ESP32-S芯片、摄像头接口、TF卡槽、天线和丰富的GPIO,同时支持Wi-Fi和蓝牙。这意味着我们无需为视频编码和无线传输单独设计复杂的电路。你需要准备两块ESP32-CAM模块。这里有个关键细节:尽量选择OV2640传感器的版本,而不是OV7670。OV2640支持JPEG硬件压缩,能极大减轻ESP32的CPU负担,实现更流畅的MJPEG流传输,这对于实时双目视频至关重要。

供电是第一个坑点。ESP32-CAM的工作电压是3.3V,但它的峰值电流可能超过500mA,尤其是当Wi-Fi全速传输图像时。许多新手直接用开发板上的3.3V引脚供电,结果导致系统不稳定、频繁重启。正确的做法是使用一个独立的、能提供至少1A电流的5V电源,通过板载的5V引脚或USB口供电。板载的AMS1117-3.3稳压器会将其转换为3.3V供核心使用,这样能确保供电充足稳定。

2.2 运动执行模块:伺服云台与控制器

为了让“眼睛”动起来,我们需要一个三自由度的云台(Pan-俯仰, Tilt-倾斜, Roll-横滚)。一个现成的舵机云台套件是最快捷的选择,它通常包含两个或三个塑料支架和安装孔位。你需要三个标准舵机(如SG90或MG90S),分别控制三个轴向的运动。SG90扭矩较小但便宜,适用于负载轻的摄像头;如果觉得晃动,可以升级为金属齿的MG90S。

驱动舵机需要一个独立的控制器,这里选择了NodeMCU ESP8266(Amica版)。为什么不直接用ESP32-CAM来控制?因为ESP32-CAM的GPIO资源在连接摄像头后已经比较紧张,且同时处理视频流和精确的PWM舵机控制会相互干扰。ESP8266作为专门的舵机控制器,任务单一,响应更及时稳定。选择Amica版本是因为其引脚布局清晰,便于焊接和调试。

舵机供电必须独立!这是第二个关键点。舵机在转动瞬间电流很大,如果和ESP8266共用同一个电源,会产生电压骤降,导致ESP8266重启。因此,你需要一个双路输出的电源模块,或者两块独立的电池。一路5V/2A以上给舵机和摄像头供电,另一路5V/1A给ESP8266和头部追踪器供电。切记,两地(舵机电源地和ESP8266电源地)必须共地,即用导线将两个电源的GND连接起来,否则控制信号无法形成回路。

2.3 姿态感知模块:头部追踪器

头部追踪的核心是一个MPU6050传感器模块,它集成了三轴陀螺仪和三轴加速度计,可以精确测量角度变化。我们选择它是因为其价格低廉、资料丰富,且通过I2C通信,接线简单。承载MPU6050的是另一块ESP8266-01模块。ESP8266-01尺寸极小,非常适合集成到VR眼镜上。它的作用就是读取MPU6050的数据,计算出头部转动的欧拉角(或直接使用陀螺仪积分数据),然后通过Wi-Fi发送给作为舵机控制器的NodeMCU。

头部追踪器的供电通常由一块小容量的3.7V锂聚合物电池配合一个微型充电/升压模块(输出5V)来解决,这样可以保证设备的便携性和续航。

2.4 辅助与结构材料

  • VR眼镜:一个廉价的手机VR眼镜盒即可,价格在20欧元左右。它的作用是利用凸透镜将手机屏幕上的分屏图像放大并形成立体视觉。
  • 智能手机:作为显示终端。它需要支持5GHz Wi-Fi(连接更稳定)并拥有一个现代浏览器(如Chrome)。
  • 电路板与连接器:为了可靠和可维护,强烈建议将ESP32-CAM和NodeMCU焊接在万用板(洞洞板)上,并使用排母和排针进行连接,避免杜邦线长期使用导致的接触不良。
  • 焊接工具与线材:一套可靠的焊接工具和不同颜色的硅胶导线是必备的。

电路连接核心逻辑图(非物理接线图)

  1. 双目摄像头单元:两块ESP32-CAM并排放置,镜头中心距严格调整至6.5厘米(成人平均瞳距)。它们共用一套5V电源(正极并联接5V,负极并联接GND)。
  2. 舵机控制单元:NodeMCU的GPIO引脚(例如D1, D2, D6)连接到三个舵机的信号线(通常为橙色或白色线)。舵机的电源正极(红色线)接独立5V电源正极,负极(棕色线)接该电源GND,同时这个GND必须与NodeMCU的GND相连。
  3. 头部追踪单元:ESP8266-01的GPIO0和GPIO2分别连接MPU6050的SDA和SCL引脚。VCC接3.3V或5V(看模块支持),GND共地。

3. 软件环境搭建与核心代码剖析

硬件是骨架,软件是灵魂。这个项目的代码涉及多个微控制器之间的协作,理解其网络架构和数据流是编程的关键。

3.1 开发环境与库准备

首先,确保你安装了最新版的Arduino IDE。然后,你需要添加对ESP32和ESP8266开发板的支持。

  1. 打开Arduino IDE,进入“文件”->“首选项”,在“附加开发板管理器网址”中添加以下URL:
    • ESP32:https://espressif.github.io/arduino-esp32/package_esp32_index.json
    • ESP8266:https://arduino.esp8266.com/stable/package_esp8266com_index.json
  2. 打开“工具”->“开发板”->“开发板管理器”,搜索并安装“esp32”和“esp8266”平台。
  3. 安装必要的库。对于ESP32-CAM,通常需要ESP32平台自带的摄像头驱动库。对于MPU6050,我推荐使用Adafruit MPU6050库和Adafruit Unified Sensor库,它们在Arduino库管理中直接搜索安装即可,兼容性更好,能避免原始资料中GY6050.h库的编译错误。

3.2 网络架构与代码分工

整个系统形成了一个简单的局域网。其核心设计是:其中一个ESP32-CAM(左眼)作为无线接入点(AP)和Web服务器,另一个(右眼)作为站点(STA)连接到这个AP,并将视频流发送给服务器进行聚合。

  • Camera 1 (左眼/主控)代码 (ESP-cam1_AP_webserver.ino)

    • 角色:创建Wi-Fi热点(如“ESP32_AP”),IP地址固定为192.168.4.1
    • 功能
      1. 初始化自身的摄像头,开始捕获视频流,并提供MJPEG流地址(如http://192.168.4.1:81/stream)。
      2. 运行一个Web服务器。当客户端(手机浏览器)访问192.168.4.1时,它会返回一个HTML页面。这个页面内嵌了两个<img>标签,分别指向左眼自身的视频流右眼ESP32-CAM的视频流地址(例如http://192.168.4.2/stream)。
      3. 同时,它还作为一个TCP服务器,监听来自头部追踪器(ESP8266-01)的UDP或TCP数据包(包含头部姿态数据),并可能将其转发给舵机控制器(NodeMCU),或者NodeMCU直接连接至此获取数据。原始方案中,NodeMCU也连接到此AP获取数据。
    • 关键点:这份代码需要处理多任务——Wi-Fi AP、Web服务、视频编码、可能的Socket通信。这对ESP32是重负载,也是后续可能产生延迟的根源。
  • Camera 2 (右眼)代码 (ESP-cam2.ino)

    • 角色:作为Wi-Fi客户端,连接到Camera 1创建的热点“ESP32_AP”。
    • 功能:初始化自身的摄像头,启动一个简单的Web服务器(通常运行在端口80),只提供一路MJPEG视频流。它的IP地址由Camera 1的DHCP服务器分配(例如192.168.4.2)。
    • 关键点:它的任务单一,只负责采集和流式传输图像,因此通常比Camera 1运行得更稳定。
  • Servo-unit_Receiver.ino (NodeMCU舵机控制器)

    • 角色:作为Wi-Fi客户端,连接到Camera 1的热点。
    • 功能
      1. 连接到指定的服务器(可能是Camera 1的某个端口),持续接收头部追踪器发来的角度数据包。
      2. 解析数据包,得到目标角度(Pan, Tilt, Roll)。
      3. 使用Servo库生成对应的PWM信号,驱动三个舵机转动到目标位置。
    • 关键点:需要处理网络数据的解析和舵机控制的平滑性。突然的角度跳变会导致舵机抖动,代码中应加入平滑滤波或缓动算法。
  • Head-transmitter.ino (ESP8266-01头部追踪器)

    • 角色:作为Wi-Fi客户端,连接到Camera 1的热点。
    • 功能
      1. 初始化MPU6050,校准传感器。
      2. 循环读取陀螺仪数据,积分计算当前相对于初始位置的偏转角度(Yaw, Pitch, Roll)。注意,陀螺仪积分存在漂移,但对于短时间、相对变化的头部追踪是可以接受的。
      3. 将计算出的角度数据打包成特定格式(如简单的字符串“P100,T45,R-10”),通过UDP或TCP发送给舵机控制器NodeMCU的IP地址和端口。
    • 关键点:MPU6050的校准至关重要。需要将设备静止放置数秒,采集零偏数据。发送数据频率不宜过高(如50ms间隔),避免网络拥堵。

3.3 核心代码片段与配置要点

以Camera 1的Web服务器HTML片段为例,这是实现双目同屏显示的核心:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>VR Binocular Stream</title> </head> <body> <div style="width: 100%; text-align: center;"> <!-- 左眼图像,来源自身 --> <img src="http://192.168.4.1:81/stream" style="width: 48%;"> <!-- 右眼图像,来源Camera 2 --> <img src="http://192.168.4.2:80/stream" style="width: 48%;"> </div> </body> </html>

摄像头参数配置:在camera_pins.h或主程序中,你需要配置摄像头参数以平衡画质和流畅度。对于VR应用,高帧率比高分辨率更重要。

// 在setup()函数中配置摄像头 config.frame_size = FRAMESIZE_SVGA; // 800x600, 比VGA(640x480)稍大,比UXGA(1600x1200)小很多 config.jpeg_quality = 12; // 质量越低,压缩率越高,传输越快 (范围0-63, 12是较好的平衡点) config.fb_count = 2; // 帧缓冲区数量,2个通常足够

将帧尺寸设置为SVGA并降低JPEG质量,可以显著提升帧率,减少右眼视频的卡顿现象。

4. 系统集成、组装与校准实战

有了硬件和软件,接下来就是将它们组合成一个可靠系统的过程。这个阶段充满了细节,一步出错就可能导致整个系统无法工作。

4.1 分步组装流程

  1. 独立测试每个模块

    • ESP32-CAM:分别给两块ESP32-CAM烧录官方CameraWebServer示例程序,用手机连接它们各自创建的热点,确认都能正常看到视频流。这是基础,必须确保。
    • NodeMCU与舵机:编写一个简单的测试程序,让NodeMCU依次驱动三个舵机进行0-180度扫掠,确认接线正确,运动平滑无卡顿。
    • ESP8266-01与MPU6050:编写测试程序,读取MPU6050的原始数据并通过串口打印,确认I2C通信正常,数据随设备转动而变化。
  2. 搭建双目摄像头支架

    • 使用轻质材料(如亚克力板、3D打印件)制作一个刚性支架,确保两个ESP32-CAM的镜头在同一水平线上,且中心距精确为65mm。可以使用游标卡尺精细调整。这个距离直接决定了立体效果的舒适度,太大或太小都会导致视觉疲劳。
  3. 集成舵机云台

    • 将双目摄像头支架牢固地安装在舵机云台的最上层舵机盘上。注意重心尽量靠近云台旋转中心,以减少舵机负载和晃动。
    • 将三个舵机依次安装到云台套件的相应位置(底座舵机控制左右Pan,中层控制上下Tilt,顶层控制侧倾Roll)。
    • 将NodeMCU、电源模块固定在云台底座附近,并连接好所有导线。用扎带整理线束,避免缠绕影响运动。
  4. 烧录并配置项目代码

    • 按顺序烧录四个核心代码到对应的设备上。
    • 关键配置:你需要根据你的网络环境修改所有代码中的Wi-Fi热点名称(SSID)和密码。对于Camera 2、NodeMCU和ESP8266-01,需要修改它们要连接的AP的SSID和密码,使其与Camera 1设置的一致。
    • IP地址配置:在头部追踪器的代码中,需要指定舵机控制器(NodeMCU)的IP地址。你需要先让系统运行起来,在Arduino IDE的串口监视器中查看NodeMCU获取到的IP(或在其代码中设置静态IP),然后将这个IP填写到头部追踪器的发送目标地址处。
  5. 上电与启动顺序

    • 建议遵循以下顺序:① 开启摄像头和舵机的5V电源 -> ② 开启NodeMCU和ESP8266-01的电源 -> ③ 等待约30秒,所有设备启动并连接网络。
    • 用手机搜索并连接Camera 1创建的热点(如“ESP32_AP”)。
    • 打开手机浏览器,访问http://192.168.4.1。你应该能看到一个并排显示两个视频流的页面。

4.2 立体校准与VR画面调试

看到双画面只是第一步,让它们在VR眼镜里完美融合成3D图像需要校准。

  1. 画面同步性检查:快速在摄像头前横向移动一个物体,观察左右两个画面中的物体移动是否基本同步。如果右眼画面有明显延迟,问题可能出在Camera 2的网络传输或处理速度上,需要回头优化其代码(降低分辨率、关闭不必要功能)或检查网络信号。

  2. VR眼镜适配

    • 将显示着双画面网页的手机放入VR眼镜盒。
    • 戴上眼镜,你会看到两个分开的圆形画面。前后移动手机在眼镜槽内的位置,直到两个圆形画面重叠成一个清晰的单一画面。
    • 此时,你应该能感受到立体感。找一个有明显前后景的物体(如手指伸在键盘前),观察立体效果。如果感觉眼睛不适、无法对焦或立体感错乱,可能是两个摄像头的画面存在垂直视差旋转不一致
  3. 软件画面调整:如果发现左右画面不完全水平对齐,我们无法机械调整时,可以通过修改Camera 1的HTML页面,对其中一个<img>标签应用CSS变换进行微调。例如,发现右眼画面偏高,可以给右眼的img标签添加样式style="transform: translateY(-5px);"进行像素级的上下偏移补偿。

4.3 头部追踪与云台联动校准

  1. 零位校准:将云台置于你认为是“正前方”的物理位置。将头部追踪器水平放置在桌面上,运行其校准程序(通常是在上电后静止几秒,代码中自动计算零偏)。确保此时代码中读取的头部姿态角度为(0,0,0)。

  2. 映射关系测试:缓慢转动头部,观察云台运动方向是否正确。常见的映射是:头部左右转动(Yaw)控制云台左右转动(Pan);头部上下点头(Pitch)控制云台上下俯仰(Tilt)。如果方向相反,在NodeMCU的代码中对接收到的角度值取反即可。

  3. 比例系数调整:你可能不希望头部转30度,云台也转30度。可以设置一个比例系数,例如servoAngle = headAngle * 0.7。这可以在NodeMCU的代码中完成,让云台运动幅度小于头部,获得更稳定的观察体验。

5. 性能优化、故障排查与进阶思路

项目搭建完成后,你可能会遇到一些典型问题。以下是常见问题的排查清单和优化方案。

5.1 常见问题与解决方案速查表

问题现象可能原因排查步骤与解决方案
手机无法连接“ESP32_AP”热点1. Camera 1程序未正确运行。
2. ESP32-CAM天线接触不良或为板载PCB天线,信号弱。
1. 通过串口监视器查看Camera 1启动日志,确认AP创建成功。
2. 确保使用外接天线版本的ESP32-CAM,并将天线拧紧。让手机靠近设备。
能连接热点,但无法访问192.168.4.11. Camera 1的Web服务器启动失败。
2. 手机浏览器缓存或代理问题。
1. 检查串口日志,确认服务器监听端口(如80)已启动。
2. 尝试使用浏览器无痕模式,或输入http://192.168.4.1:80
只能看到一个摄像头画面(通常是左眼)1. Camera 2未成功连接AP。
2. Camera 2的IP地址不是192.168.4.2。
3. HTML页面中右眼流地址错误。
1. 查看Camera 2串口日志,确认其已获取到IP。
2. 修改HTML中右眼流的IP为Camera 2的实际IP。
3. 单独用浏览器访问Camera 2的IP,确认其流地址可用。
右眼画面卡顿、延迟严重或经常停止1.这是最常见问题。Camera 1作为AP+服务器负载过重,网络带宽或处理能力不足。
2. Camera 2视频参数设置过高。
3. Wi-Fi干扰。
1.优化方案见下文
2. 降低Camera 2的分辨率(frame_size)和画质(jpeg_quality)。
3. 尝试将AP信道固定在1、6或11,远离干扰。
云台不响应头部转动1. 头部追踪器未发送数据。
2. NodeMCU未收到数据或IP/端口错误。
3. 舵机信号线接触不良。
1. 打开头部追踪器串口,查看是否在发送数据包。
2. 在NodeMCU代码中添加串口打印,确认其收到数据并解析正确。
3. 用示波器或舵机测试器检查NodeMCU引脚是否有PWM信号输出。
云台运动抖动、不精确1. 舵机供电不足。
2. 机械结构松动。
3. 代码中缺少舵机控制平滑算法。
1. 确保使用独立、功率足够的电源(如5V/2A)给舵机供电。
2. 紧固所有螺丝,检查云台各关节是否顺滑。
3. 在代码中加入“缓动”函数,让目标角度逐步逼近,而非直接跳变。
立体感弱或眼睛疲劳1. 双摄像头间距不是65mm。
2. 左右画面存在垂直偏差或旋转。
3. VR眼镜透镜焦距与手机屏幕不匹配。
1. 精确测量并调整摄像头间距。
2. 通过HTML/CSS微调画面位置和角度,或机械调整摄像头。
3. 尝试不同厚度的手机垫片,调整屏幕与透镜的距离。

5.2 核心性能优化方案:解决卡顿问题

原始方案中Camera 1身兼多职,是性能瓶颈。一个成熟的优化方案是引入第三块ESP32作为专用AP和Web服务器

优化后架构

  1. 专用AP/服务器:使用一块ESP32(可以是另一块ESP32-CAM,但不用其摄像头功能,或使用ESP32 DevKit)运行Web服务器和创建Wi-Fi热点。它的任务单一,只负责聚合视频流和提供网页。
  2. 纯摄像头节点:两块ESP32-CAM都配置为纯STA模式,连接到专用AP,并各自提供独立的视频流(如http://192.168.4.101/streamhttp://192.168.4.102/stream)。
  3. 网页嵌入:专用服务器上的网页同时引用上述两个视频流地址。

这样做的好处

  • 负载分离:视频编码和网络服务由不同芯片处理,互不干扰。
  • 带宽优化:两个摄像头的数据流直接流向AP,再由AP转发给手机,减少了中间转发环节。
  • 稳定性提升:专用AP的信号强度和稳定性通常更好。

实现此方案需要你修改代码,为专用服务器编写新的聚合网页,并将两个摄像头的代码改为简单的视频流服务器(类似CameraWebServer示例的STA模式)。这需要一定的网络编程知识,但能极大改善体验。

5.3 扩展思路与项目进阶

这个基础系统可以作为一个平台进行多种扩展:

  • 视频录制:在专用服务器ESP32上插入SD卡,将接收到的左右眼图像流按帧保存为图像序列,后期可合成3D视频。
  • 低延迟协议:对于需要实时操控的场景(如FPV),可以研究使用UDP协议传输经过压缩的JPEG图像,甚至使用ESP-NOW协议在ESP设备间进行点对点通信,绕过Wi-Fi TCP/IP栈,进一步降低延迟。
  • 集成到移动平台:将整个云台系统安装在遥控车或无人机上,实现真正的移动式第一人称视角(FPV)探索。
  • 计算机视觉增强:利用ESP32的额外处理能力,在摄像头端运行简单的人脸检测、目标跟踪算法,让云台能够自动跟随目标运动。

这个项目从构思到实现,充满了嵌入式开发特有的挑战和乐趣。它要求你同时考虑硬件电路、软件逻辑、网络通信和用户体验。最深的体会是,在资源受限的嵌入式环境中,“分而治之”和“有所取舍”是核心设计哲学。不要指望一块芯片做完所有事,将任务合理分配到多个单元,并为每个单元选择最合适的实现方式(例如,用UDP换速度,用低分辨率换帧率),是保证系统稳定流畅运行的关键。当你第一次通过自己打造的“双眼”看到立体的世界,并且它能随着你的视线转动时,所有的调试和折腾都是值得的。

http://www.cnnetsun.cn/news/2711673.html

相关文章:

  • KDU:通过易受攻击驱动实现Windows内核探索的实用工具
  • 基于ESP8266的DIY智能门锁:从硬件选型到Web控制全解析
  • 从零打造基于Arduino的智能调光台灯:PWM原理与实战
  • xWRL6432毫米波雷达开发包(2023.05版):含CAN_SBL引导、天线图、工具箱与多场景例程
  • Spark-TTS核心技术解析:单流解耦语音令牌如何提升TTS效率 3倍
  • 如何快速实现抖音直播数据抓取:3步完成实时弹幕监控与数据分析
  • 终极Windows风扇控制指南:5分钟掌握Fan Control完全静音散热方案
  • Dreamcast手柄内置震动改造:从电路原理到3D打印的硬件DIY实践
  • Arduino家务激励器:从电路到代码的嵌入式入门实践
  • 如何用79万条中文医疗对话数据打造专业级医疗AI助手:完整指南
  • 基于ESP8266与PID算法的触觉温控系统设计与实现
  • 终极城通网盘加速指南:3分钟突破限速的完整解决方案
  • 如何在直播中让观众“看见“你的操作:input-overlay输入可视化终极指南
  • VR头显过热卡顿?DIY被动散热方案,低成本解决手机热降频
  • 基于树莓派与OpenCV的智能仓储机器人:从PID循线到视觉定位的完整实现
  • Studio Library:专业Maya动画库管理工具完全指南
  • Unity游戏开发:手把手教你用BMFont把美术给的图片变成可用的艺术字体(附避坑指南)
  • 汽车知识问答系统源码包:含爬虫采集、图谱构建、实体链接与SPARQL多轮查询全流程
  • 3个颠覆性玩法:解锁《鸣潮》隐藏功能的效率革命
  • 让PS3手柄在Windows上完美无线连接:BthPS3驱动全面解析
  • 【华为OD机试真题 新系统】1003、优化充电桩调度算法 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)
  • 使用Ansible批量管理+更新产品环境服务器配置
  • 3步解决Windows 10 PL-2303串口驱动代码10错误:老旧硬件完美重生指南
  • c#软件开发学习笔记--面向对象
  • 营销自动化升级迫在眉睫:2024年仅剩37天窗口期,完成AI+CDP+CRM三端协议对齐的企业不足11%
  • 告别Unknown display:手把手教你为Ubuntu老旧或特殊显示器手动创建xorg.conf配置
  • 7、More examples of machine learning can and connot do?机器学习可行性事例
  • 你的大脑只能同时处理4件事:一天下来你什么事都没做完的原因
  • 【轴承故障诊断】基于SE-TCN和SE-TCN-SVM西储大学轴承故障诊断研究附Matlab代码
  • 别再只用COCO了!手把手教你用DOTA V1.5数据集搞定航拍小目标检测