opencv识别不同形状物体
时间: 2025-05-12 11:56:46 浏览: 20
### 使用OpenCV进行多种形状物体的检测与识别
#### 图像预处理
为了有效地区分不同的几何形状,在开始之前通常需要对输入图像执行一系列预处理操作。这包括但不限于灰度化转换、噪声去除以及边缘增强等步骤,以便后续能够更清晰地提取目标特征[^2]。
```python
import cv2
import numpy as np
# 加载原始彩色图片并转成灰度图
image = cv2.imread('shapes.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊减少噪音干扰
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
```
#### 边缘检测
采用Canny算子或其他方法可以有效地找到图像中的边界线段,这对于定位封闭区域内的特定图形至关重要。经过此阶段后得到的结果将是二值化的边框表示形式,其中白色像素代表可能存在的轮廓位置。
```python
# Canny Edge Detection
edges = cv2.Canny(blurred, 50, 150)
```
#### 轮廓发现
利用`findContours()`函数可以从上述获得的边缘映射里检索到所有的连通域,并返回它们各自的坐标集合。对于每一个这样的闭合路径而言,还可以进一步计算其近似多边形以简化描述方式,从而便于之后判断具体属于哪种标准形态。
```python
contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
perimeter = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.04 * perimeter, True)
if len(approx) == 3:
shape_name = "Triangle"
elif len(approx) == 4:
x,y,w,h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h
if 0.95 <= aspect_ratio <= 1.05:
shape_name = "Square"
else:
shape_name = "Rectangle"
elif len(approxx) >= 5 and len(approx)<=7 :
shape_name="Pentagon" #五角星的情况较为复杂,这里简单假设为五边形
elif len(approx)>8:
shape_name = "Circle"
# 绘制轮廓及其标签
M = cv2.moments(cnt)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
cv2.drawContours(image,[cnt],-1,(0,255,0),2)
cv2.putText(image,shape_name,(cX,cY),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),2)
```
#### 形状分类
基于前面获取的信息——即每条轮廓所对应的顶点数量,就可以轻松判定当前对象最接近于哪一类已知的标准模型(如三角形、正方形/矩形、圆圈)。值得注意的是,实际应用场景下可能会遇到更多种类或者不规则的对象,因此还需要考虑额外的因素来进行更为精确的区别对待。
阅读全文
相关推荐














