eefocus_3914144 发表于 2025-10-7 09:48:19

【AIMB-2210】实现边缘检测

要实现边缘检测,需要安装一些必要的库:
1、安装opencv:

```
sudo apt install libopencv-dev python3-opencv
```

安装好后验证:

```
lugl@lugl:~$ python3 -c "import cv2; print(cv2.__version__)"
4.12.0
```

2、安装四个依赖库

- numpy
- request
- opencv-python
- opencv-contrib-python
使用pip安装即可
3、编写测试代码如下:

```
import cv2
import requests
import numpy as np

url = 'http://192.168.3.117/stream'# UNIHIKER K10的IP地址

cv2.namedWindow("live transmission", cv2.WINDOW_AUTOSIZE)# 创建一个窗口用于显示实时图像

# 启动 HTTP 请求获取视频流
try:
    response = requests.get(url, stream=True, timeout=10)
    print("Connected to stream")
   
    img_data = b''# 用于存储接收到的图像数据
   
    # 按块读取数据
    for chunk in response.iter_content(chunk_size=1024):
      if chunk:
            img_data += chunk# 将接收到的数据累加到 img_data 中

            # 判断是否接收到完整的 JPEG 数据
            start_idx = img_data.find(b'\xff\xd8')# 查找 JPEG 开始标志
            end_idx = img_data.find(b'\xff\xd9')    # 查找 JPEG 结束标志

            if start_idx != -1 and end_idx != -1:
                jpg_data = img_data# 提取出完整的 JPEG 数据

                # 转换为 NumPy 数组
                img_np = np.frombuffer(jpg_data, dtype=np.uint8)
                img = cv2.imdecode(img_np, cv2.IMREAD_COLOR)# 解码 JPEG 图像数据

                if img is not None:
                  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将图像转换为灰度图像
                  canny = cv2.Canny(cv2.GaussianBlur(gray, (11, 11), 0), 30, 150, 3)# 使用Canny算法进行边缘检测
                  dilated = cv2.dilate(canny, (1, 1), iterations=2)# 对边缘图像进行膨胀操作
                  contours, _ = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# 查找轮廓
                  cv2.drawContours(img, contours, -1, (0, 255, 0), 2)# 在原始图像上绘制轮廓

                  cv2.imshow("mit contour", canny)# 显示边缘检测结果图像
                  cv2.imshow("live transmission", img)# 显示实时图像

                  # 按下 'q' 键退出
                  if cv2.waitKey(1) & 0xFF == ord('q'):
                        break

                # 清除已处理的数据
                img_data = img_data# 移除已处理的图像数据部分
      else:
            print("No data received!")

except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

cv2.destroyAllWindows()
```

基中url = 'http://192.168.3.117/stream'# UNIHIKER K10的IP地址是我的一个行空板的无线摄像头的网页视频地址。
4、执行效果:

!(https://www.eefocus.com/forum/data/attachment/forum/202510/07/094753qwfawwlp1qmskm2f.png)

界面非常流畅。


页: [1]
查看完整版本: 【AIMB-2210】实现边缘检测