opencv--颜色物体追踪 图片的形态学处理函数

2023-05-16

目录

一、主要函数介绍

1. cv2.erode()

2. cv2.dilate()

3. cv2.findContours()

4. cv2.circle()

5. cv2.line()

二、代码


  这里首先确定是否安装imutils库,这个库能让调整大小或者翻转屏幕等基本任务更加容易实现。这一次主要应用的是对于图片的形态学处理函数。

一、主要函数介绍

1. cv2.erode()

  腐蚀与膨胀属于形态学操作,所谓的形态学,就是改变物体的形状,形象理解一些:腐蚀=变瘦 膨胀=变胖。主要是采用 cv2.erode() cv2.dilate(),需要注意一点的是,腐蚀和膨胀主要针对二值化图像的白色部分。

  腐蚀函数,就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。在原图的每一个小区域里取最小值,由于是二值化图像,只要有一个点为0,则都为0,来达到瘦身的目的。因此在下面的例子中,我们就可以使用腐蚀来将图片中的一些毛刺或者说很细小的东西给去掉。也可以用作分离图像。

                  mask = cv2.erode(mask, None, iterations=2)

参数:第一个参数是输入图片,第二个参数是卷积核,第三个参数是迭代次数。

原图:腐蚀后:

2. cv2.dilate()

  与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元素的像素值就是1。所以这个操作会增加图像中的白色区域(前景)。一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。

                    mask = cv2.dilate(mask, None, iterations=2)

函数第一个参数是输入图片,第二个参数是卷积核,第三个参数是迭代次数。

原图:膨胀后:

3. cv2.findContours()

作用是从二值图中检索轮廓,这就是我们能检测到球体的函数。

cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]

函数形式:

  cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

参数介绍:

image8-bit单通道图像。该图像会将非0像素值视为10像素值视为0,因此也被视为二值图像。

mode:轮廓检索模式,检测外轮廓还是内轮廓,是否包含继承(包含)关系: cv2.RETR_EXTERNAL 表示只检测外轮廓,忽略轮廓内部的结构,无继承相关信息;cv2.RETR_LIST 检测所有的轮廓但不建立继承(包含)关系;cv2.RETR_CCOMP 检测所有轮廓,但是仅仅建立两层包含关系;cv2.RETR_TREE 检测所有轮廓,并且建立所有的继承(包含)关系。

method:轮廓近似方法,有记录方法:cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过 1,即 maxabs(x1-x2), abs(y1-y2)=1 cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩阵轮廓只需 4 个点来保存轮廓信息。

contours:返回值,检测到的轮廓。每个轮廓都以点向量的形式存储。

hierarchy:返回值,包含有关图像轮廓的拓扑信息。它的元素和轮廓的数量一样多。对于第i ii个轮廓contours[i],元素hierarchy[i][0]hierarchy[i][1]hierarchy[i][2]hierarchy[i][3]分别设置为同一层次的下一个轮廓、同一层次的上一个轮廓、该轮廓的第一个子轮廓(嵌套轮廓)、该轮廓的父轮廓,它们的取值是轮廓的索引值(0开始)。如果contours[i]没有与其同级的下一个轮廓、上一个轮廓、嵌套轮廓或父轮廓,则hierarchy[i]的相应元素将为负。

offset:可选偏移量,每个轮廓点偏移量。如果从图像ROI中提取轮廓,然后在整个图像上下文中对其进行分析,这将非常有用。

4. cv2.circle()

作用:在任何图像上绘制圆。

        cv2.circle(image, center_coordinates, radius, color, thickness)

参数介绍:

image:它是要在其上绘制圆的图像。

center_coordinates:它是圆的中心坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)

radius:它是圆的半径。

color:它是要绘制的圆的边界线的颜色。对于BGR,我们通过一个元组。例如:(25500)为蓝色。

thickness:它是圆边界线的粗细像素。厚度-1像素将以指定的颜色填充矩形形状。

