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
literal 0
HcmV?d00001
--
Gitee
From 52e5a7b3bdb78ea0e6c10aa8cd3d61cc148f3c84 Mon Sep 17 00:00:00 2001
From: gu12530 <2629144335@qq.com>
Date: Fri, 29 Nov 2024 13:49:46 +0800
Subject: [PATCH 02/22] =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=BF=AE=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
example/opencv_example/opencv_circle_detection/python/README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/example/opencv_example/opencv_circle_detection/python/README.md b/example/opencv_example/opencv_circle_detection/python/README.md
index 1e1def4..11f644d 100644
--- a/example/opencv_example/opencv_circle_detection/python/README.md
+++ b/example/opencv_example/opencv_circle_detection/python/README.md
@@ -35,6 +35,7 @@
## 2 Python API 文档
```python
+
def cvtColor(src, code, dstCn=0):
"""
转换图像颜色空间。
--
Gitee
From 36213cd33eaf9de28ccf53764dd06b5e855a5ffc Mon Sep 17 00:00:00 2001
From: gu12530 <2629144335@qq.com>
Date: Fri, 29 Nov 2024 13:54:12 +0800
Subject: [PATCH 03/22] =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=BF=AE=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../opencv_rectangle_detection/python/README.md | 2 +-
.../python/images/img_rectangle.png | Bin 0 -> 7649 bytes
.../python/images/results.png | Bin 2777 -> 0 bytes
3 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 example/opencv_example/opencv_rectangle_detection/python/images/img_rectangle.png
delete mode 100644 example/opencv_example/opencv_rectangle_detection/python/images/results.png
diff --git a/example/opencv_example/opencv_rectangle_detection/python/README.md b/example/opencv_example/opencv_rectangle_detection/python/README.md
index 0acdd3c..c932692 100644
--- a/example/opencv_example/opencv_rectangle_detection/python/README.md
+++ b/example/opencv_example/opencv_rectangle_detection/python/README.md
@@ -197,7 +197,7 @@ python test_rectangle.py
矩形检测结果图片
-
+
diff --git a/example/opencv_example/opencv_rectangle_detection/python/images/img_rectangle.png b/example/opencv_example/opencv_rectangle_detection/python/images/img_rectangle.png
new file mode 100644
index 0000000000000000000000000000000000000000..443bec4a97a237159ada9e228acbef120e2986ad
GIT binary patch
literal 7649
zcmeAS@N?(olHy`uVBq!ia0y~yV3K8EVBEyP1Qa>H;Gq};gX{`V7srr_xa2?o|Jxtd
zkl<~+C;%lGwOSc2XL$6r9mwG5fe;L$&Iw!MBz^rBD;h{KfeD_)Ur%KyA?aJ9XmBfD
z(svd@$rYZ)i&d#6w!H|Gu4ymMOfX?_bA}KbfHL)|Cb)`8)OE7E6Q*kiEzYXTB)
zffk*Gt6H$qp|am-mYF-$J3tj6d#Ub0hqD3_Ys1|x
zUxr5r*kx=8m$7AY^n3%Vc!s0`7_ij$;0j45P{dbBArcJ8Wr(D5AOR@z?^MPu8H5T@
zz~YTTay-aj3Q3dxh=>QdObRJUu7M=U*+?pYDF=THlHIUjp5VZ_1#glB
zryRU7NR|i5$#dY8gEt1r@gO;Q4xDoE#~?W#94%C^l$zw^IdEw`XbTmc#ev2ZP7M;LSTX5|j{9&~29<94cZ7+}3-B_wNa7P4h>x-N+Z?r>zt;d74z1)^9l_2AL2iER>
z0_i7pVCyF_ShD=m^9`&TiW
zs!3pf8$+m5f{AXg+LD9da-vyDwoi)sXwMN*&5w>7gU9<(n?qC@
z7^h9sg`A3)MwJse9wcY9hH(3ZEDzGAiA#W(Y`0qeNT$}LxZbO
aVPM=ZQCxBTsw8mgmci52&t;ucLK6Tn`U`e`3!uJrEaIzLJ9iRW@QN85$#;~6$Qd;Oc8!N5I@AwtENL1&UAgV;$P
zhVB%$23I5I14=U)6DFQv*x)fLO;)hndK$j3uJ-SWzkip!U(fO{!szmAcD7^xj{J-~
zkZu(0m7G)Hb(kHR5j-5I8&fzyfmeaaiZk8
zlx0)S7$_JWo_S`geIgNzP0oZtbOmL?%E^Px|g*GV2`CF40KeKcn#I;6B2
z4?9D?u0QkS_tysP(eN0S(K`r}d|kTQeSh{lU1&M+gVz5)FSU$oR6yA?e4^yK6Tm$8
zFf^r28L}xzi0_D><*R&l-A})N@0a$&Ax-M
Date: Fri, 29 Nov 2024 13:55:37 +0800
Subject: [PATCH 04/22] =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=BF=AE=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
example/opencv_example/opencv_edge_detection/python/README.md | 3 ---
1 file changed, 3 deletions(-)
diff --git a/example/opencv_example/opencv_edge_detection/python/README.md b/example/opencv_example/opencv_edge_detection/python/README.md
index 4292817..f86175c 100644
--- a/example/opencv_example/opencv_edge_detection/python/README.md
+++ b/example/opencv_example/opencv_edge_detection/python/README.md
@@ -149,9 +149,6 @@ python test_canny.py

