Python轮廓追踪【OpenCV形态学操作】

概要

一些理论知识

OpenCV形态学操作理论1
OpenCV形态学操作理论2
OpenCV轮廓操作|轮廓类似详解

代码

代码如下,可以直接运行

import cv2 as cv

# 定义结构元素
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
# print kernel

capture = cv.VideoCapture(0)
print (capture.isOpened())
ok, frame = capture.read()
lower_b = (65, 43, 46)
upper_b = (110, 255, 255)

height, width = frame.shape[0:2]
screen_center = width / 2
offset = 50

while ok:
    # 将图像转成HSV颜色空间
    hsv_frame = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 基于颜色的物体提取
    mask = cv.inRange(hsv_frame, lower_b, upper_b)
    mask2 = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)
    mask3 = cv.morphologyEx(mask2, cv.MORPH_CLOSE, kernel)

    # 找出面积最大的区域
    contours,_ = cv.findContours(mask3, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

    maxArea = 0
    maxIndex = 0
    for i, c in enumerate(contours):
        area = cv.contourArea(c)
    if area > maxArea:
        maxArea = area
    maxIndex = i
    # 绘制
    cv.drawContours(frame, contours, maxIndex, (255, 255, 0), 2)
    # 获取外切矩形
    x, y, w, h = cv.boundingRect(contours[maxIndex])
    cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
    # 获取中心像素点
    center_x = int(x + w / 2)
    center_y = int(y + h / 2)
    cv.circle(frame, (center_x, center_y), 5, (0, 0, 255), -1)

    # 简单的打印反馈数据,之后补充运动控制
    if center_x < screen_center - offset:
        print ("turn left")
    elif screen_center - offset <= center_x <= screen_center + offset:
        print ("keep")
    elif center_x > screen_center + offset:
        print ("turn right")

    cv.imshow("mask4", mask3)
    cv.imshow("frame", frame)
    cv.waitKey(1)
    ok, frame = capture.read()

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用PythonOpenCV进行物体追踪,你需要进行以下步骤: 1. 安装OpenCV库。 2. 捕获视频流或打开视频文件。 3. 选择要追踪的对象并提取其颜色范围。 4. 对每一帧进行处理,将颜色范围内的像素标记为白色,其余像素标记为黑色。 5. 对二值图像应用形态学运算,例如膨胀和腐蚀,以去除噪声和填充空洞。 6. 使用轮廓检测算法检测对象的轮廓。 7. 根据轮廓的中心点和边界框计算对象的位置和大小。 8. 在视频帧上绘制对象的边界框和中心点。 以下是一个简单的物体追踪示例代码: ```python import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 设置颜色范围 low_color = (0, 100, 100) high_color = (10, 255, 255) # 创建掩膜 mask = cv2.inRange(hsv_frame, low_color, high_color) # 进行形态学运算 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) mask = cv2.erode(mask, kernel, iterations=2) mask = cv2.dilate(mask, kernel, iterations=2) # 检测轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 如果有轮廓,找到最大轮廓并计算其中心点和边界框 if contours: max_contour = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(max_contour) center = (x + w // 2, y + h // 2) # 绘制边界框和中心点 cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1) cv2.imshow('Frame', frame) if cv2.waitKey(10) == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 这段代码可以从摄像头捕获视频流,并追踪红色对象。你可以根据需要调整颜色范围和形态学运算参数来适应不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值