该测试基于上一次的网络图传,可以参见我的上一篇帖子【M5CoreS3测评】网络图传-电子产品世界论坛
在开始测试之前,需要在电脑上安装numpy、opencv-python以及opencv-contrib-python库
完成库的安装后,安装网络图传的步骤,利用M5CoreS3的屏幕显示得到摄像头画面的网址
在电脑端,编写Python代码如下,其中url地址为M5CoreS3屏幕显示的网址
其运行步骤为:从url获取图像并进行预处理 -> 基于openCV中相关算法获取边缘轮廓 -> 将获取结果展示在窗口
import cv2 import urllib.request import numpy as np url = 'http://192.168.1.15:80/capture' # M5CoreS3的IP地址 cv2.namedWindow("live transmission", cv2.WINDOW_AUTOSIZE) # 创建一个窗口用于显示实时图像 while True: img_resp = urllib.request.urlopen(url) # 从URL获取图像数据 imgnp = np.array(bytearray(img_resp.read()), dtype=np.uint8) # 将图像数据转换为NumPy数组 img = cv2.imdecode(imgnp, -1) # 解码JPEG图像数据 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) # 查找轮廓 k = img cv2.drawContours(k, 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 cv2.destroyAllWindows()
检测效果如下,可以看到检测出了我的手
边缘检测采用的是Canny算法,其中cv2.Canny的传参如下,返回值是一个包含边缘信息的二值图像
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
参数说明
image:输入图像,必须为单通道灰度图像
threshold1:第一个阈值,用于边缘检测
threshold2:第二个阈值,用于边缘检测
edges:输出的边缘图像
apertureSize:Sobel算子的大小,可选值为3、5、7,默认值为3
L2gradient:是否使用L2范数计算梯度大小,可选值为True和False,默认值为False
如果只要检测最明显的物体,可以适当增大threshold2,这样检测到的就是和环境对比度大的物体