基于颜色进行轮廓分割,基于opencv和python

1. 阈值调整,交互式的阈值调整,确定上限和下限:

import cv2 as cv
import numpy as np



def Tcallback(event):
    H = cv.getTrackbarPos('H', 'show_pic')
    S = cv.getTrackbarPos('S', 'show_pic')
    V = cv.getTrackbarPos('V', 'show_pic')
    H0 = cv.getTrackbarPos('H0', 'show_pic')
    S0 = cv.getTrackbarPos('S0', 'show_pic')
    V0 = cv.getTrackbarPos('V0', 'show_pic')
    lower_red = np.array([H0, S0, V0])
    upper_red = np.array([H, S, V])
    mask = cv.inRange(hsv, lower_red, upper_red)
    res = cv.bitwise_and(img, img, mask=mask)
    cv.imshow('show_pic', res)

img = cv.imread('sam2.png')#, 1)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV_FULL)

cv.namedWindow('show_pic')
cv.resizeWindow('show_pic', 640, 480)

cv.createTrackbar('H', 'show_pic', 255, 255, Tcallback)
cv.createTrackbar('S', 'show_pic', 255, 255, Tcallback)
cv.createTrackbar('V', 'show_pic', 255, 255, Tcallback)  

cv.createTrackbar('H0', 'show_pic', 0, 255, Tcallback)
cv.createTrackbar('S0', 'show_pic', 43, 255, Tcallback)
cv.createTrackbar('V0', 'show_pic', 46, 255, Tcallback)

if cv.waitKey(0) == ord('q'):
    cv.destroyAllWindows()

2. 阈值分割,并找到最大轮廓

现根据mask找到所有轮廓

对所有轮廓排序,找到最大的

再对最大轮廓去凸多边形,用来对噪声做过滤。

img=cv2.resize(img,(640,480))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)
mask_green=cv2.inRange(hsv, self.lower_green, self.upper_green)
img_c,contours, hierarchy = cv2.findContours(mask_green,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
list_c=sorted(contours,key=cv2.contourArea,reverse=True)
c_max=list_c[0]
approx = cv2.approxPolyDP(c_max, 0.01 * cv2.arcLength(c_max, True), True)
hull = cv2.convexHull(c_max)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python代码示例,演示如何对斯诺克桌进行透视变换、边缘检测和轮廓分割,以及如何计算每个球的坐标: ```python import cv2 import numpy as np # 读取图片 img = cv2.imread("snooker.jpg") # 定义斯诺克桌的四个顶点坐标 src_points = np.float32([[320, 15], [700, 15], [20, 435], [1000, 435]]) # 定义斯诺克桌变换后的矩形四个顶点坐标 dst_points = np.float32([[0, 0], [700, 0], [0, 435], [700, 435]]) # 计算透视变换矩阵 M = cv2.getPerspectiveTransform(src_points, dst_points) # 进行透视变换 warped = cv2.warpPerspective(img, M, (700, 435)) # 将图像转换为灰度图 gray = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) # 进行边缘检测 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # 进行轮廓分割 contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历每个轮廓,计算每个球的中心坐标 for cnt in contours: # 计算轮廓的面积 area = cv2.contourArea(cnt) if area > 200 and area < 5000: # 计算轮廓的外接圆 (x, y), radius = cv2.minEnclosingCircle(cnt) center = (int(x), int(y)) radius = int(radius) # 标记圆心 cv2.circle(warped, center, radius, (0, 255, 0), 2) # 计算球的坐标 x_coord = int(x / 700 * img.shape[1]) y_coord = int(y / 435 * img.shape[0]) print("球的坐标为:({}, {})".format(x_coord, y_coord)) # 显示结果 cv2.imshow("Result", warped) cv2.waitKey(0) cv2.destroyAllWindows() ``` 需要注意的是,这只是一个简单的示例代码,实际上可以根据具体需求进行更加精细的处理和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值