树莓派5应用实例——工创视觉
前言
各位小伙伴,大家好。欢迎来到本章学习内容的第六节,实战篇。在上一小节中,我们已经把要使用到的模块进行模块测试,都没有问题,所以本小节我们直接奉上代码,不过代码并不是最终版本的代码(往各位小伙伴理解),因为该教程只是想让小伙伴们掌握开发流程,不过相信小伙伴们在此基础上修改,也可以到达最好的效果,希望对各位小伙伴有所帮助。本人学识较浅,如有讲的不对的地方,还请各位批评指正,谢谢。
下面这个链接是在调整颜色阈值时,可能用到的小工具:
https://www.rapidtables.com/web/color/RGB_Color.html
效果展示
原图
hsv图
二值化图
代码展示
import cv2
import numpy as np
cv2.namedWindow('img1', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img1', 640, 480)
cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img2', 640, 480)
def find_green_ring(image_path):
# 读取图像
img = cv2.imread(image_path)
if img is None:
print("无法读取图像")
return
# 转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
closedv = cv2.morphologyEx(v, cv2.MORPH_CLOSE, kernel)
# 定义绿色的HSV范围
lower_green = np.array([35, 50, 50])
upper_green = np.array([85, 255, 255])
# 根据HSV范围创建掩膜
mask = cv2.inRange(hsv, lower_green, upper_green)
# 进行形态学闭操作,连接断开的像素点
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
cv2.imshow('img2', mask)
# 寻找轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow('img1', hsv)
if len(contours) > 0:
# 存储所有圆形的相关信息(圆心、半径)
circles = []
for contour in contours:
# 计算最小外接圆
(x, y), radius = cv2.minEnclosingCircle(contour)
center = (int(x), int(y))
radius = int(radius)
circles.append((center, radius))
# 找到最大半径的圆
max_radius = 0
max_circle = None
for circle in circles:
_, radius = circle
if radius > max_radius:
max_radius = radius
max_circle = circle
if max_circle is not None:
center, radius = max_circle
cv2.circle(img, center, radius, (0, 255, 0), 2)
# 对圆心进行十字架标注
cross_length = 10
cv2.line(img, (int(center[0] - cross_length), int(center[1])), (int(center[0] + cross_length), int(center[1])),
(0, 0, 255), 4)
cv2.line(img, (int(center[0]), int(center[1] - cross_length)), (int(center[0]), int(center[1] + cross_length)),
(0, 0, 255), 4)
# 对整个圆进行矩形标注
top_left = (int(center[0] - radius), int(center[1] - radius))
bottom_right = (int(center[0] + radius), int(center[1] + radius))
cv2.rectangle(img, top_left, bottom_right, (255, 0, 0), 4)
# 缩放图像以减小分辨率
new_width = 640
new_height = 480
img = cv2.resize(img, (new_width, new_height))
cv2.imshow('Green Ring Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
image_path = 'img4.jpg' # 替换为实际的图像路径
find_green_ring(image_path)
结束语
本节教学中,要想识别色环的效果更好,建议可以把二值化的圆环连接起来处理效果更好,感谢各位小伙伴的阅读。