opencv-python——调用摄像头或导入视频实现颜色识别并画框

2023-05-16

采用opencv进行颜色识别有个好处就是他的框可以是具有角度的长方体框,不局限于平行点的

文章目录

    • 颜色识别实现过程
        • 1.调用摄像头、导入视频或读入照片
        • 2.找出所需颜色对应的HSV阈值
        • 3.找出二值化后的图片中的特征点并进行画框
    • 完整代码
    • 函数详解
        • findContours()函数
    • minAreaRect()函数

颜色识别实现过程

1.调用摄像头、导入视频或读入照片

  • 调用摄像头
import os
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
	ret, frame = cap.read()
	if ret == True:
  • 导入视频
cap = cv2.VideoCapture("opencv/8_15_2save.avi") # 输入视频
  • 读入照片
frame = cv2.imread("123.jpg")

2.找出所需颜色对应的HSV阈值

  • 通过HSV阈值分析器调节阈值,并写入color_dist中:
color_dist = {'red': {'Lower': np.array([0, 25, 123]), 'Upper': np.array([17, 255, 255])},
              'light_red': {'Lower': np.array([178, 100, 136]), 'Upper': np.array([255, 255, 255])},
              'blue': {'Lower': np.array([100, 80, 46]), 'Upper': np.array([124, 255, 255])},
              'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},
              'yellow': {'Lower': np.array([25, 75, 165]), 'Upper': np.array([40, 255, 255])},
              'black': {'Lower': np.array([0,0,0]), 'Upper': np.array([1,1,1])},
              }
  • 将图片进行HSV转换,并通过inRange函数对hsv图像进行处理,
	hsv = cv2.cvtColor(mask_img, cv2.COLOR_BGR2HSV) 
	inRange_hsv = cv2.inRange(hsv, color_dist[ball_color1]['Lower'], color_dist[ball_color1]['Upper'])

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

3.找出二值化后的图片中的特征点并进行画框

	cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
    c = max(cnts, key=cv2.contourArea)
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box_list = box.tolist() #四个点的点的坐标
	
    cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)

在这里插入图片描述

完整代码

import cv2
import numpy as np

color_dist = {'red': {'Lower': np.array([0, 25, 138]), 'Upper': np.array([19, 255, 255])},
              'light_red': {'Lower': np.array([178, 100, 136]), 'Upper': np.array([255, 255, 255])},
              'blue': {'Lower': np.array([100, 80, 46]), 'Upper': np.array([124, 255, 255])},
              'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},
              'yellow': {'Lower': np.array([26, 43, 46]), 'Upper': np.array([34, 255, 255])},
              }
#调用摄像头
#cap = cv2.VideoCapture(0)
# 输入视频
cap = cv2.VideoCapture("opencv/8_15_2save.avi") 
cv2.namedWindow('camera', cv2.WINDOW_AUTOSIZE)