-阈值操作结果图片
-
-
--
Gitee
From 3ca9ef792a59099d4806618b61a61ff66b9049b1 Mon Sep 17 00:00:00 2001
From: gu12530 <2629144335@qq.com>
Date: Fri, 29 Nov 2024 14:11:45 +0800
Subject: [PATCH 05/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=89=E8=A7=92?=
=?UTF-8?q?=E5=BD=A2=E6=A3=80=E6=B5=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../opencv_edge_detection/README.md | 2 +-
.../opencv_edge_detection/python/README.md | 2 +-
.../opencv_rectangle_detection/README.md | 3 +-
.../python/README.md | 2 +-
.../opencv_triangle_detection/README.md | 40 ++++
.../python/README.md | 202 ++++++++++++++++++
.../python/images/dowmresult.png | Bin 0 -> 32943 bytes
.../python/images/result_triangle.png | Bin 0 -> 7660 bytes
.../python/images/run.png | Bin 0 -> 52907 bytes
.../python/images/triangle.png | Bin 0 -> 5952 bytes
.../python/images/uploads.png | Bin 0 -> 31419 bytes
.../python/test_trangle.py | 41 ++++
12 files changed, 288 insertions(+), 4 deletions(-)
create mode 100644 example/opencv_example/opencv_triangle_detection/README.md
create mode 100644 example/opencv_example/opencv_triangle_detection/python/README.md
create mode 100644 example/opencv_example/opencv_triangle_detection/python/images/dowmresult.png
create mode 100644 example/opencv_example/opencv_triangle_detection/python/images/result_triangle.png
create mode 100644 example/opencv_example/opencv_triangle_detection/python/images/run.png
create mode 100644 example/opencv_example/opencv_triangle_detection/python/images/triangle.png
create mode 100644 example/opencv_example/opencv_triangle_detection/python/images/uploads.png
create mode 100644 example/opencv_example/opencv_triangle_detection/python/test_trangle.py
diff --git a/example/opencv_example/opencv_edge_detection/README.md b/example/opencv_example/opencv_edge_detection/README.md
index 623dca5..7f5f992 100644
--- a/example/opencv_example/opencv_edge_detection/README.md
+++ b/example/opencv_example/opencv_edge_detection/README.md
@@ -30,7 +30,7 @@
## 1 简介
在现代计算机视觉应用中,边缘检测是一项基础而重要的任务,它能够帮助系统理解和解析图像中的关键结构信息。边缘检测技术广泛应用于图像分割、目标识别、特征提取等多个领域。
-本指南将详细介绍如何使用OpenCV库在凌智视觉模块上部署高效的边缘检测算法,旨在为开发者提供一个清晰、实用的操作步骤。
+本指南将详细介绍如何使用 OpenCV 库在凌智视觉模块上部署高效的边缘检测算法,旨在为开发者提供一个清晰、实用的操作步骤。
## 2 在凌智视觉模块上部署边缘检测案例
diff --git a/example/opencv_example/opencv_edge_detection/python/README.md b/example/opencv_example/opencv_edge_detection/python/README.md
index f86175c..1ffd553 100644
--- a/example/opencv_example/opencv_edge_detection/python/README.md
+++ b/example/opencv_example/opencv_edge_detection/python/README.md
@@ -30,7 +30,7 @@
## 1 简介
在现代计算机视觉应用中,边缘检测是一项基础而重要的任务,它能够帮助系统理解和解析图像中的关键结构信息。边缘检测技术广泛应用于图像分割、目标识别、特征提取等多个领域。
-本指南将详细介绍如何使用OpenCV库在凌智视觉模块上部署高效的边缘检测算法,旨在为开发者提供一个清晰、实用的操作步骤。
+本指南将详细介绍如何使用 OpenCV 库在凌智视觉模块上部署高效的边缘检测算法,旨在为开发者提供一个清晰、实用的操作步骤。
## 2 Python API 文档
diff --git a/example/opencv_example/opencv_rectangle_detection/README.md b/example/opencv_example/opencv_rectangle_detection/README.md
index 8290a51..2d9b97f 100644
--- a/example/opencv_example/opencv_rectangle_detection/README.md
+++ b/example/opencv_example/opencv_rectangle_detection/README.md
@@ -29,7 +29,8 @@
## 1 简介
-在现代计算机视觉应用中,矩形检测是一项基本但重要的任务,广泛应用于物体识别、场景理解、文档扫描等领域。本指南将详细介绍如何使用OpenCV库在凌智视觉模块上部署高效的矩形检测算法。
+在现代计算机视觉应用中,矩形检测是一项基本但重要的任务,广泛应用于物体识别、场景理解、文档扫描等领域。本指南将详细介绍如何使用 OpenCV 库在凌智视觉模块上部署高效的矩形检测算法。
+
## 2 在凌智视觉模块上部署矩形检测案例
下载模型后,请参考以下教程使用 Python 在凌智视觉模块上部署分类模型例程:
diff --git a/example/opencv_example/opencv_rectangle_detection/python/README.md b/example/opencv_example/opencv_rectangle_detection/python/README.md
index c932692..43a93d8 100644
--- a/example/opencv_example/opencv_rectangle_detection/python/README.md
+++ b/example/opencv_example/opencv_rectangle_detection/python/README.md
@@ -29,7 +29,7 @@
## 1 简介
-在现代计算机视觉应用中,矩形检测是一项基本但重要的任务,广泛应用于物体识别、场景理解、文档扫描等领域。本指南将详细介绍如何使用OpenCV库在凌智视觉模块上部署高效的矩形检测算法。 本文将详细介绍如何使用 OpenCV 库在凌智视觉模块上实现高效的矩形检测功能。
+在现代计算机视觉应用中,矩形检测是一项基本但重要的任务,广泛应用于物体识别、场景理解、文档扫描等领域。本指南将详细介绍如何使用 OpenCV 库在凌智视觉模块上部署高效的矩形检测算法。 本文将详细介绍如何使用 OpenCV 库在凌智视觉模块上实现高效的矩形检测功能。
## 2 Python API 文档
diff --git a/example/opencv_example/opencv_triangle_detection/README.md b/example/opencv_example/opencv_triangle_detection/README.md
new file mode 100644
index 0000000..9a31085
--- /dev/null
+++ b/example/opencv_example/opencv_triangle_detection/README.md
@@ -0,0 +1,40 @@
+凌智视觉模块 OpenCV 三角形检测部署指南
+
+发布版本:V0.0.0
+
+日期:2024-11-29
+
+文件密级:□绝密 □秘密 □内部资料 ■公开
+
+---
+
+**免责声明**
+
+本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。
+
+由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。
+
+**读者对象**
+
+本教程适用于以下工程师:
+
+- 技术支持工程师
+- 软件开发工程师
+
+**修订记录**
+
+| **日期** | **版本** | **作者** | **修改说明** |
+|:-----------| -------- |--------| ------------ |
+| 2024/11/29 | 0.0.0 | 钟海滨 | 初始版本 |
+
+## 1 简介
+
+在计算机视觉领域,形状检测是一项基本而重要的任务,尤其在工业检测、机器人导航、图像分析等领域有着广泛应用。本指南将详细介绍如何使用 OpenCV 库在凌智视觉模块上部署三角形检测功能。
+
+## 2 在凌智视觉模块上部署三角形检测案例
+
+下载模型后,请参考以下教程使用 Python 在凌智视觉模块上部署分类模型例程:
+
+- [凌智视觉模块 OpenCV 三角形检测 Python 部署指南](./python/README.md)
+
+
diff --git a/example/opencv_example/opencv_triangle_detection/python/README.md b/example/opencv_example/opencv_triangle_detection/python/README.md
new file mode 100644
index 0000000..613ce59
--- /dev/null
+++ b/example/opencv_example/opencv_triangle_detection/python/README.md
@@ -0,0 +1,202 @@
+凌智视觉模块 OpenCV 矩形检测 Python 部署指南
+
+发布版本:V0.0.0
+
+日期:2024-11-29
+
+文件密级:□绝密 □秘密 □内部资料 ■公开
+
+---
+
+**免责声明**
+
+本文档按**现状**提供,福州凌睿智捷电子有限公司(以下简称**本公司**)不对本文档中的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、适用性及非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。
+
+由于产品版本升级或其他原因,本文档可能在未经任何通知的情况下不定期更新或修改。
+
+**读者对象**
+
+本教程适用于以下工程师:
+
+- 技术支持工程师
+- 软件开发工程师
+
+**修订记录**
+
+| **日期** | **版本** | **作者** | **修改说明** |
+|:-----------| -------- |--------| ------------ |
+| 2024/11/29 | 0.0.0 | 钟海滨 | 初始版本 |
+
+## 1 简介
+
+在现代计算机视觉应用中,矩形检测是一项基本但重要的任务,广泛应用于物体识别、场景理解、文档扫描等领域。本指南将详细介绍如何使用 OpenCV 库在凌智视觉模块上部署高效的矩形检测算法。 本文将详细介绍如何使用 OpenCV 库在凌智视觉模块上实现高效的矩形检测功能。
+
+## 2 Python API 文档
+
+```python
+
+def cvtColor(src, code, dstCn=0):
+ """
+ 转换图像颜色空间。
+ 参数:
+ - src: 输入图像。
+ - code: 颜色空间转换代码。
+ - dstCn: 目标图像的通道数,如果为0则根据code自动确定。
+ 返回:
+ - 转换后的图像。
+ """
+ return cv2.cvtColor(src, code, dstCn)
+
+def GaussianBlur(src, ksize, sigmaX, sigmaY=0, borderType=cv2.BORDER_DEFAULT):
+ """
+ 使用高斯滤波模糊图像。
+ 参数:
+ - src: 输入图像。
+ - ksize: 高斯核的大小,必须是奇数。
+ - sigmaX: 高斯核在X方向的标准差。
+ - sigmaY: 高斯核在Y方向的标准差,如果为0则与sigmaX相同。
+ - borderType: 图像边界的处理方式,默认为cv2.BORDER_DEFAULT。
+ 返回:
+ - 模糊后的图像。
+ """
+ temp_ksize = convert2size(ksize)
+ return cv2.GaussianBlur(src, temp_ksize, sigmaX, sigmaY, borderType)
+
+def threshold(src, thresh, maxval, type):
+ """
+ 对图像应用阈值处理。
+ 参数:
+ - src: 输入图像。
+ - thresh: 阈值。
+ - maxval: 阈值处理后的最大值。
+ - type: 阈值处理的类型。
+ 返回:
+ - 计算出的阈值。
+ - 阈值处理后的图像。
+ """
+ computed_threshold, dst = cv2.threshold(src, thresh, maxval, type)
+ return computed_threshold, dst
+
+def drawContours(img, contours, contourIdx, color, thickness=1, lineType=8, shift=0):
+ """
+ 在图像上绘制轮廓。
+ 参数:
+ - img: 输入图像。
+ - contours: 要绘制的轮廓列表。
+ - contourIdx: 要绘制的轮廓索引,-1表示绘制所有轮廓。
+ - color: 轮廓的颜色。
+ - thickness: 轮廓线的厚度。
+ - lineType: 轮廓线的类型。
+ - shift: 轮廓坐标的小数位数。
+ """
+ temp_color = convert2scalar(color)
+ cv2.drawContours(img, contours, contourIdx, temp_color, thickness, lineType, shift)
+
+def findContours(image, mode, method, point=cv2.Point()):
+ """
+ 在二值图像中检测轮廓。
+ 参数:
+ - image: 输入的二值图像。
+ - mode: 轮廓的检索模式。
+ - method: 轮廓的近似方法。
+ - point: 轮廓检索的起始点。
+ 返回:
+ - 检测到的轮廓列表。
+ - 轮廓的层次结构。
+ """
+ contours, hierarchy = cv2.findContours(image, mode, method, point)
+ return contours, hierarchy
+
+def arcLength(curve, closed):
+ """
+ 计算曲线的长度。
+ 参数:
+ - curve: 输入的曲线,由点序列组成。
+ - closed: 曲线是否封闭。
+ 返回:
+ - 曲线的长度。
+ """
+ return cv2.arcLength(curve, closed)
+
+
+def approxPolyDP(curve, epsilon, closed):
+ """
+ 使用Douglas-Peucker算法近似曲线。
+ 参数:
+ - curve: 输入的曲线,由点序列组成。
+ - epsilon: 近似精度,通常为原始曲线长度的百分之一。
+ - closed: 曲线是否封闭。
+ 返回:
+ - 近似后的曲线。
+ """
+ return cv2.approxPolyDP(curve, epsilon, closed)
+
+```
+
+## 3 在凌智视觉模块上进行边缘检测案例
+
+为了方便大家入手,我们提供了 OpenCV 矩形检测的 Python 例程。该程序可以使用摄像头进行端到端推理。
+**测试图片下载链接:**[矩形检测图片](https://gitee.com/LockzhinerAI/LockzhinerVisionModule/releases/download/v0.0.4/rectangle.png)
+
+```python
+import lockzhiner_vision_module.cv2 as cv2
+# 读取图像
+image = cv2.imread('rectangle.png')
+gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
+# 高斯模糊
+blurred = cv2.GaussianBlur(gray, (5, 5), 0)
+# 二值化
+_, binary = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV)
+edges = cv2.Canny(binary, 30, 200)
+contours, _ = cv2.findContours(edges.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
+for contour in contours:
+ # 近似轮廓
+ # 计算轮廓周长
+ epsilon = 0.02 * cv2.arcLength(contour, True)
+ # 将轮廓近似为多边形
+ approx = cv2.approxPolyDP(contour, epsilon, True)
+ # 如果近似轮廓有4个顶点,则认为是矩形
+ if len(approx) == 4:
+ cv2.drawContours(image, [approx], -1, (0, 255, 0), 2)
+cv2.imwrite('img_rectangle.png', image)
+
+```
+## 4 上传并测试 Python 程序
+
+参考 [连接设备指南](../../../../docs/introductory_tutorial/connect_device_using_ssh.md) 正确连接 Lockzhiner Vision Module 设备。
+
+
+
+请使用 Electerm Sftp 依次上传以下文件:
+
+- 进入存放 **test_rectangle.py** 脚本文件的目录,将 **test_rectangle.py** 上传到 Lockzhiner Vision Module
+- 进入存放 **待检测图片** 存放的目录,将 **待检测图片** 上传到 Lockzhiner Vision Module
+
+上传文件
+
+
+
+请使用 Electerm Ssh 并在命令行中执行以下命令:
+
+```bash
+python test_rectangle.py
+```
+
+运行程序后,屏幕上输出
+
+
+
+下载结果
+
+
+
+矩形检测原图
+
+
+
+矩形检测结果图片
+
+
+
+
+
diff --git a/example/opencv_example/opencv_triangle_detection/python/images/dowmresult.png b/example/opencv_example/opencv_triangle_detection/python/images/dowmresult.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6f5c90339fa3cc57b69bdf55715098ae505812a
GIT binary patch
literal 32943
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