opencv形状识别
时间: 2024-12-26 11:15:34 浏览: 9
### 使用 OpenCV 进行形状识别
#### 图像预处理
为了有效地进行形状识别,通常需要先对输入图像进行预处理。这一步骤可以提高后续操作的效果和准确性。
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 加载彩色图像并转换成灰度模式
image_path = 'path_to_image'
img = cv2.imread(image_path, 1)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.figure(figsize=(10, 5))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(gray_img, cmap='gray'), plt.title('Gray Scale Image')
plt.axis('off')
plt.show()
```
#### 边缘检测与形态学操作
通过边缘检测算法(如 Canny Edge Detection),可以从二值化后的图像中获取物体边界信息,并应用闭运算去除噪声点。
```python
blurred = cv2.GaussianBlur(gray_img, (5, 5), 0) # 高斯模糊减少噪音影响
edges = cv2.Canny(blurred, 30, 150) # 应用Canny算子寻找边缘
kernel = np.ones((5, 5), np.uint8)
closed_edges = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
plt.figure(figsize=(10, 5))
plt.subplot(131), plt.imshow(edges, cmap='gray'), plt.title('Edges Detected by Canny')
plt.axis('off')
plt.subplot(132), plt.imshow(closed_edges, cmap='gray'), plt.title('After Morphological Closing Operation')
plt.axis('off')
plt.show()
```
#### 轮廓发现及筛选特定几何图形
接下来,在经过上述处理得到的结果上找到所有的轮廓,并依据某些条件过滤出感兴趣的几何体——比如矩形或其他多边形结构。
```python
contours, hierarchy = cv2.findContours(closed_edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]
for cnt in contours:
epsilon = 0.02 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
if len(approx) == 4: # 如果近似曲线有四个顶点,则认为是一个四边形
rect = cv2.minAreaRect(approx)
box = cv2.boxPoints(rect)
box = np.intp(box)
# 绘制矩形框标记出来
cv2.drawContours(img,[box],0,(0,255,0),2)
plt.figure(figsize=(10, 5))
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Detected Rectangles')
plt.axis('off')
plt.show()
```
此过程展示了如何使用 OpenCV 来完成基本的形状识别任务,特别是针对矩形对象的定位[^1]。除了矩形之外,还可以调整 `approx` 的长度判断逻辑来适应其他类型的封闭区域,例如三角形、五角星等不同数量边数的多边形。
阅读全文