cv2.findContours()获取轮廓顶点坐标,cv2.drawContours()画出轮廓

输入该图片,想得到下图白色区域的顶点坐标以便可以画出他们的轮廓。

 

代码如下:

import cv2
import numpy as np
np.set_printoptions(threshold=np.inf)
img=cv2.imread('synthesized_image_0.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# contours[2]输出第二个物体的顶点坐标
print(str(contours[2].reshape(-1)).replace('\n',',').replace(' ',',').replace(',,',',').replace(',,',',').replace('[,','['))
# 将轮廓画到原图,-1表示全部绘制
cv2.drawContours(img, contours, -1, (0, 0, 255), 3)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyWindow("img")

得到的结果是第二个对象的坐标,xy坐标交替,必为偶数个

可视化结果为

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
这段代码使用 OpenCV 库实现了从摄像头读取视频流,并进行 Canny 边缘检测和轮廓检测,最后在图像上绘制出检测到的轮廓。具体解读如下: 1. `import cv2` 导入 OpenCV 库。 2. `ret = cv2.VideoCapture(1)` 打开编号为 1 的摄像头,返回一个 VideoCapture 对象。 3. `getcontours(img)` 定义了一个函数,用于进行轮廓检测。输入参数为一个灰度图像 `img`,返回值为检测到的轮廓。 4. `contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)` 调用 `cv2.findContours()` 函数进行轮廓检测。其中 `cv2.RETR_EXTERNAL` 表示只检测最外层轮廓,`cv2.CHAIN_APPROX_NONE` 表示不对检测到的轮廓进行压缩。 5. `for cnt in contours:` 遍历检测到的每一个轮廓。 6. `area = cv2.contourArea(cnt)` 计算轮廓的面积。 7. `if area > 20000:` 如果轮廓的面积大于 20000,说明可能是需要检测的目标,继续下面的处理。 8. `cv2.drawContours(imgcontour, cnt, -1, (0, 0, 255), 2)` 在图像 `imgcontour` 上绘制检测到的轮廓。 9. `peri = cv2.arcLength(cnt, True)` 计算轮廓的周长。 10. `approx = cv2.approxPolyDP(cnt, 0.02*peri, True)` 对轮廓进行多边形逼近,返回逼近后的多边形顶点坐标。 11. `while True:` 进入一个死循环,用于不断读取摄像头视频流并进行处理。 12. `retval, image = ret.read()` 从摄像头读取一帧视频流。 13. `img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)` 将图像转换为灰度图像。 14. `img_burl = cv2.GaussianBlur(img_gray, (5, 5), 1)` 对灰度图像进行高斯模糊处理,降低图像噪声。 15. `img_canny = cv2.Canny(img_burl, 50, 50)` 对模糊后的图像进行 Canny 边缘检测。 16. `imgcontour = image.copy()` 复制一份原始图像,用于在其上绘制检测到的轮廓。 17. `getcontours(img_canny)` 调用 `getcontours()` 函数进行轮廓检测。 18. `cv2.imshow("video", imgcontour)` 在窗口中显示处理后的图像。 19. `c = cv2.waitKey(50)` 等待用户按下键盘,每隔 50 毫秒检查一次。 20. `if c == 32:` 如果用户按下空格键,退出循环。 21. `ret.release()` 释放摄像头资源。 22. `cv2.destroyAllWindows()` 关闭所有窗口。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值