超详细!!Opencv实现颜色追踪!附源码!!

废话不多说直接上代码!!

# 这是一个示例 Python 脚本。
import cv2
import numpy as np

def track_object():
    # 打开摄像头外接
    cap = cv2.VideoCapture(0)
    while True:
        # 读取摄像头帧
        # ret(Return Value)是一个布尔值,表示是否成功读取了一帧图像。如果成功读取,ret为True;否则,为False。
        # frame是读取到的图像帧。
        ret, frame = cap.read()

        # 将图像转换为HSV颜色空间。cv2.COLOR_BGR2HSV参数表示将BGR格式转换为HSV格式。
        #BGR(蓝绿红)格式的图像帧转换为HSV(色相、饱和度、明度)格式。HSV颜色空间更适合进行颜色相关的图像处理。
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        # 定义追踪的颜色范围(此处以蓝色物体为例,可根据需要进行微调)
        #第一个参数:色相(Hue):可以尝试在0179之间选择一个适当的范围。。
        #第二个参数:饱和度(Saturation):通常在较高的范围,例如1255之间。
        #第三个参数:明度(Value):根据具体场景,可以在较高的范围,例如0255之间。
        lower_color = np.array([90, 50, 50])
        upper_color = np.array([130, 255, 255])

        # 根据颜色范围创建掩膜。
        #用于过滤出在指定颜色范围内的部分。这个掩码可以用于后续的图像处理,例如颜色分割或物体识别。
        mask = cv2.inRange(hsv, lower_color, upper_color)

        #开运算(Opening):先进行腐蚀,然后进行膨胀。它有助于去除小的噪点和分离相邻的物体。
        #闭运算(Closing):先进行膨胀,然后进行腐蚀。它有助于填充物体中的小孔,连接相邻的物体。

        mask = cv2.erode(mask, None, iterations=2)   # 对掩膜进行腐蚀处理,以去除噪声  。iterations为次数
        mask = cv2.dilate(mask, None, iterations=2)   #膨胀处理

        # 寻找物体的轮廓
        #cv2.findContours函数来找到二值图像中的轮廓。
        #参数:
                #参数1:输  入的二值图像。通常是经过阈值处理后的图像,例如在颜色过滤之后生成的掩码。
                #参数2(cv2.RETR_EXTERNAL):轮廓的检索模式。有几种模式可选,常用的包括:
                   # cv2.RETR_EXTERNAL:只检测最外层的轮廓。
                   # cv2.RETR_LIST:检测所有的轮廓并保存到列表中。
                   # cv2.RETR_CCOMP:检测所有轮廓并将其组织为两层的层次结构。
                   # cv2.RETR_TREE:检测所有轮廓并重构整个轮廓层次结构。
               # 参数3(cv2.CHAIN_APPROX_SIMPLE):轮廓的近似方法。有两种方法可选,常用的有:
                   # cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向上的所有轮廓,只保留端点。
                   # cv2.CHAIN_APPROX_NONE:保留所有的轮廓点。
        #返回值:      contours:包含检测到的轮廓的列表。每个轮廓由一系列点组成。
#                   _(下划线):层次信息,通常在后续处理中可能会用到。在这里,我们通常用下划线表示我们不关心这个返回值。
        contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        # 初始化物体中心,center是一个包含两个整数的元组,表示轮廓的质心坐标
        center = None

        if len(contours) > 0: #说明检测到轮廓

            # 找到面积最大的轮廓的点集,从轮廓列表中,计算出面积最大的轮廓的点集。contourArea是计算轮廓面积的函数。
            #max的第一个参数:可以为一个列表。第二个参数:固定为   key=功能函数。
            #作用:从列表中遍历成员实现功能函数。
            max_contour = max(contours, key=cv2.contourArea)

            # 计算物体的最小外接圆,参数为:轮廓的点集
            #(x, y):外接圆的圆心坐标。
            #radius:外接圆的半径。
            ((x, y), radius) = cv2.minEnclosingCircle(max_contour)

            # 计算物体的中心坐标
            #M为字典,里面存着 二值图像矩阵信息
            M = cv2.moments(max_contour)
            #m00 = moments['m00'] # 面积
            #cx = moments['m10'] / moments['m00'] # 质心的x坐标
            #cy = moments['m01'] / moments['m00'] # 质心的y坐标
            center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))

            # 只有当物体半径大于一定值时才显示追踪结果
            if radius > 10:   #外接圆半径大于10
                # 在图像上绘制物体的圆形轮廓和中心
                # 这一行代码绘制一个以 (x, y) 为圆心,半径为 radius 的圆。颜色为 (0, 255, 255) 表示BGR格式中的黄色,线宽度为2。
                cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)
                #这一行代码绘制一个半径为5的实心圆作为中心点,以 center 为中心。颜色为 (0, 0, 255) 表示BGR格式中的红色。。
                cv2.circle(frame, center, 5, (0, 0, 255), -1)

        # 显示实时追踪结果
        #这行代码使用OpenCV的cv2.imshow函数来显示帧,窗口标题为 "Object Tracking"。
        cv2.imshow("Object Tracking", frame)

        # 按下Esc键退出追踪
        if cv2.waitKey(1) == 27:
            break

    # 释放摄像头并关闭窗口
    cap.release()
    cv2.destroyAllWindows()


# 运行物体追踪程序
track_ob

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
活体检测技术是一种基于人脸识别技术的生物特征识别技术,可以判断被识别者是否为真实的活体。虽然活体检测技术较为复杂,但是在使用OpenCV的情况下,也可以实现基础的活体检测。以下是一个使用OpenCV实现的活体检测的Python示例代码: ``` import cv2 import numpy as np def get_landmarks(image, rects): landmarks = [] for rect in rects: shape = predictor(image, rect) shape = face_utils.shape_to_np(shape) landmarks.append(shape) return landmarks def get_face_area(rects): areas = [] for rect in rects: areas.append(rect.width() * rect.height()) return areas def is_real_face(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) rects = detector(gray, 0) if len(rects) == 0: return False landmarks = get_landmarks(gray, rects) areas = get_face_area(rects) max_face_idx = np.argmax(areas) max_face = rects[max_face_idx] max_landmarks = landmarks[max_face_idx] is_real = False if len(max_landmarks) == 68: left_eye = max_landmarks[36:42] right_eye = max_landmarks[42:48] mouth = max_landmarks[48:68] left_eye_hull = cv2.convexHull(left_eye) right_eye_hull = cv2.convexHull(right_eye) mouth_hull = cv2.convexHull(mouth) cv2.drawContours(image, [left_eye_hull], -1, (0, 255, 0), 1) cv2.drawContours(image, [right_eye_hull], -1, (0, 255, 0), 1) cv2.drawContours(image, [mouth_hull], -1, (0, 255, 0), 1) ear_left = get_eye_aspect_ratio(left_eye) ear_right = get_eye_aspect_ratio(right_eye) mar = get_mouth_aspect_ratio(mouth) if ear_left > EAR_THRESH or ear_right > EAR_THRESH or mar < MAR_THRESH: is_real = True return is_real ``` 该代码利用了OpenCV库提供的人脸检测、特征点定位、轮廓绘制等功能,实现了一个简单的活体检测功能。其中,主要的算法包括: 1. 使用人脸检测器检测人脸,并获取人脸特征点; 2. 利用特征点计算眼睛和嘴巴的长宽比,判断是否为真实人脸。 需要注意的是,该算法只是一个基础的活体检测算法,可能存在一定的误判率。在实际应用中,需要根据具体情况进行优化和改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值