diff --git a/docs/models/retinaface.md b/docs/models/retinaface.md index 6e95e8491a3c1648eba353a106fe2bd0997a7860..c6815c17026367a211ff913947cf5a3727abd97f 100644 --- a/docs/models/retinaface.md +++ b/docs/models/retinaface.md @@ -1,10 +1,9 @@ -```bash cd /path/to/LockzhinerVisionModule rm LZ-Retainface* wget https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.3/LZ-Retainface-2024-1121-1436.onnx mv LZ-Retainface-2024-1121-1436.onnx LZ-RetinaFace.onnx - + rm test.jpg # 下载不了去 https://github.com/airockchip/rknn_model_zoo/blob/main/examples/RetinaFace/model/test.jpg 下载 wget -O test.jpg https://s21.ax1x.com/2024/11/07/pAyN4VU.jpg @@ -18,5 +17,4 @@ python utils/export.py \ --config_path=./configs/LZ-RetinaFace.yaml \ --model_load_path=./LZ-RetinaFace.onnx \ --model_save_path=./LZ-RetinaFace.rknn \ - --target_platform=RV1106 -``` \ No newline at end of file + --target_platform=RV1106 \ No newline at end of file diff --git a/example/patrol_line/README.md b/example/patrol_line/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1a4a39423c49daa1db83f00d79be7bdad9506563 --- /dev/null +++ b/example/patrol_line/README.md @@ -0,0 +1,37 @@ +

凌智视觉模块视觉巡线部署指南

+ +发布版本:V0.0.0 + +日期:2025-03-17 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +|:-----------| -------- |--------| ------------ | +| 2025/03/17 | 0.0.0 | 林铮汉 | 初始版本 | + +## 1 简介 + +在小车控制中,巡线是最常见的基本功能,在本次任务中使用 OpenCV 进行巡线任务。 + +## 2 在凌智视觉模块上部署巡线任务 + + +- [凌智视觉巡线 Cpp 部署指南](./cpp) \ No newline at end of file diff --git a/example/patrol_line/cpp/CMakeLists.txt b/example/patrol_line/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..79c7ed910a4c363a60c9a4690757dc71f79e49d8 --- /dev/null +++ b/example/patrol_line/cpp/CMakeLists.txt @@ -0,0 +1,19 @@ +project(test_edit) + +set(TARGET_INSTALL_DIR "bin/edit") + +set(TARGET_LIST "") +add_executable(Test-Capture test_capture.cc) +list(APPEND TARGET_LIST Test-Capture) + +add_executable(Test-FPS test_fps.cc) +list(APPEND TARGET_LIST Test-FPS) + +# link and include +foreach(test_project ${TARGET_LIST}) + target_link_libraries(${test_project} PRIVATE ${CMAKE_PROJECT_NAME}) +endforeach() + +# install +install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION ${TARGET_INSTALL_DIR}) +install(TARGETS ${TARGET_LIST} DESTINATION ${TARGET_INSTALL_DIR}) \ No newline at end of file diff --git a/example/patrol_line/cpp/README.md b/example/patrol_line/cpp/README.md new file mode 100644 index 0000000000000000000000000000000000000000..25b5dad2f0b7c342b599f406f9ede6f90d312bd8 --- /dev/null +++ b/example/patrol_line/cpp/README.md @@ -0,0 +1,172 @@ +

凌智视觉模块视觉巡线部署指南 Cpp 部署指南

