opencv识别形状
时间: 2025-01-23 11:11:55 AIGC 浏览: 43
### 使用OpenCV实现形状识别
#### 图像读取与显示
为了进行形状识别,首先需要加载待分析的图像。这可以通过 `cv2.imread()` 函数完成[^2]。
```python
import cv2
img = cv2.imread('shapes.png')
cv2.imshow('Original Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
#### 预处理阶段
接着是对输入图片做必要的预处理工作,比如转换成灰度图并应用二值化操作来简化后续计算过程。
```python
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
#### 轮廓提取
利用阈值化的图像可以更容易找到目标对象的边界即轮廓。`findContours` 方法能够帮助定位到所有的封闭区域,并返回它们的信息列表[^1]。
```python
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
#### 形状分类
对于每一个检测出来的轮廓,可以根据其几何特性来进行简单的形状判断。例如,通过近似多边形顶点的数量决定它属于哪种基础图形类别——圆形、三角形还是矩形等。
```python
for cnt in contours:
epsilon = 0.02 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
if len(approx) == 3:
shape_name = "Triangle"
elif len(approx) == 4:
x, y, w, h = cv2.boundingRect(approx)
aspect_ratio = float(w)/h
if 0.95 <= aspect_ratio <= 1.05:
shape_name = "Square"
else:
shape_name = "Rectangle"
elif len(approx) > 8 and (len(approx) < 23):
shape_name = "Circle"
M = cv2.moments(cnt)
cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])
# 绘制轮廓和文字标签
cv2.drawContours(img, [cnt], -1, (0, 255, 0), 3)
cv2.putText(img, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('Detected Shapes', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
此段代码展示了如何基于轮廓特征对常见简单几何体做出初步辨识,并标注于原始图像之上以便直观查看结果。
阅读全文
相关推荐


















