当前位置: 首页 > news >正文

25电赛e题杂乱环境稳定识别矩形框(附源码)

识别并跟踪矩形目标

识别视频中符合矩形轮廓的目标区域,并标记中心点位置。

实现思路

  1. **图像预处理:灰度 + 二值化
  2. **闭运算消除孔洞
  3. 二值化处理
  4. 查找并筛选矩形轮廓
  5. 解算中心点
  6. 目标筛选
  7. 结果绘制

环境

使用 OpenCV 和 python:

图像预处理:灰度 + 二值化

将读取到的帧转换为灰度图,再进行阈值二值化处理。
这里采用 反向二值化(白底黑物体),便于检测黑色矩形:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)

在这里插入图片描述

闭运算消除孔洞

closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (50, 50)))
  • 闭运算 : 膨胀后腐蚀,可去除图中小孔洞和断裂,提高矩形轮廓连通性。
    在这里插入图片描述
    闭运算后图像(轮廓更完整)

查找并筛选矩形轮廓

使用 cv2.findContours() 提取所有闭合轮廓,再筛选出“近似矩形”的轮廓:

is_rect, approx = is_approx_rect(cnt)
def is_approx_rect(contour, epsilon_factor=0.02):     peri = cv2.arcLength(contour, True)     approx = cv2.approxPolyDP(contour, epsilon_factor * peri, True)     return (4 <= len(approx) <= 5 and cv2.isContourConvex(approx)), approx
  • 调用 cv2.approxPolyDP() 将轮廓多边形逼近
  • 条件:点数为 4~5 且轮廓是凸的

在这里插入图片描述

                 保留下的近似矩形轮廓图像

解算中心点

通过轮廓的几何矩获取中心点坐标:

def calc_center(approx):     M = cv2.moments(approx)     if M["m00"] == 0:         return None     return int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])

目标筛选(追踪最近矩形)

  • 第一帧:选取面积最大的矩形
  • 后续帧:优先选取与上一帧中心点距离最近的矩形
  • 距离在 50 像素内的多个候选中,选择面积最大的
    距离计算函数如下:
cv2.drawContours(display_frame, [approx], -1, (0, 0, 255), 5)
cv2.circle(display_frame, center, 7, (0, 0, 255), -1)

结果绘制

cv2.drawContours(display_frame, [approx], -1, (0, 0, 255), 5) cv2.circle(display_frame, center, 7, (0, 0, 255), -1)
  • 红色画出识别轮廓
  • 红点标记中心点位置
    在这里插入图片描述
    最终效果
    电赛e题,杂乱环境稳定识别,-哔哩哔哩

完整cv代码

创作不易,点个赞再走哦

import cv2
import numpy as npdef is_approx_rect(contour, epsilon_factor=0.02):peri = cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, epsilon_factor * peri, True)return (4 <= len(approx) <= 5 and cv2.isContourConvex(approx)), approxdef calc_center(approx):M = cv2.moments(approx)if M["m00"] == 0:return Nonereturn int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])def distance(p1, p2):return np.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)def main():cap = cv2.VideoCapture("222.mp4")if not cap.isOpened():print("打开视频失败")returnprev_center = Nonewhile True:ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)_, binary = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (50, 50)))contours_data = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = contours_data[1] if len(contours_data) == 3 else contours_data[0]candidates = []for cnt in contours:is_rect, approx = is_approx_rect(cnt)if is_rect:center = calc_center(approx)if center:candidates.append((approx, center, cv2.contourArea(approx)))if not candidates:selected = Noneelif prev_center is None:selected = max(candidates, key=lambda x: x[2])else:candidates.sort(key=lambda x: distance(x[1], prev_center))top_n = [candidates[0]]for c in candidates[1:]:if distance(c[1], prev_center) - distance(candidates[0][1], prev_center) < 50:top_n.append(c)else:breakselected = max(top_n, key=lambda x: x[2])display_frame = frame.copy()contour_img = np.zeros_like(frame)if selected:approx, center, _ = selectedcv2.drawContours(display_frame, [approx], -1, (0, 0, 255), 5)cv2.circle(display_frame, center, 7, (0, 0, 255), -1)cv2.drawContours(contour_img, [approx], -1, (0, 255, 0), 3)prev_center = centerelse:prev_center = Nonecv2.imshow("原视频", display_frame)cv2.imshow("二值化", binary)cv2.imshow("闭运算", closed)cv2.imshow("轮廓", contour_img)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()
http://www.dtcms.com/a/309179.html

相关文章:

  • 浏览器环境segmentit实现中文分词
  • 精通分类:解析Scikit-learn中的KNN、朴素贝叶斯与决策树(含随机森林)
  • LLM Prompt与开源模型资源(2)提示工程关键技术
  • 工程化(二):为什么你的下一个项目应该使用Monorepo?(pnpm / Lerna实战)
  • 位运算-面试题01.01.判定字符是否唯一-力扣(LeetCode)
  • 【unity小技巧】封装unity适合2D3D进行鼠标射线检测,获取鼠标位置信息检测工具类
  • 8.1每日一题
  • (线段树)SP2916 GSS5 / nfls #2899 查询最大子段和 题解
  • STL进阶典题整理 2025.7.30-2025.8.1
  • 关于继承的一些知识(C++)
  • react-native在mac的m2芯片下,pod install安装glog的时候报错
  • bmcweb工作流程
  • 【科研绘图系列】R语言绘制环状分组显著性柱状堆积图
  • Spring AI 系列之三十 - Spring AI Alibaba-其它模型
  • CSS font-weight:500不生效
  • Git 命令使用指南:从入门到进阶
  • 动态规划(数位统计dp 状态压缩dp 树形dp 记忆化搜索) from y总
  • 【C语言】字符函数与字符串函数详解
  • http请求访问响应慢问题解决的基本思路
  • 基于python大数据的招聘数据可视化及推荐系统
  • natapp的报错Tunnel StatusReconnecting...
  • STM32芯片简述
  • 使用GPU和NPU视频生成的优劣对比
  • 人工智能与金融:金融服务的重塑
  • Linux9 root密码修改
  • armbian 启用nginx并设置访问密码
  • CTF实战:用Sqlmap破解表单输入型SQL注入题(输入账号密码/usernamepassword)
  • SpringBoot AI应用实战:从图像识别到预测分析
  • 【通用视觉框架】基于OpenCvSharp+WPF+YOLO开发的仿VisionMaster的通用视觉框架软件,全套源码,开箱即用
  • 机器人芯片:智能机器的“大脑”与未来趋势