Opencv项目实战:22 物体颜色识别并框选

news2025/6/17 2:50:59

目录

0、项目介绍

1、效果展示

2、项目搭建

3、项目代码展示与部分讲解

Color_trackbar.py

bgr_detector.py

test.py

4、项目资源

5、项目总结


0、项目介绍

本次项目要完成的是对物体颜色的识别并框选,有如下功能:

(1)准确对颜色进行较大范围框选,统一使用绿色边界框显示。

(2)识别物体内部的颜色边缘轮廓,以白色为边缘,对物体的框选更加细致。

(3)可以对自己感兴趣的颜色进行识别选择,不想要的颜色不会被识别。

(4)在窗口中的边框旁打印上颜色对应的英文字母。

(5)如果发现效果不是很好,请耐心调试Color_trackbar.py文件。

1、效果展示

2、项目搭建

——22 Color box identification
  ——bgr_detector.py
  ——Color_trackbar.py
  ——test.py

按照如上所示,新建文件即可。

3、项目代码展示与部分讲解

这里我来讲解一下,这三个文件该怎么用,我这里就少讲原理了。(写着有点累,我想大家应该有这个能力看懂这个代码)。

Color_trackbar.py

import cv2
import numpy as np
from bgr_detector import BGR,empty


path = 'test.png'

cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,250)
cv2.createTrackbar("Hue Min","TrackBars",0,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",19,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",110,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",240,255,empty)
cv2.createTrackbar("Val Min","TrackBars",153,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)


while True:
    img = cv2.imread(path)
    bgr = BGR(img)
    #图像转化为HSV格式,H:色调S:饱和度V:明度
    imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    #获取轨迹栏位
    h_min = cv2.getTrackbarPos("Hue Min","TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
    print(h_min,h_max,s_min,s_max,v_min,v_max)

    #创建一个蒙版,提取需要的颜色为白色,不需要的颜色为白色
    lower = np.array([h_min,s_min,v_min])
    upper = np.array([h_max,s_max,v_max])
    mask = cv2.inRange(imgHSV,lower,upper)
    imgResult = cv2.bitwise_and(img,img,mask=mask)

    imgStack = bgr.stackImages(0.5,([img,imgHSV],[mask,imgResult]))
    #定义比例尺
    cv2.imshow("Stacked Images", imgStack)

    if cv2.waitKey(1) & 0xFF == 27:
        break

运行此文件,test.png文件为你需要检测的物体照片,这里我用的是以前的一个素材,你自行替换掉你需要识别的物体照片即可。

它会弹出这样的界面,你只需要自己不断的去拖拽左边的轨迹栏,然后将你想要识别的颜色单独识别出来即可,在下方的控制面板中,将里面的内容复制一行,记住是你成功识别后的内容。

如果你调来调去,效果不是很好,请你耐心一点,当然根据我的检测,使用你想要识别物体的照片,对后面的识别效果越好。

bgr_detector.py

import cv2
import numpy as np


class BGR():
    def __init__(self,img,scale=0.7):
        self.img=img
        self.scale=scale
        self.imgResult=img.copy()
        self.myColors = [[5, 107, 0, 19, 255, 255],
                        [57, 76, 0, 100, 255, 255],
                        [95, 78, 202, 128, 255, 255]]
        self.myColorValues = [[51, 153, 255],  ## BGR
                              [0, 255, 0],    # https://www.rapidtables.org/zh-CN/web/color/RGB_Color.html
                              [255, 0, 0]]
        self.objectColor=["Orange","Green","Blue"]

    def stackImages(self,scale,imgArray):
        rows = len(imgArray)
        cols = len(imgArray[0])
        rowsAvailable = isinstance(imgArray[0], list)
        width = imgArray[0][0].shape[1]
        height = imgArray[0][0].shape[0]
        if rowsAvailable:
            for x in range ( 0, rows):
                for y in range(0, cols):
                    if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, self.scale, self.scale)
                    else:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, self.scale, self.scale)
                    if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
            imageBlank = np.zeros((height, width, 3), np.uint8)
            hor = [imageBlank]*rows
            hor_con = [imageBlank]*rows
            for x in range(0, rows):
                hor[x] = np.hstack(imgArray[x])
            ver = np.vstack(hor)
        else:
            for x in range(0, rows):
                if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                    imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
                else:
                    imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
                if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
            hor= np.hstack(imgArray)
            ver = hor
        return ver

    def getContours(self,img, minArea=500):
        contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
        x, y, w, h = 0, 0, 0, 0
        for cnt in contours:
            area = cv2.contourArea(cnt)
            if area > minArea:
                cv2.drawContours(self.imgResult, cnt, -1, (255, 255, 255), 3)
                peri = cv2.arcLength(cnt, True)
                approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
                x, y, w, h = cv2.boundingRect(approx)
                cv2.rectangle(self.imgResult, (x, y), (x + w, y + h), (0, 255, 0), 2)
        return x + w // 2, y,w,h

    def findColor(self,img):
        imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        count = 0
        for color in self.myColors:
            lower = np.array(color[0:3])
            upper = np.array(color[3:6])
            mask = cv2.inRange(imgHSV, lower, upper)
            x,y,w,h=self.getContours(mask)
            cv2.putText(self.imgResult, self.objectColor[count],
                        (x + (w // 2) - 10, y + (h // 2) - 10), cv2.FONT_HERSHEY_COMPLEX, 0.7,
                        (0, 0, 255), 2)
            count += 1
        return self.imgResult


def empty(ways):
    pass

此文件无需运行,这是一个类文件,你需要修改的地方在初始化中,将之前你复制的内容粘贴到self.myColors的列表中,然后在self.myColorValues的旁边有一个注释,内容为一个RGB网址,点击进入。记住,在上面是你想要的颜色,下面的BGR就是什么颜色。

这里的值是RGB值,你需要自己改成BGR值。

为了有些同学还是不能理解我的意思,你可以看看这里我给的注释。

self.myColors=[[橙色的HSV值],

                        [紫色的HSV值],

                        [绿色的HSV值],

                        [蓝色的HSV值]]

self.myColorValues=[[橙色的BGR值],

                                [紫色的BGR值],

                                [绿色的BGR值],

                                [蓝色的BGR值]]  #网址中获得的是RGB值,手动改为BGR.

self.objectColor=["Orange","Purple","Green","Blue"] #按顺序来.

以上就是你需要修改的地方,很详细了。

test.py

import cv2
import numpy as np
from bgr_detector import BGR

frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)
cap.set(10,150)

myPoints =  []  ## [x , y , colorId ]

while True:
    success, img = cap.read()

    bgr = BGR(img)
    imgResult=bgr.findColor(img)
    imgStack = bgr.stackImages(0.8, ([img, imgResult]))
    cv2.imshow("Result", imgStack)
    if cv2.waitKey(1) & 0xFF == 27:
        break

这里就是你的测试文件,可以看到代码行数很少,这就是使用类文件的好处。

4、项目资源

GitHub:22 物体颜色识别并框选

5、项目总结

我觉得本次项目挺有意思的,说实话项目22本来不是颜色识别的,这个是我室友他的项目上需要完成这样一个功能,然后我就花了一下午帮他做了做,效果的实现非常不错,用在比较单一背景下的物体追踪识别什么的,挺有研究意义的。最开始我还参考过其他博主对于RGB颜色的识别和框选,效果什么的我感觉不是很好,而且他们使用的方法与我最初想的一种思路有很大的接近,即是对某一感兴趣的颜色,将其临近的RGB值考虑到,实际上不是很靠谱,因为我们不知道三个值(‘R’、‘G’、‘B’)的组合会出现什么颜色,细微的改变可能变化肉眼是看不出来的,红色还是红色,像之前考虑的临近值,颜色可能是粉色或紫色,而你还是识别的红色。当然在我这里,我用到的方法是用HSV值来进行颜色检测,采用轨迹栏作为调色板,进行颜色的提取,然后将其对应的BGR值打印出来,有选择性。

偷偷给你们说一句,不要用黑色,识别时将我的头发识别的框和文字到处都是,巨搞笑。

还有一点就是,我发现环境的亮度对于颜色的识别也是有一点点的影响的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【权限提升】Linux Sudo权限提升漏洞(CVE-2023-22809)

文章目录前言一、Sudo介绍二、漏洞概述三、漏洞成因四、漏洞分析五、影响版本六、本地复现七、修复建议前言 Sudo存在权限提升漏洞,攻击者可过特定的payload获取服务器ROOT权限 一、Sudo介绍 sudo (su " do")允许系统管理员将权限委托给某些用户(或用户组),能够以…

网络安全与防御

1. 什么是IDS? IDS(入侵检测系统):入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展了系统管理员的安全管理能力,提高了信息安全基础结构的完整性。主要针对防火墙涉及不到的部分进行检测。 入侵检测主要面对的…

ChatGPT技术原理、研究框架,应用实践及发展趋势(附166份报告)

​ 一、AI框架重要性日益突显,框架技术发展进入繁荣期,国内AI框架技术加速发展: 1、AI框架作为衔接数据和模型的重要桥梁,发展进入繁荣期,国内外框架功能及性能加速迭代; 2、Pytorch、Tensorflow占据AI框…

5.2 中心极限定理

学习目标: 要学习中心极限定理,我会采取以下几个步骤: 学习基本概念:了解什么是随机变量、样本、总体、概率密度函数等基本概念,为学习中心极限定理打下基础;学习正态分布:中心极限定理的核心…

【JavaEE】计算机组成以及操作系统(进程)的基本知识

目录 前言 1、计算机基本组成 1.1、存储器 2、操作系统 2.1、 进程(任务)的概念 2.2、进程的管理 2.2.1、进程控制块PCB(process control block) 2.3、CPU分配(进程调度) 2.3.1、并发 2.3.2、并…

string容器

1、string的构造和赋值 #include #include using namespace std; void test01() { string str1(“hello world”); //使用字符串初始化 cout<<str1<<endl; string str2(5,‘A’); //使用 n 个字符串是初始化 cout<<str2<<endl; string str3 str2; …

深度学习数据集—水果数据集大合集

近期整理的各类水果&#xff08;包括干果&#xff09;数据集&#xff0c;分享给大家。 1、8类水果图片数据集&#xff08;每类100张图片左右&#xff09;[橘子&#xff0c;菠萝&#xff0c;苹果&#xff0c;木瓜&#xff0c;火龙果&#xff0c;香蕉&#xff0c;樱桃&#xff0…

系统升级 | RK3568开发平台成功搭载SylixOS国产实时操作系统

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【GPT4】微软 GPT-4 测试报告(5)与外界环境的交互能力

欢迎关注【youcans的AGI学习笔记】原创作品 微软 GPT-4 测试报告&#xff08;1&#xff09;总体介绍 微软 GPT-4 测试报告&#xff08;2&#xff09;多模态与跨学科能力 微软 GPT-4 测试报告&#xff08;3&#xff09;编程能力 微软 GPT-4 测试报告&#xff08;4&#xff09;数…

被裁了,39 岁阿里 P9,攒下 1.5 亿....

今天刷知乎&#xff0c;在问题 “40 岁因为财务自由决定不上班的人&#xff0c;个人资产总和到底有多少” 下看到一位阿里 P9 的匿名回答让我狠狠的酸了一把~ 这刚刚失业的四十岁高级码农自曝了自己的人生经历&#xff0c;作为一名“阿里 P9”的程序员&#xff0c;他讲述了自己…

重庆理工大学教授程平:智能会计时代,应充分发挥数据资产的价值

近日&#xff0c;由用友主办的「智能会计 价值财务」2023企业数智化财务创新峰会北京站在北京国家会计学院圆满举办&#xff01;来自知名院校的专家学者、央国企等大型企业财务领路人、以及权威财经媒体相约北京国家会计学院&#xff0c;一同见证“智能会计”新时代的到来&…

centos 搭建 wiki

需要安装软件 mysqlmm-wikinginx&#xff08;非必须&#xff09; mysql 1.查询本机是否安装mysql rpm -qa | grep mysql 如安装&#xff0c;知道mysql账号密码&#xff0c;可以直接使用&#xff0c;跳过此步骤 如已安装&#xff08;centos可能默认已安装mysql或者之前有人…

day13_oop

今日内容 零、 复习昨日 一、final 二、static 三、多态 四、向上转型&向下转型 五、多态应用 零、 复习昨日 封装 类的封装: 1 属性私有 2提供setget 继承 A extends B子类可以使用父类非私有属性和方法好处: 复用,多态准备 重写/覆写/覆盖/Override 子类重写父类的方法,以…

什么是雪花算法?啥原理?

1、SnowFlake核心思想 SnowFlake 算法&#xff0c;是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛&#xff0c;且 ID 引入了时间戳&#xff0c;基本上保持自增的&#xf…

关于ChatGPT人工智能浅谈

ChatGPT人工智能优点与不足 现今ChatGPT已经向我们展示了其强大的数据收集分析和处理能力&#xff0c;这点随着其不断的学习训练会越来越强。ChatGPT这类生成式人工智能在数据收集分析和处理能力这方面远远超过人类&#xff0c;虽然它目前还不能完全做到按人类的方式对数据进行…

常见的HTTP状态码及其含义

© Ptw-cwl HTTP是一种用于传输超文本数据的协议&#xff0c;在使用Java进行Web开发时&#xff0c;经常会涉及到HTTP状态码。以下是一些常见的HTTP状态码及其含义 概览 状态码含义1xx 信息性状态码指示请求已经被接受或者正在进行处理。100 Continue表示客户端可以继续发…

4月了,准备跳槽的可以看看

金三已经过去了&#xff0c;银四对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出来了。 所以准备4月跳槽、找工作的朋友&#xff0c;就一定要好好准备抓住机会&#xff0c;补一补自己的知识体系&…

第一章节 spring 概念与体系结构

1、Spring 概念 Spring 是 Java EE 编程领域的一款轻量级的开源框架&#xff0c;目标就是要简化 Java 企业级应用程序的开发难度和周期。 1.1、广义 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 项目名称描述Spring DataSpring…

一 注册中心

一 什么是注册中心 注册中心可以说是微服务架构中的“通讯录”&#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c;服务会注册到这里&#xff0c;当服务需要调用其它服务时&#xff0c;就到这里找到服务的地址&#xff0c;进行调用。 当我想给张三打电…

Windows系统管理_windows server 2016 文件系统与权限

文件系统概述 文件系统是操作系统用于明确存储设备&#xff08;磁盘、固态硬盘&#xff09;上组织文件的方法。从系统角度来 看&#xff0c;文件系统是对文件存储设备的空间进行组织和分配&#xff0c;负责文件存储并对存入的文件进行保护和 检索的系统。可以将一个文件连续地…