凯卓立识别货车围板安全性项目0-1搭建

编译方式

1
2
3
4
5
mkdir build
cd build
cmake ..
make
./project

1. 在本机安装 Python

1
2
python3 --version
# 输出示例:Python 3.8.10

2. 安装 ultralytics(yolov官方库)

1
2
3
pip install ultralytics
# 如遇网络报错可用国内镜像
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

3. 下载人像图片

下载 people.jpeg,保存在 home 里的 people_ims 文件夹。

4. 编写 detect_people.py 并检测图片

在项目文件夹中编写 detect_people.py,对图片 people1 进行检测。

1
2
cd /home/zlyjy/Desktop/tof_sdk/Metasense_SDK_and_Demo_Yunshis/Ubuntu/uvc_ir_depth_rgb_sample_ubuntu20.04_20240609/uvc_ir_depth_rgb/
python3 detect_people.py

目前已可对文件夹内图片中的人进行框选。

5. 采用 C++ 采集,Python 检测+实时监测

编写 socket.py,使用 python3 detect_people_socket.py 实现接口调用。

1
cd /home/zlyjy/Desktop/tof_sdk/uvc_ir_depth_rgb/build/

6. 遇到 USB.10 的 bug

只有不断重复删除 build 并重新创建 build 才能解决。

7. 代码实现逻辑理解

数据流:
USB摄像头 → C++程序 → Socket传输 → Python脚本 → YOLOv8检测 → 显示结果

  • cv::Mat matIr; // 红外图像(单通道灰度)
  • cv::Mat matrgb; // RGB图像(三通道彩色)
  • cv::Mat matDepth; // 深度图像(单通道,存储距离值)

8. C++端初始化阶段

8.1 USB设备连接

1
2
3
4
usb_initial();                    // 初始化USB系统
std::vector<uint8_t> ids;
usb_get_address_id(ids); // 获取设备ID列表
uint8_t nDevID = ids[0]; // 选择第一个设备

作用:连接并识别USB摄像头设备

8.2 设备配置

1
2
3
4
5
6
7
8
9
SendDataByUSB temp;               // 创建USB通信对象
// 读取设备序列号
temp.RequestCameraSN(nDevID, sn_data, 500);
// 设置红外发射器电流
temp.sendIRCurrentSelect(nDevID, 0x7F, 500); // 0x7F = 1A电流
// 设置图像通道
temp.sendImgChannel(nDevID, true, false, false, true, 500);
// 设置帧率
temp.sendFrameRate(nDevID, 30, 500); // 30fps

作用:配置摄像头参数(红外强度、启用通道、帧率)

8.3 图像采集器初始化

1
2
depth_picture_capture cap;
bool bo = cap.open(30, 0x04cc, 0x0017, width, height);

作用:初始化图像采集器

8.4 Socket连接建立

1
2
3
4
5
6
7
8
9
10
11
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5001);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
int ret = connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (ret < 0) {
perror("connect error");
return -1;
}
printf("connect ok\n");

8.5 图像处理

  • IR图像处理
  • 深度图像处理

(此处省略部分代码,详见原文)

9. Python 脚本 log 配置

1
2
3
4
5
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)

10. Python 脚本 socket 配置

1
2
3
4
5
6
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 5001))
server.listen(1)
logging.info("等待C++客户端连接...")
conn, addr = server.accept()
logging.info(f"已连接:{addr}")

11. TCP/UDP、IPv4/IPv6 区别简述

  • TCP:可靠、顺序、面向连接,适合网页、文件等
  • UDP:不保证可靠和顺序,速度快,适合视频、语音、游戏
  • IPv4:点分十进制
  • IPv6:冒号分隔的8组16进制

12. Socket 核心代码(初始版本)

(此处核心代码,卖个关子)

13. 发送/接收优化

  • C++端循环补发,确保数据完整
  • Python端用 recv_all 辅助函数,确保每次都完整收到数据

14. 检测所有类别并绘制检测结果

(此处核心代码,卖个关子)

15. 深度图归一化、三通道复制、jpg编码和socket发送

(此处核心代码,卖个关子)

16. DEPTH类型窗口和类型映射

(此处核心代码,卖个关子)

17. 项目进度检查