返回值:它返回一个图像。

5. cv2.line()

作用:在图像中划线(追踪轨迹)

             cv2.line(img, pt1, pt2, color, thickness)

参数介绍:

第一个参数 img:要划的线所在的图像;

第二个参数 pt1:直线起点(用在图像中的坐标表示)

第三个参数 pt2:直线终点(用在图像中的坐标表示)

第四个参数 color:直线的颜色

第五个参数 thickness=1:线条粗细

二、代码

# import the necessary packages
from collections import deque
import numpy as np
import argparse
import imutils
import cv2

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
	help="path to the (optional) video file")
ap.add_argument("-b", "--buffer", type=int, default=64,
	help="max buffer size")
args = vars(ap.parse_args())

# define the lower and upper boundaries of the "yellow object"
# (or "ball") in the HSV color space, then initialize the
# list of tracked points
colorLower = (24, 100, 100)
colorUpper = (44, 255, 255)
pts = deque(maxlen=args["buffer"])
 
# if a video path was not supplied, grab the reference
# to the webcam
if not args.get("video", False):
	camera = cv2.VideoCapture(0)
 
# otherwise, grab a reference to the video file
else:
	camera = cv2.VideoCapture(args["video"])

# keep looping
while True:
	# grab the current frame
	(grabbed, frame) = camera.read()
 
	# if we are viewing a video and we did not grab a frame,
	# then we have reached the end of the video
	if args.get("video") and not grabbed:
		break
 
	# resize the frame, inverted ("vertical flip" w/ 180degrees),
	# blur it, and convert it to the HSV color space
	frame = imutils.resize(frame, width=600)
	#frame = imutils.rotate(frame, angle=180)
	# blurred = cv2.GaussianBlur(frame, (11, 11), 0)
	hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
 
	# construct a mask for the color "green", then perform
	# a series of dilations and erosions to remove any small
	# blobs left in the mask
	mask = cv2.inRange(hsv, colorLower, colorUpper)
	mask = cv2.erode(mask, None, iterations=2)
	mask = cv2.dilate(mask, None, iterations=2)
	
	# find contours in the mask and initialize the current
	# (x, y) center of the ball
	cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
		cv2.CHAIN_APPROX_SIMPLE)[-2]
	center = None
 
	# only proceed if at least one contour was found
	if len(cnts) > 0:
		# find the largest contour in the mask, then use
		# it to compute the minimum enclosing circle and
		# centroid
		c = max(cnts, key=cv2.contourArea)
		((x, y), radius) = cv2.minEnclosingCircle(c)
		M = cv2.moments(c)
		center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
 
		# only proceed if the radius meets a minimum size
		if radius > 10:
			# draw the circle and centroid on the frame,
			# then update the list of tracked points
			cv2.circle(frame, (int(x), int(y)), int(radius),
				(0, 255, 255), 2)
			cv2.circle(frame, center, 5, (0, 0, 255), -1)
 
	# update the points queue
	pts.appendleft(center)
	
		# loop over the set of tracked points
	for i in range(1, len(pts)):
		# if either of the tracked points are None, ignore
		# them
		if pts[i - 1] is None or pts[i] is None:
			continue
 
		# otherwise, compute the thickness of the line and
		# draw the connecting lines
		thickness = int(np.sqrt(args["buffer"] / float(i + 1)) * 2.5)
		cv2.line(frame, pts[i - 1], pts[i], (0, 0, 255), thickness)
 
	# show the frame to our screen
	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF
 
	# if the 'q' key is pressed, stop the loop
	if key == ord("q"):
		break
 
