Python-OpenCV实现简单的颜色识别(对红色和蓝色识别并输出)

这篇具有很好参考价值的文章主要介绍了Python-OpenCV实现简单的颜色识别(对红色和蓝色识别并输出)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摄像头识别红色和蓝色并框选,当该颜色为摄像头屏幕上大多数颜色时打印出该颜色的名称

新手学习笔记,第一次写博客,若有错误还请指出( ~`_` )~

1.调包

import cv2
import numpy as np
from matplotlib import pyplot as plt

2.初始设置 

lower_red = np.array([0, 50, 100])        #为红色和蓝色设置阈值用来为之后处理图像准备
upper_red = np.array([10, 255, 255])      #该阈值是在HSV颜色空间下
lower_blue = np.array([100,50,100])
upper_blue = np.array([124, 255, 255])

red = (0,0,225)                           #设置红色和蓝色在BGR颜色空间下的数值元组
blue = (225,0,0)

cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)#设置窗口'video',大小为自适应模式
cv2.resizeWindow('video',640,480)            #为窗口设置宽度(640)和高度(480)

3.图像处理,提取颜色

def img_process(img,lower,upper):
    """根据阈值处理图像,提取阈值内的颜色。返回处理后只留下指定颜色的图像(其余为黑色)
        img:原图像;lower:最低阈值;upper:最高阈值"""
    kernel = np.ones((35, 35), np.uint8)                #创建一个35x35卷积核,卷积核内元素全为1
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)          #将BGR图像转化为HSV图像,方便颜色提取
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)  #用卷积核对图像进行形态学开运算操作,去除噪声
    mask = cv2.inRange(Open, lower, upper)              #开运算得到的图像用阈值进行二值化处理(处理后的结果为在阈值内的部分变为白色,不在阈值内的部分为黑色)
    res = cv2.bitwise_and(img, img, mask = mask)        #二值化处理后的图像与原图进行位与运算(处理后在阈值内的颜色变为原颜色,不在阈值内的部分仍为黑色)
    return res                                          #该函数的返回值为位与运算之后的图像,此图像只保留了在阈值内的图像,其余部分为黑色

4.轮廓绘制

def cnts_draw(img,res,color):
    """在原图像上绘出指定颜色的轮廓。无返回值
        img:原图像;res:只剩某颜色的位与运算后的图像;color:轮廓的颜色"""
    canny = cv2.Canny(res,100,200)#Canny边缘检测算法,用来描绘图像中物体的边缘,(100,200为此函数的两个阈值,该阈值越小轮廓的细节越丰富)
    contours, hierarchy=cv2.findContours(canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#寻找图像轮廓的函数,这里先用Canny算法得到只保留轮廓的图像方便轮廓的找寻
    if len(contours) == 0:#传递到max函数中的轮廓不能为空
        cv2.imshow('video',img)
        return
    else:
        max_cnt = max(contours , key = cv2.contourArea)#找到轮廓中最大的一个
        cv2.drawContours(img, max_cnt,-1,color,2)#在原图上绘制这个最大轮廓
        (x,y,w,h) = cv2.boundingRect(max_cnt)#找到这个最大轮廓的最大外接矩形,返回的(x,y)为这个矩形右下角的顶点,w为宽度,h为高度
        cv2.rectangle(img,(x,y),(x+w,y+h),color,3)#在原图上绘制这个矩形
        cv2.imshow('video', img)#展示原图

 5.颜色识别

def colorfind(img):
    """找到原图像最多的颜色,当该颜色为红色或蓝色时打印出来该颜色的名称,无返回值
        img:原图像"""
    kernel = np.ones((35, 35), np.uint8)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)#以上为图像处理
    hist = cv2.calcHist([Open],[0],None,[180],[0,180])#对Open图像的H通道进行直方图统计
    hist_max = np.where(hist == np.max(hist))#找到直方图hist中列方向最大的点hist_max
    if 0 < hist_max[0] < 10:#hist_max[0]为hist_max的行方向的值,即H的值,H在0~10为红色
        print('red')        
    elif 100 < hist_max[0] < 124:#H在100~124为蓝色
        print('blue')
    else :                       #H不在前两者之间跳出函数
        return