while True:
    # 读取视频帧,ret标志读取的结果,frame为读取到的视频帧图像
    ret, frame = cap.read()

    gs_frame = cv2.GaussianBlur(frame, (5, 5), 0)                     # 高斯模糊
    hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)                 # 转化成HSV图像

    inRange_hsv = cv2.inRange(hsv, color_dist['red']['Lower'], color_dist['red']['Upper'])
    #寻找外部的点
    cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]

    c = max(cnts, key=cv2.contourArea)
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box_list = box.tolist()
    #将点画在
    cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)

    cv2.imshow('camera', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
            
cv2.destroyAllWindows()

函数详解

findContours()函数

findContours(InputOutputArray image, 
             OutputArrayOfArrays contours, 
             OutputArray hierarchy, 
             int mode, 
             int method, 
             Point offset = Point());
  • 参数1:单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像;
  • 参数2:contours定义为“vector<vector>
    contours”,是一个双重向量(向量内每个元素保存了一组由连续的Point构成的点的集合的向量),每一组点集就是一个轮廓,有多少轮廓,contours就有多少元素;
  • 参数3:hierarchy定义为“vector hierarchy”,Vec4i的定义:typedef Vec<int, 4> Vec4i;(向量内每个元素都包含了4个int型变量),所以从定义上看,hierarchy是一个向量,向量内每个元素都是一个包含4个int型的数组。向量hierarchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy内每个元素的4个int型变量是hierarchy[i][0] ~ hierarchy[i][3],分别表示当前轮廓 i 的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的编号索引。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓,则相应的hierarchy[i][*]被置为-1。
  • 参数4:定义轮廓的检索模式,取值如下:
CV_RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略;
CV_RETR_LIST:检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到;
CV_RETR_CCOMP: 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层;
CV_RETR_TREE: 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
  • 参数5:定义轮廓的近似方法,四种取值分别如下:
CV_CHAIN_APPROX_NONE:保存物体边界上所有连续的轮廓点到contours向量内;
CV_CHAIN_APPROX_SIMPLE:仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留;
CV_CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法;
CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法。
  • 参数6:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值!

minAreaRect()函数

OpenCV 中boundingRect、minAreaRect的用法区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv-python——调用摄像头或导入视频实现颜色识别并画框 的相关文章

  • 行未从树视图复制

    该行未在树视图中复制 我在按行并复制并粘贴到未粘贴的任何地方后制作了弹出复制 The code popup tk Menu tree opportunity tearoff 0 def row copy item tree opportun
  • 一次将Python dict的内容分配给多个变量?

    我想做这样的事情 def f return a 1 b 2 c 3 a b f or a b f IE 这样 a 被分配为 1 b 被分配为 2 并且 c 是未定义的 这与此类似 def f return 1 2 a b f 依赖于变量名称
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • 即使使用 .loc[row_indexer,col_indexer] = value 时也会设置 WithCopyWarning

    这是我的代码中得到的行之一SettingWithCopyWarning value1 Total Population value1 Total Population replace to replace value 4 然后我将其更改为
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • PIL Image.size 返回相反的宽度/高度

    使用PIL确定图像的宽度和高度 在特定图像上 幸运的是只有这一个 但这很麻烦 从 image size 返回的宽度 高度是相反的 图片 http storage googleapis com cookila 533ebf752b9d1f7c
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • 如何在 Python 中将彩色输出打印到终端?

    是否有与 Perl 等效的 Python 语言 print color red print
  • 如何在python中检索aws批处理参数值?

    流程 Dynamo DB gt Lambda gt 批处理 如果将角色 arn 插入动态数据库 它是从 lambda 事件中检索的 然后使用submit job角色 arn 的 API 被传递为 parameters role arn ar
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 获取列表中倒数第二个元素[重复]

    这个问题在这里已经有答案了 我可以通过以下方式获取列表的倒数第二个元素 gt gt gt lst a b c d e f gt gt gt print lst len lst 2 e 有没有比使用更好的方法print lst len lst
  • 在可编辑的QSqlQueryModel中实现setEditStrategy

    这是后续这个问题 https stackoverflow com questions 49752388 editable qtableview of complex sql query 在那里 我们创建了 QSqlQueryModel 的可
  • 为什么我用 beautifulSoup 刮的时候有桌子,但没有 pandas

    尝试抓取条目页面转换为制表符分隔格式 主要拉出序列和 UniProt 登录号 当我跑步时 url www signalpeptide de index php sess m listspdb bacteria s details id 10
  • conda-env list / conda info --envs 如何查找环境?

    我一直在尝试 anaconda miniconda 因为我的用户使用随 miniconda 安装的结构生物学程序 并且作者都没有 A 考虑到可能存在其他 miniconda 应用程序 B 他们的程序将在多用户环境中使用 因此 使用 Arch
  • 如何禁止 celery 中的 pickle 序列化

    Celery 默认使用 pickle 作为任务的序列化方法 如中所述FAQ http ask github com celery faq html isn t using pickle a security concern 这代表一个安全漏
  • 如何将列表字典写入字符串而不是 CSV 文件?

    This 堆栈溢出问题 https stackoverflow com questions 37997085 how to write a dictionary of lists to a csv file将列表字典写入 CSV 文件的答案
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码

随机推荐

  • hullib_eeprom

    EEPROM 这个模拟iic真的搞了好久啊 xff0c 最后发现这个24c02写完之后至少要延时4ms再来读才可以 xff0c 要不然读的时候都是NACK 一 时序 自己看数据手册吧
  • hullib_PwmCapture

    PwmCapture 需要两个channel 一 cubemx配置 一个上升沿捕获 xff0c 一个下降沿捕获 打开中断 二 自己写的代码 1 开启两个通道的中断 span class token function HAL TIM IC S
  • 2021-03-16

    hullib Rtc 获取时间之后必须获取日期他才会有时间 HAL RTC GetTime amp hrtc amp sTime RTC FORMAT BIN HAL RTC GetDate amp hrtc amp sDate RTC F
  • hullib_PwmOutput

    hullib PwmOutput 一 cubmx需要配置的 1 这里一定是pwm Generation 而不是pwm outcompare 使用定时器的PWM模式只能在4个通道产生频率相同但占空比不同的输出信号 使用定时器的输出比较模式可以
  • 计算机类非全日制研究生

    北京市 10002 中国人民大学 院系所专业研究方向考试范围 159 信息学院 xff08 专业学位 xff09 085400 专业学位 电子信息 02 软件工程领域 xff08 非全 xff09 详情 159 信息学院 xff08 专业学
  • 史上最详细的Docker 镜像的制作-上传-拉取--部署(阿里云)

    Docker 镜像的制作 上传 拉取 部署 一 镜像 xff08 images xff09 1 什么是镜像 xff1f 2 镜像的组成和用途 xff08 1 xff09 Dockerfile xff08 2 xff09 scratch xf
  • 机动目标跟踪-Singer模型,当前统计模型,交互多模型与卡尔曼滤波的结合

    文章目录 非机动目标跟踪算法原理一 Singer 模型算法二 当前统计模型算法三 交互多模型算法 实验仿真一 低机动情况1 1 Singer模型参数设置1 2 当前统计模型参数设置1 3交互多模型参数设置1 4 对比分析 二 一般机动情况2
  • 用大白话解析函数调用,系统调用和API之间的关系

    一 官方的解释 大概了解一下 函数调用 函数调用是计算机编或运行时 xff0c 使用某个函数来完成相关命令 系统调用 系统调用是用户在程序中使用 访管指令 调用由操作系统提供的子功能集合 API 应用编程接口 xff08 Applicati
  • docker删除所有容器和镜像

    确保自己有权限 xff0c 一般先执行下面的命令获取管理员权限 span class token function sudo span span class token function su span 1 杀死运行的容器 xff1a sp
  • Docker镜像制作与仓库搭建

    Docker 1 xff0c docker镜像制作2 xff0c docker仓库搭建 1 xff0c docker镜像制作 docker官方和个人发布的镜像由于版本等各种原因 xff0c 漏洞较多 xff0c 已统计Docker Hub超
  • 2019年全国大学生电子设计竞赛赛题分享与浅析

    0 ti杯2019年全国大学生电子设计竞赛赛题已于今晨公布 其中赛题分为本科组与高职高专组 xff1a 本科组 xff1a A 电动小车动态无线充电系统 B 巡线机器人 C 线路负载及故障检测装置 D 简易电路特性测试仪 E 基于互联网的信
  • springboot整合canal实现对mysql数据库实时监控

    canal Canal介绍Mysql环境准备安装canalspringboot整合canal Canal介绍 官网地址 xff1a https github com alibaba canal canal k n l xff0c 译意为水道
  • tensorflow2.6.0安装 another metric with the same name already exists

    终端直接输入pip install tensorflow 61 61 2 6 0 但是这里有一点问题 span class token keyword import span os span class token keyword impo
  • Java编程心得体会

    初次学习Java编程的心得与体会 之前学习过c语言 xff0c python编程 xff0c 对比Java编程首先感觉到的区别就是Java环境配置比较复杂 xff0c 编程工具安装比较麻烦 课堂上老师讲到首先下载安装jdk xff0c 然后
  • Ubuntu18.04+ROS-melodic环境 px4+move_base仿真遇到的问题

    前前后后安了三个虚拟机 xff0c 折腾了快一个月了吧 第四次用双系统终于实现了 每次都有不同的坑 1 错误 xff1a gz symbol lookup error usr lib x86 64 linux gnu libgazebo c
  • 【谷粒学院】项目总结

    做谷粒学院这个项目大概花了2个多月的时间 xff0c 期间遇到了很多问题 xff0c 想要记录下来 xff0c 希望可以对别人有所帮助 首先谷粒学院项目我是不太推荐时间紧张的友友拿来做为毕设项目的 xff0c 原因是里面涉及到的技术 服务很
  • 完美解决make -f Makefile.unx报错问题 +Centos

    这里写自定义目录标题 本人亲测成功 导读 xff1a 我用这个命令主要是针对编译hadoop的 xff0c 其中有个isa l安装 xff0c 是英特尔 ISA L技术即 xff08 Intel Intelligent Storage Ac
  • 关于Gitee创建存储库多人协作流程

    关于Gitee创建存储库多人协作流程 主要解决在IDEA工具开发下通过Gtiee多人协作 xff0c 共同开发 前期准备 IDEA xff1a IDEA当前文档使用版本为2021 3 1 Git xff1a IDEA安装Gitee插件 流程
  • ajax上传文件,图片并显示与删除(spring boot)

    思路 xff1a 先上传文件然后在读出来 之前本人都是用form提交上传文件 xff0c 现在写个ajax的文件上传 先看下效果 xff1a 上传并在页面显示 关键代码 xff1a 在启动类里面加入 span class token com
  • opencv-python——调用摄像头或导入视频实现颜色识别并画框

    采用opencv进行颜色识别有个好处就是他的框可以是具有角度的长方体框 xff0c 不局限于平行点的 文章目录 颜色识别实现过程1 调用摄像头 导入视频或读入照片2 找出所需颜色对应的HSV阈值3 找出二值化后的图片中的特征点并进行画框 完