+ +发布版本:V0.0.0 + +日期:2025-03-18 + +文件密级:□绝密 □秘密 □内部资料 ■公开 + +--- + +**免责声明** + +本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。 + +由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。 + +**读者对象** + +本教程适用于以下工程师: + +- 技术支持工程师 +- 软件开发工程师 + +**修订记录** + +| **日期** | **版本** | **作者** | **修改说明** | +|:-----------| -------- |--------| ------------ | +| 2025/03/17 | 0.0.0 | 林铮汉 | 初始版本 | + +## 1 简介 + +接下来让我们基于 Cpp 来部署视觉巡线案例,在开始本章节前: + +- 你已经按照 [开发环境搭建指南](../../../docs/introductory_tutorial/development_environment.md) 正确配置了开发环境。 +- 点击 [凌智视觉模块图片传输助手下载地址](https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.0/LockzhinerVisionModuleImageFetcher_v0.0.0.exe) 下载凌智视觉模块图片传输助手。 + +## 2 Cpp API 文档 +凌智视觉模块使用 opencv-mobile 来读取摄像头数据。关于摄像头读取,请参考传统的 OpenCV 摄像头 API 来实现,需要注意的是: + +- 受限于运行内存,请使用我们编译的 [OpenCV Mobile](https://gitee.com/LockzhinerAI/opencv-mobile) 库来代替传统的 OpenCV 库 +- LockzhinerVisionModule 只有一个摄像头,因此在打开摄像头时,不管输入什么参数,都只会打开这个摄像头 +- 配置摄像头长宽时,请保证长和宽都是 8 的倍数 +- 在本次项目中使用的 OpenCV 函数完全适配标准 OpenCv 函数,相关 API 参考标准 OpenCV 函数接口。 + +## 3 项目介绍 + +在本案例中,使用黑线作为实例,可通过更改色彩掩膜来识别不同颜色的线。 + +```Cpp +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + // 设置默认摄像头分辨率 + int width = 640; + int height = 480; + + // 如果命令行参数提供了宽度和高度,则使用它们 + if (argc == 3) { + width = std::stoi(argv[1]); + height = std::stoi(argv[2]); + } + + // 初始化编辑模块并尝试连接设备 + lockzhiner_vision_module::edit::Edit edit; + if (!edit.StartAndAcceptConnection()) { + std::cerr << "Error: Failed to start and accept connection." << std::endl; + return EXIT_FAILURE; + } + std::cout << "Device connected successfully." << std::endl; + + cv::VideoCapture cap; + cap.set(cv::CAP_PROP_FRAME_WIDTH, width); + cap.set(cv::CAP_PROP_FRAME_HEIGHT, height); + cap.open(0); + + // 获取实际的帧尺寸 + double frameWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH); + double frameHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT); + std::cout << "Frame size: " << frameWidth << "x" << frameHeight << std::endl; + + // 定义ROI区域 + cv::Rect roi_rect(40, 300, 560, 180); + + while (true) { + cv::Mat temp_mat; + cap >> temp_mat; // 获取新的一帧 + if (temp_mat.empty()) { + std::cerr << "Warning: Couldn't read a frame from the camera." << std::endl; + continue; + } + + // 提取ROI区域,并转换到HSV色彩空间 + cv::Mat roi_image = temp_mat(roi_rect); + cv::cvtColor(roi_image, roi_image, cv::COLOR_BGR2HSV); // 注意原代码中是RGB2HSV,应改为BGR2HSV + + // 创建黑白掩膜 + cv::Scalar lower_black(0, 0, 0); + cv::Scalar upper_black(180, 100, 60); + cv::Mat mask; + cv::inRange(roi_image, lower_black, upper_black, mask); + + // 应用掩膜 + cv::Mat res; + cv::bitwise_and(roi_image, roi_image, res, mask); + + // 计算图像矩并找到质心 + cv::Moments m = cv::moments(mask, false); + double cx = m.m10 / (m.m00 + 1e-6); // 防止除以零 + double cy = m.m01 / (m.m00 + 1e-6); + + // 在原始图像上绘制ROI边框和质心位置 + cv::rectangle(temp_mat, roi_rect, cv::Scalar(255, 0, 0), 2); // 绘制ROI边框 + cv::circle(temp_mat, cv::Point(static_cast(cx + roi_rect.x), static_cast(cy + roi_rect.y)), 5, cv::Scalar(0, 255, 0), -1); // 绿色圆点表示质心位置 + + // 输出质心的X坐标 + std::cout << "Centroid X: " << cx + roi_rect.x << std::endl; + + // 将当前帧发送到编辑模块打印 + if (!edit.Print(temp_mat)) { + std::cerr << "Error: Failed to print to edit module." << std::endl; + break; + } + } + return EXIT_SUCCESS; +} + + +``` +## 4 编译项目 +在本次项目中为使编译更为简单,可将上文中的 Cpp 代码直接替换进 /LockzhinerVisionModuleWorkSpace/LockzhinerVisionModuleLibrary/example/edit/test_capture.cc 中。 +后通过下述指令编译整个工程: +```bash +cd /LockzhinerVisionModuleWorkSpace/LockzhinerVisionModuleLibrary +rm -rf build && mkdir build && cd build +export TOOLCHAIN_ROOT_PATH=${PWD}/../../arm-rockchip830-linux-uclibcgnueabihf +cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_TESTS=ON \ + -DCMAKE_INSTALL_PREFIX=${PWD}/lockzhiner_vision_module_sdk \ + .. +make -j8 && make install +zip -r -9 lockzhiner_vision_module_sdk.zip lockzhiner_vision_module_sdk +``` +编译后如下图所示: +![](images/build_result.png) +编译完成后在/LockzhinerVisionModuleWorkSpace/LockzhinerVisionModuleLibrary/build/lockzhiner_vision_module_sdk/bin/edit中所生成的Test-Capture可执行文件即为所需文件。 +## 4 上传并测试 + +参考 [连接设备指南](../../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。 +先将编译文件从 Docker 中下载到本地。 + +请使用 Electerm Sftp 上传以下一个文件: + +- 进入存放 **Test-Capture** 可执行文件的目录,将 **Test-Capture** 上传到 Lockzhiner Vision Module + +![](images/stfp.png) + +请使用 Electerm Ssh 并在命令行中执行以下命令: + +```bash +chmod 777 Test-Capture +./Test-Capture +``` + +运行程序后,使用凌智视觉模块图片传输助手连接设备,屏幕上开始打印识别黑线的质心 X 轴坐标,凌智视觉模块图片传输助手出现可视化的结果 + +![alt text](images/result.png) diff --git a/example/patrol_line/cpp/images/build_result.png b/example/patrol_line/cpp/images/build_result.png new file mode 100644 index 0000000000000000000000000000000000000000..da357e11cf4705175849df152839473cfd690257 Binary files /dev/null and b/example/patrol_line/cpp/images/build_result.png differ diff --git a/example/patrol_line/cpp/images/result.png b/example/patrol_line/cpp/images/result.png new file mode 100644 index 0000000000000000000000000000000000000000..3698ea9dcc5dcc59cd98da78e9d4fd9290a54182 Binary files /dev/null and b/example/patrol_line/cpp/images/result.png differ diff --git a/example/patrol_line/cpp/images/stfp.png b/example/patrol_line/cpp/images/stfp.png new file mode 100644 index 0000000000000000000000000000000000000000..d8654ee558151b5b938497209a58f99dd0e8d7f4 Binary files /dev/null and b/example/patrol_line/cpp/images/stfp.png differ diff --git a/example/patrol_line/cpp/main.cc b/example/patrol_line/cpp/main.cc new file mode 100644 index 0000000000000000000000000000000000000000..1aa7c55ab8a4c249ea0c955575ef954d502c1eb4 --- /dev/null +++ b/example/patrol_line/cpp/main.cc @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include + + +int main(int argc, char *argv[]) { + // 设置默认摄像头分辨率 + int width = 640; + int height = 480; + + // 如果命令行参数提供了宽度和高度,则使用它们 + if (argc == 3) { + width = std::stoi(argv[1]); + height = std::stoi(argv[2]); + } + + // 初始化编辑模块并尝试连接设备 + lockzhiner_vision_module::edit::Edit edit; + if (!edit.StartAndAcceptConnection()) { + std::cerr << "Error: Failed to start and accept connection." << std::endl; + return EXIT_FAILURE; + } + std::cout << "Device connected successfully." << std::endl; + + cv::VideoCapture cap; + cap.set(cv::CAP_PROP_FRAME_WIDTH, width); + cap.set(cv::CAP_PROP_FRAME_HEIGHT, height); + cap.open(0); + + // 获取实际的帧尺寸 + double frameWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH); + double frameHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT); + std::cout << "Frame size: " << frameWidth << "x" << frameHeight << std::endl; + + // 定义ROI区域 + cv::Rect roi_rect(40, 300, 560, 180); + + while (true) { + cv::Mat temp_mat; + cap >> temp_mat; // 获取新的一帧 + if (temp_mat.empty()) { + std::cerr << "Warning: Couldn't read a frame from the camera." << std::endl; + continue; + } + + // 提取ROI区域,并转换到HSV色彩空间 + cv::Mat roi_image = temp_mat(roi_rect); + cv::cvtColor(roi_image, roi_image, cv::COLOR_BGR2HSV); // 注意原代码中是RGB2HSV,应改为BGR2HSV + + // 创建黑白掩膜 + cv::Scalar lower_black(0, 0, 0); + cv::Scalar upper_black(180, 100, 60); + cv::Mat mask; + cv::inRange(roi_image, lower_black, upper_black, mask); + + // 应用掩膜 + cv::Mat res; + cv::bitwise_and(roi_image, roi_image, res, mask); + + // 计算图像矩并找到质心 + cv::Moments m = cv::moments(mask, false); + double cx = m.m10 / (m.m00 + 1e-6); // 防止除以零 + double cy = m.m01 / (m.m00 + 1e-6); + + // 在原始图像上绘制ROI边框和质心位置 + cv::rectangle(temp_mat, roi_rect, cv::Scalar(255, 0, 0), 2); // 绘制ROI边框 + cv::circle(temp_mat, cv::Point(static_cast(cx + roi_rect.x), static_cast(cy + roi_rect.y)), 5, cv::Scalar(0, 255, 0), -1); // 绿色圆点表示质心位置 + + // 输出质心的X坐标 + std::cout << "Centroid X: " << cx + roi_rect.x << std::endl; + + // 将当前帧发送到编辑模块打印 + if (!edit.Print(temp_mat)) { + std::cerr << "Error: Failed to print to edit module." << std::endl; + break; + } + + } + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/example/vision/classification/README.md b/example/vision/classification/README.md index 554f0196675cec22469a2cedae0c7eb11ee9bde3..5ee660b5c428fdb8120605f3d33e8f73931d7adc 100644 --- a/example/vision/classification/README.md +++ b/example/vision/classification/README.md @@ -135,7 +135,7 @@ AI Studio 是基于百度深度学习开源平台飞桨的人工智能学习与 ### 3.4 Fork 项目 -进入 [【PaddleX】在凌智 AI 视觉模块上部署 PaddleClas 模型](https://aistudio.baidu.com/projectdetail/8285578?sUid=790375&shared=1&ts=1725690007105) 项目,点击右上角的 **Fork** 图标来创建自己的项目,如下图: +进入 [【PaddleX】在凌智 AI 视觉模块上部署 PaddleClas 模型](https://aistudio.baidu.com/projectdetail/8892746) 项目,点击右上角的 **Fork** 图标来创建自己的项目,如下图: ![](images/fork_0.png) diff --git a/example/vision/detetcion/README.md b/example/vision/detetcion/README.md index d9aa648df9ba2960b65b7ec66db58d98ae9d963c..07c07d7626bc61b1dc6824e6afd3e611d5b9b5df 100644 --- a/example/vision/detetcion/README.md +++ b/example/vision/detetcion/README.md @@ -175,7 +175,7 @@ AI Studio 是基于百度深度学习开源平台飞桨的人工智能学习与 ### 3.4 Fork 项目 -进入 [在凌智视觉模块上部署 PaddleDetection 模型](https://aistudio.baidu.com/projectdetail/8235625) 项目,点击右上角的 **Fork** 图标来创建自己的项目,如下图: +进入 [在凌智视觉模块上部署 PaddleDetection 模型](https://aistudio.baidu.com/projectdetail/8892748) 项目,点击右上角的 **Fork** 图标来创建自己的项目,如下图: ![](images/fork_0.png)