#可以添加对H的判断来识别更多的颜色

 下面是OpenCV中HSV空间颜色对照表

Python-OpenCV实现简单的颜色识别(对红色和蓝色识别并输出)

6.程序主体

if __name__ == "__main__":
    cap = cv2.VideoCapture(0)#打开摄像头(0代表打开默认摄像头,若有两个摄像头可用1表示打开另一个摄像头)
    while cap.isOpened():#判断摄像头是否正常打开
        flag, frame = cap.read()#读取摄像头返回两个参数,flag是布尔类型代表摄像头是否正常读取,frame是从摄像头读取的图像
        if not flag:            #若无法读取则跳出循环
            print("无法读取摄像头!")
            break
        else:
            if frame is not None: #判断摄像头有无画面
                res_blue = img_process(frame,lower_blue,upper_blue)
                res_red = img_process(frame,lower_red,upper_red)
                cnts_draw(frame,res_blue,blue)
                cnts_draw(frame,res_red,red)
                colorfind(frame)
                key = cv2.waitKey(10)
                if key == 27:
                    break
            else:
                print("无画面")
                break


    cap.release()#释放资源,停止读取摄像头
    cv2.destroyAllWindows()#关闭所有窗口

完整源代码

import cv2
import numpy as np
from matplotlib import pyplot as plt


lower_red = np.array([0, 50, 100])
upper_red = np.array([10, 255, 255])
lower_blue = np.array([100,50,100])
upper_blue = np.array([124, 255, 255])     #若绘制轮廓与自己期望的识别结果相差较大,可通过调整阈值来改变识别结果
red = (0,0,225)
blue = (225,0,0)


cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)
cv2.resizeWindow('video',640,480)

def img_process(img,lower,upper):
    """根据阈值处理图像,提取阈值内的颜色。返回处理后只留下指定颜色的图像(其余为黑色)
        img:原图像;lower:最低阈值;upper:最高阈值"""
    kernel = np.ones((35, 35), np.uint8)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)
    mask = cv2.inRange(Open, lower, upper)
    res = cv2.bitwise_and(img, img, mask = mask)
    return res

def cnts_draw(img,res,color):
    """在原图像上绘出指定颜色的轮廓。无返回值
        img:原图像;res:只剩某颜色的位与运算后的图像;color:轮廓的颜色"""
    canny = cv2.Canny(res,100,200)
    contours, hierarchy=cv2.findContours(canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    if len(contours) == 0:
        cv2.imshow('video',img)
        return
    else:
        max_cnt = max(contours , key = cv2.contourArea)
        cv2.drawContours(img, max_cnt,-1,color,2)
        (x,y,w,h) = cv2.boundingRect(max_cnt)
        cv2.rectangle(img,(x,y),(x+w,y+h),color,3)
        cv2.imshow('video', img)

        
def colorfind(img):
    """找到原图像最多的颜色,当该颜色为红色或蓝色时打印出来该颜色的名称,无返回值
        img:原图像"""
    kernel = np.ones((35, 35), np.uint8)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)
    hist = cv2.calcHist([Open],[0],None,[180],[0,180])
    hist_max = np.where(hist == np.max(hist))
    if 0 < hist_max[0] < 10:
        print('red')
    elif 100 < hist_max[0] < 124:
        print('blue')
    else :
        return

if __name__ == "__main__":
    cap = cv2.VideoCapture(0)
    while cap.isOpened():
        flag, frame = cap.read()
        if not flag:
            print("无法读取摄像头!")
            break
        else:
            if frame is not None: 
                res_blue = img_process(frame,lower_blue,upper_blue)
                res_red = img_process(frame,lower_red,upper_red)
                cnts_draw(frame,res_blue,blue)
                cnts_draw(frame,res_red,red)
                colorfind(frame)
                key = cv2.waitKey(10)
                if key == 27:
                    break
            else:
                print("无画面")
                break


    cap.release()
    cv2.destroyAllWindows()