# cleanup the camera and close any open windows
camera.release()
cv2.destroyAllWindows()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv--颜色物体追踪 图片的形态学处理函数 的相关文章

  • Git常用命令

    1 Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址 这是非常重要的 xff0c 因为每次Git提交都会使用该用户信息 在Git 命令行中执行下面命令 xff1a 设置用户信息 git config global
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • 存储卡插上电脑时显示文件名变乱码请问怎样才能修复???

    存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编今天碰到的一个 xff0c 打开分区提示文件名变乱码 xff01 存储卡插上电脑时显示文件名变乱码请问怎样才能修复 存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编
  • putty使用python模块tkinter显示对话框出现_tkinter.TclError: no display name and no $DISPLAY environment variable

    问题描述 xff1a putty不能显示对话框 出现错误提示 xff1a tkinter TclError no display name and no DISPLAY environment variable 解决办法 xff1a 下载安
  • 有关于ValueError: Variable rnn/basic_lstm_cell/kernel already exists, disallowed.的问题

    很简单 xff0c 重新跑一篇程序 xff0c 我理解为重启核 xff1f xff1f xff1f jupyter中有kernel选项 xff0c 点击选择 Restart amp RunAll xff0c 即可解决问题 Mark
  • 从尾到头打印链表

    题目描述 xff1a 输入一个链表 xff0c 按链表值从尾到头的顺序返回一个ArrayList 分析 xff1a 1 xff0c 新建两个arraylist xff0c 2 xff0c 遍历链表 xff0c 存入第一个arraylist
  • Win10的Linux子系统Ubuntu安装图形界面

    Win10 的 Linux 子系统 Ubuntu 安装图形界面 陈拓 2021 07 25 2021 07 26 1 概述 Win10的linux子系统Windows Subsystem for Linux xff08 简称 WSL xff
  • 得到斐波那契数列的第n个数

    题目 xff1a 现在要求输入一个整数n xff0c 请你输出斐波那契数列的第n项 xff08 从0开始 xff0c 第0项为0 xff09 n lt 61 39 分析 xff1a 1 xff0c 1 xff0c 2 xff0c 3 xff
  • ModuleNotFoundError: No module named 'scipy._lib.decorator'问题解决

    问题来源 xff1a 在导入sklearn库时 xff0c 出现 usr lib python3 dist packages scipy sparse linalg isolve iterative py in 8 9 from scipy
  • 二叉搜索树的后序遍历序列

    题目 输入一个整数数组 xff0c 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则输出Yes 否则输出No 假设输入的数组的任意两个数字都互不相同 分析 碰到二叉树 xff0c 优先想递归 这里 xff0c 后序数组 xff0c 最
  • 二叉树中和为某一值的路径

    题目 输入一颗二叉树的跟节点和一个整数 xff0c 打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 注意 在返回值的list中 xff0c 数组长度大的数组靠前 分析 二叉树
  • 复杂链表的复制(java)

    题目 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针指向任意一个节点 xff09 xff0c 返回结果为复制后复杂链表的head xff08 注意 xf
  • CMake学习-添加头文件路径,库路径,库

    CMake中 xff0c 添加头文件路径 xff0c 对应的函数叫include directories 然后在参数中 xff0c 把所有需要添加的路径 xff0c 加进去就可以了 添加库路径 xff0c 对应的函数叫LINK DIRECT
  • Docker Run 命令

    docker run 参数 xff1a e xff1a 向容器内传递环境变量 xff0c 启动容器时用户可以动态传参 v 挂载文件 xff0c 把该容器的数据保存到挂载文件上 p 端口映射 xff08 p 8888 3306 8888宿主机
  • 如何复现论文?什么是论文复现?

    参考资料 xff1a 学习篇 顶会Paper复现方法 知乎 如何读论文 xff1f 复现代码 xff1f 复现代码是什么意思 CSDN 我是如何复现我人生的第一篇论文的 知乎 在我看来 xff0c 论文复现应该有一个大前提和分为两个层次 大
  • Kinect 获取深度图计算距离,并进行彩色图和深度图之间的映射

    Kinect 获取深度图计算距离 xff0c 并进行彩色图和深度图之间的映射 最近所进行的项目需要利用KINECT获取深度距离 xff0c 需要得到彩色图中某一点的位置 xff0c 在网上找了很多资料 xff0c 都不是很好 xff0c 碰
  • 十一个顶级的Git 客户端,绝对很实用!

    导读Git是一种免费开源的分布式版本控制系统 xff0c 可用于处理软件开发及另外几种版本控制任务 它旨在处理大大小小的各种项目 xff0c 并确保速度 效率和数据完整性 Linux用户主要可以通过命令行来管理Git xff0c 不过外面有
  • Windows USB串口接收GPS北斗模块数据和数据说明

    陈拓 2022 05 07 2022 05 09 1 简介 本文以GPS 43 北斗卫星定位授时导航模块HT1818Z3G5L为例 xff0c 在Win10下读数据 产品参数 引脚定义 2 连接PC机和HT1818Z3G5L模块 如图 xf
  • Linux也有全功能杀毒软件啦!

    导读近日 xff0c 瑞星公司推出瑞星杀毒软件Linux全功能版 xff0c 它是一款功能齐全 高性能的企业级安全产品软件 xff0c 并且新增国内首家 文件监控 与 网络监控 功能 xff0c 对Linux系统进行系统和网络双层防护 xf
  • 虚拟现实的起源、发展、爆发与沉淀

    虚拟现实的三生三世 闲来无事翻篇外文 xff0c 本博主并非故意蹭热点 xff08 奸笑 xff09 xff0c 结尾我会细说为何是三生三世 xff0c 不是五生五世 xff1a 虚拟现实远早于这个概念被创造和形式化之前 在这篇描写虚拟现实

