qt OpenCV 去除坐标相同的轮廓
时间: 2023-07-12 14:03:59 浏览: 47
在 OpenCV 中,可以使用 `cv2.findContours()` 函数来检测图像中的轮廓。如果要去除坐标相同的轮廓,可以使用以下方法:
1. 首先,使用 `cv2.findContours()` 函数检测出所有的轮廓。
2. 然后,对于每个轮廓,计算其所有点的平均值,即可得到轮廓的中心点坐标。
3. 接着,使用一个集合(set)来存储已经出现过的中心点坐标,如果当前轮廓的中心点坐标已经在集合中出现过,则说明该轮廓与之前的某个轮廓的中心点坐标相同,因此可以将其删除。
4. 最后,将剩余的轮廓绘制出来即可。
以下是示例代码:
```python
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 用于存储已经出现过的中心点坐标
center_set = set()
# 遍历所有轮廓
for contour in contours:
# 计算轮廓的中心点坐标
M = cv2.moments(contour)
cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])
# 如果该中心点坐标已经出现过,则说明该轮廓与之前的某个轮廓的中心点坐标相同,因此可以将其删除
if (cx, cy) in center_set:
continue
# 将当前中心点坐标加入集合中
center_set.add((cx, cy))
# 绘制剩余的轮廓
cv2.drawContours(img, [contour], 0, (0, 0, 255), 2)
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这个示例代码中,我们首先读取一张图像,并将其转换为灰度图像。然后使用 `cv2.threshold()` 函数对图像进行二值化处理,接着使用 `cv2.findContours()` 函数查找轮廓。
接下来,我们使用一个集合 `center_set` 来存储已经出现过的中心点坐标。对于每个轮廓,我们计算其中心点坐标,并判断该中心点坐标是否已经在集合中出现过,如果出现过,则说明该轮廓与之前的某个轮廓的中心点坐标相同,因此可以将其删除。如果中心点坐标没有出现过,则将其加入集合中,并绘制该轮廓。
最后,我们将剩余的轮廓绘制出来,并显示结果。