基于python opencv识别图形,打印出其形状和颜色
时间: 2023-11-14 21:06:12 浏览: 46
要识别图像中的形状和颜色,你可以使用Python和OpenCV来进行处理。下面是一个示例代码,演示了如何识别图像中的形状和颜色,并打印出它们:
```python
import cv2
import numpy as np
def get_shape(cnt):
# 计算轮廓的周长
perimeter = cv2.arcLength(cnt, True)
# 使用近似多边形方法将轮廓形状近似为多边形
approx = cv2.approxPolyDP(cnt, 0.04 * perimeter, True)
# 根据多边形的边数来确定形状
if len(approx) == 3:
shape = "Triangle"
elif len(approx) == 4:
shape = "Rectangle"
elif len(approx) == 5:
shape = "Pentagon"
else:
shape = "Circle"
return shape
def get_color(hsv_image, cnt):
# 计算轮廓的掩模
mask = np.zeros(hsv_image.shape[:2], dtype=np.uint8)
cv2.drawContours(mask, [cnt], -1, (255), thickness=cv2.FILLED)
# 计算掩模中的平均颜色
mean_color = cv2.mean(hsv_image, mask=mask)[:3]
# 根据颜色范围确定颜色
if mean_color[0] > 90 and mean_color[0] < 130: # 蓝色范围
color = "Blue"
elif mean_color[0] > 0 and mean_color[0] < 30: # 红色范围
color = "Red"
elif mean_color[0] > 30 and mean_color[0] < 90: # 绿色范围
color = "Green"
else:
color = "Other"
return color
# 读取图像
image = cv2.imread('image.jpg')
# 将图像从BGR转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Canny边缘检测算法检测边缘
edges = cv2.Canny(gray_image, 50, 150)
# 找到图像中的轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 对每个轮廓进行处理
for cnt in contours:
# 忽略过小的轮廓
if cv2.contourArea(cnt) < 100:
continue
# 获取形状和颜色
shape = get_shape(cnt)
color = get_color(hsv_image, cnt)
# 在原始图像上绘制形状和颜色信息
cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)
cv2.putText(image, shape, (cnt[0][0][0], cnt[0][0][1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
cv2.putText(image, color, (cnt[0][0][0], cnt[0][0][1] + 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 显示结果图像
cv2.imshow('Shape and Color Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这个示例中,我们首先将图像从BGR颜色空间转换为HSV颜色空间,并将其转换为灰度图像。然后,我们使用Canny边缘检测算法找到图像中的边缘。接下来,我们找到图像中的轮廓,并对每个轮廓进行处理。通过计算轮廓的形状和颜色,我们可以确定物体的形状和颜色。最后,我们在原始图像上绘制出识别到的形状和颜色,并显示结果图像。
请注意,这只是一个基本的示例代码,你可以根据实际情况进行调整和改进。