随机推荐

  • UCOS消息队列的使用【转】

    UCOS消息队列的使用 转 收藏 消息队列的使用 1 需在以下文件中配置如下内容 OS CFG H OS MAX QS N 你需要的值 根据需要自己配置 define OS Q EN 1 Enable 1 or Disable 0 code
  • to_string函数的用法

    to string 函数 xff1a 将数字常量转换为字符串 xff0c 返回值为转换完毕的字符串 头文件 xff1a include lt string gt string s 61 to string i 将整数i转换为字符串表示形式
  • EKF2学习之控制融合模式

    By snowpang 2017 8 10 1 存储控制状态值 xff0c 并开启状态变化检测 control status value bitmask containing filter control status union filt
  • 经典算法 (四) 桶排序

    时隔一年 xff0c 小葵花课堂再次开课 xff0c 这次开课不会像之前那样很早就停课了 xff0c 在此给大家道个歉 xff1a 对不起 嘻嘻 又到了毕业季了 xff0c 废话不多说 xff0c 继续我们的算法学习 一丶算法描述 桶排序
  • 程序调试记录(纯自用)

    Stack类测试 xff1a 在测试Stck类型的变量内容是否正确时 xff0c 经常会通过把所有值pop出来输出的方法 xff0c 这样容易造成一个问题就是 xff0c 栈已经被弄空了 xff0c 以后再用的时候就会是一个空栈 所以 xf
  • vector详解

    引言 emmm 这篇博客写作的缘由其实就是我在日常使用vector的时候发现对vector并不怎么了解所以决定写这篇博客的 写这篇博客 xff0c 我参考了vector C 43 43 Reference中的内容 xff0c 及侯捷先生的
  • Eigen快速入门

    Eigen快速入门 一个简单的例子 span class hljs preprocessor include lt iostream gt span span class hljs preprocessor include 34 Eigen
  • PX4 的 ECL EKF 公式推导及代码解析

    原创作者 USRL所长 64 CSDN 文章来源 https blog csdn net u010307048 article details 100553475 如需转载联系联系原创作者 作者整理的内容如下 xff0c 干货很多 xff0
  • git fatal: The remote end hung up unexpectedly错误解决方法

    在使用git更新或提交项目时候出现 34 fatal The remote end hung up unexpectedly 34 原因是推送的文件太大 那就简单了 xff0c 要么是缓存不够 xff0c 要么是网络不行 xff0c 要么墙
  • 公开课精华|机器人的带约束轨迹规划

    本文章总结于大疆前技术总监 xff0c 目前在卡内基梅隆大学读博的杨硕博士在深蓝学院的关于机器人的带约束轨迹规划的公开课演讲内容 全文约5000字 笔者不是机器人领域的 xff0c 因此特地去了解了一下杨硕博士 xff0c 深感佩服 xff
  • 自动驾驶的重要一环:谈谈感知前沿技术

    本文总结于Waymo研发经理周寅于2021年8月29日在深蓝学院的讲座 讲座内容主要包括自动驾驶系统的总览 xff0c 自动驾驶感知的介绍 xff0c 以及感知的前沿动态和总结 1 自动驾驶系统总览 关于自动驾驶系统 目前主流的L4级别自动
  • 论文精读 | slam中姿态估计的图优化方法比较

    一 摘要 对于位置环境中的自主导航问题 xff0c 同步定位与建图 Simultaneous localization and mapping SLAM 是一个非常重要的工具框架 根据SLAM字面含义可以得知 xff0c 获取正确的环境表征
  • 自动驾驶中的多种卡尔曼滤波算法及推导详解,值得一读!

    鉴于卡尔曼滤波算在多传感器融合系统中使用的普遍性 xff0c 本文将单独就卡尔曼滤波算法及自动驾驶中常用的改进卡尔曼滤波算法进行详细介绍 首先介绍卡尔曼滤波的基本方法 xff0c 然后介绍针对非线性系统改进的扩展卡尔曼滤波 xff0c 最后
  • 入门ROS其实也没有那么难!

    作者 xff1a Tassel 相信提出这个问题的小伙伴已经对ROS有一定的了解 xff0c 但不管是出于工程应用还是理论学习 xff0c 我们都有必要谈谈ROS的概念 xff0c 从概念去理解ROS ROS xff08 机器人操作系统 x
  • 论SLAM技术发展趋势

    2018年7月底 xff0c 深蓝学院发起并承办了 第一届全国SLAM技术论坛 浙江大学章国锋老师 香港科技大学沈劭劼老师 上海交通大学邹丹平老师 中科院自动化所申抒含老师在 圆桌论坛 xff1a SLAM技术发展趋势 上分享了SLAM技术
  • 华清远见嵌入式学习每周汇总

    每周学习总结 第一周数据结构Makefile的编写顺序表链表 xff08 含约瑟夫环之选猴王 xff09 Joseph circle 本周总结 第二周栈队列树二叉树二叉树的创建 本周总结 IO进程标准IO2 题目要求 xff1a 编程读写一
  • 注意项:dockerFile中安装常用的运维工具

    自己打镜像的时候 xff0c 如果依赖的基础镜像中没有一些常用的Linux运维工具 xff0c 需要自己记得提前安装一下 xff0c 免得线上出现问题需要排查时才发现没有工具 一些常用的如下 RUN yum install y telnet
  • Ubuntu16.04安装ROS kinetic

    ROS kinetic官网 xff1a http wiki ros org kinetic Installation Ubuntu 1 配置Ubuntu的资源库 xff1a 34 restricted 34 xff0c 34 univers
  • 鼠标光标变成了一个点

    今天使用华为云桌面 xff08 内部系统是win7 xff09 xff0c 鼠标光标悬停在普通文本上就变成了一个 不容易发现的点 xff0c 用起来很不方便 xff0c 如图 xff1a 可通过修改鼠标指针颜色和大小来调整解决 xff08
  • opencv--颜色物体追踪 图片的形态学处理函数

    目录 一 主要函数介绍 1 cv2 erode 2 cv2 dilate 3 cv2 findContours 4 cv2 circle 5 cv2 line 二 代码 这里首先确定是否安装imutils库 xff0c 这个库能让调整大小或