下面是程序运行的实例

Python-OpenCV实现简单的颜色识别(对红色和蓝色识别并输出)

Python-OpenCV实现简单的颜色识别(对红色和蓝色识别并输出) 

 文章来源地址https://www.toymoban.com/news/detail-510491.html

到了这里,关于Python-OpenCV实现简单的颜色识别(对红色和蓝色识别并输出)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于python-opencv,svm的开源人脸识别项目

      前言       本项目是我自己在学校里完成的一个小项目,本项目为基于python-opencv,svm的人脸识别开源项目,不同于其他的直接从kaggle等获取划分好的数据集,本项目致力于从无到有的完成机器学习的所有步骤,即: 目录 项目展示: 一、数据采集 1.创建爬虫项目 2.修改set

    2024年02月08日
    浏览(47)
  • OpenCV-Python:简单实现人脸识别

    core 核心功能模块。该模块主要包含 OpenCV库的基础结构以及基本操作,例如OpenCV基础数据结构、绘图函数、数组操作相关函数、动态数据结构等calib3d: 这个模块名称是有 calibration(校准)和 3D 两个术语的缩写组合而成。包含了相机标定与立体视觉等功能,例如物体位姿估计

    2024年02月09日
    浏览(44)
  • OpenCV+python实现摄像头简单手势识别--进度条控制亮度

    例如:随着人工智能的不断发展,计算机视觉这门技术也越来越重要,很多人都开启了学习计算机视觉,本文在Opencv基础上实现了摄像头简单手势识别–进度条控制亮度的基础内容,并没有使用深度学习技术,因此准确率并不高。 ∙ bullet ∙ 第一步: 开启摄像头,检测每帧图

    2023年04月08日
    浏览(50)
  • Python+OpenCV 简单实现人脸检测多个和人脸识别 2(附代码)

    如果dilb和face_recognition第三方包安装失败,请移步到Python 解决dilb和face_recognition第三方包安装失败_水w的博客-CSDN博客 上篇请移步到Python+dilb 简单实现人脸检测(附代码)_水w的博客-CSDN博客 本篇是在上篇的工作基础上进行的。 目录 6 人脸检测多个 7 视频检测 8 拍照保存 9 训练

    2024年01月16日
    浏览(54)
  • 【Opencv实战】颜色测试:你是色盲/色弱吗?从零带你了解色彩与原理,简单的颜色识别小程序,感动.jpg(全是干货)

    Hello,大家好呀!我是木木子吖~ 一个集美貌幽默风趣善良可爱并努力码代码的程序媛一枚。 听说关注我的人会一夜暴富发大财哦~ (哇哇哇 这真的爱😍😍) 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 为什么用手机自拍时,它能识别出你的脸,还能估算

    2024年02月09日
    浏览(69)
  • 竞赛选题 深度学习YOLOv5车辆颜色识别检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com

    2024年02月07日
    浏览(60)
  • 【毕业设计】深度学习YOLOv5车辆颜色识别检测 - python opencv

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月16日
    浏览(49)
  • opencv-python识别魔方特定颜色方块,并输出各方块中心坐标

    先叠个甲(作者寒假才开始自学opencv,做题练手,还不是很熟练,如果有不正确或者有更好的方法,欢迎在评论区指出) 题目 : 从网上寻找任一魔方图片,识别其中白色色块,描绘并输出其中所有白色色块的中心点坐标(也可选择其他颜色,代码有变化,后续指出) 首先我

    2024年02月10日
    浏览(68)
  • 基于OpenCV实现对图片及视频中感兴趣区域颜色识别

    学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量

    2023年04月09日
    浏览(62)
  • 计算机竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包