Python+OpenCV实现图片及视频中选定区域颜色识别

近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步优化,但提升有限。

主要实现过程:按不同颜色的取值范围,对图像进行循环遍历,转换为灰度图,将本次遍历的颜色像素转换为白色,对白色部分进行膨胀处理,使其更加连续,计算白色部分外轮廓包围的面积累加求和,比较每种颜色围起来面积,保存最大值及其颜色,所有颜色遍历完后,返回最大值对应的颜色,显示在图像上

如果有类似的颜色识别的任务,可参考以下代码修改后实现具体需求

colorList.py

import numpy as np
import collections

# 将rgb图像转换为hsv图像后,确定不同颜色的取值范围
def getColorList():
    dict = collections.defaultdict(list)

    # black
    lower_black = np.array([0, 0, 0])
    upper_black = np.array([180, 255, 46])
    color_list_black = []
    color_list_black.append(lower_black)
    color_list_black.append(upper_black)
    dict['black'] = color_list_black

    # gray
    lower_gray = np.array([0, 0, 46])
    upper_gray = np.array([180, 43, 220])
    color_list_gray= []
    color_list_gray.append(lower_gray)
    color_list_gray.append(upper_gray)
    dict['gray'] = color_list_gray

    # white
    lower_white = np.array([0, 0, 221])
    upper_white = np.array([180, 30, 255])
    color_list_white = []
    color_list_white.append(lower_white)
    color_list_white.append(upper_white)
    dict['white'] = color_list_white

    # red
    lower_red = np.array([156, 43, 46])
    upper_red = np.array([180, 255, 255])
    color_list_red = []
    color_list_red.append(lower_red)
    color_list_red.append(upper_red)
    dict['red'] = color_list_red

    # red2
    lower_red = np.array([0, 43, 46])
    upper_red = np.array([10, 255, 255])
    color_list_red2 = []
    color_list_red2.append(lower_red)
    color_list_red2.append(upper_red)
    dict['red2'] = color_list_red2

    # orange
    lower_orange = np.array([11, 43, 46])
    upper_orange = np.array([25, 255, 255])
    color_list_orange = []
    color_list_orange.append(lower_orange)
    color_list_orange.append(upper_orange)
    dict['orange'] = color_list_orange

    # yellow
    lower_yellow = np.array([26, 43, 46])
    upper_yellow = np.array([34, 255, 255])
    color_list_yellow = []
    color_list_yellow.append(lower_yellow)
    color_list_yellow.append(upper_yellow)
    dict['yellow'] = color_list_yellow

    # green
    lower_green = np.array([35, 43, 46])
    upper_green = np.array([77, 255, 255])
    color_list_green = []
    color_list_green.append(lower_green)
    color_list_green.append(upper_green)
    dict['green'] = color_list_green

    # cyan
    lower_cyan = np.array([78, 43, 46])
    upper_cyan = np.array([99, 255, 255])
    color_list_cyan = []
    color_list_cyan.append(lower_cyan)
    color_list_cyan.append(upper_cyan)
    dict['cyan'] = color_list_cyan

    # blue
    lower_blue = np.array([100, 43, 46])
    upper_blue = np.array([124, 255, 255])
    color_list_blue = []
    color_list_blue.append(lower_blue)
    color_list_blue.append(upper_blue)
    dict['blue'] = color_list_blue

    # purple
    lower_purple = np.array([125, 43, 46])
    upper_purple = np.array([155, 255, 255])
    color_list_purple = []
    color_list_purple.append(lower_purple)
    color_list_purple.append(upper_purple)
    dict['purple'] = color_list_purple

    return dict

if __name__ == '__main__':
    color_dict = getColorList()
    print(color_dict)

    num = len(color_dict)
    print('num=', num)

    for d in color_dict:
        print('key=', d)
        print('value=', color_dict[d][1])

image_color_realize.py

import cv2
import colorList

# 实现对图片中目标区域颜色的识别
def get_color(frame):
    print('go in get_color')
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    maxsum = 0
    color = None
    color_dict = colorList.getColorList()

    # count = 0

    for d in color_dict:
        mask = cv2.inRange(hsv, color_dict[d][0], color_dict[d][1])  # 在后两个参数范围内的值变成255
        binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]  # 在灰度图片中,像素值大于127的都变成255,[1]表示调用图像,也就是该函数第二个返回值

        # cv2.imshow("0",binary)
        # cv2.waitKey(0)
        # count+=1

        binary = cv2.dilate(binary, None, iterations=2)  # 使用默认内核进行膨胀操作,操作两次,使缝隙变小,图像更连续
        cnts = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  # 获取该函数倒数第二个返回值轮廓
        sum = 0
        for c in cnts:
            sum += cv2.contourArea(c)  # 获取该颜色所有轮廓围成的面积的和
        # print("%s  , %d" %(d, sum ))
        if sum > maxsum:
            maxsum = sum
            color = d
            if color == 'red2':
                color = 'red'
            elif color == 'orange':
                color = 'yellow'
            elif color == 'purple' or color == 'blue' or color == 'cyan' or color == 'white' or color == 'green':
                color = 'normal'
    return color

if __name__ == '__main__':
    filename = "C:/Users/admin/Desktop/water_samples/live01.jpg"
    frame = cv2.imread(filename)
    # frame = frame[180:280, 180:380]  # [y:y+h, x:x+w] 注意x,y顺序
    color = get_color(frame)

    # 绘制文本
    cv2.putText(img=frame,text=color,org=(20,50),fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                fontScale=1.0,color=(0,255,0),thickness=2)

    # cv2.namedWindow('frame',cv2.WINDOW_NORMAL)  # 设置显示窗口可调节
    cv2.imshow('frame',frame)
    cv2.waitKey(0)

video_color_realize.py

import cv2
import xf_color

# 对视频或摄像头获取的影像目标区域颜色进行识别

cap = cv2.VideoCapture("C:/Users/admin/Desktop/water_samples/01.mp4")
# cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1100)  # 这里窗口大小调节只对摄像头有效
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 750)

while cap.isOpened():
    ret, frame0 = cap.read()
    # 对图像帧进行翻转(因为opencv图像和我们正常是反着的) 视频是正常的,摄像头是反转的
    # frame0 = cv2.flip(src=frame0, flipCode=2)

    # frame = frame[180:280, 180:380]  # [y:y+h, x:x+w]
    # frame = frame0[200:400, 100:300]  # 设置检测颜色的区域,四个顶点坐标
    frame = frame0

    # frame=cv2.resize(src=frame,dsize=(750,600))
    hsv_frame = cv2.cvtColor(src=frame, code=cv2.COLOR_BGR2HSV)
    # 获取读取的帧的高宽
    height, width, channel = frame.shape
    color = xf_color.get_color(hsv_frame)
    # 绘制文本
    cv2.putText(img=frame0, text=color, org=(20, 50), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                fontScale=1.0, color=(0, 255, 0), thickness=2)
    cv2.imshow('frame', frame0)
    key = cv2.waitKey(1)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')

效果如下:

示例图片1

示例图片2

示例图片3

到此这篇关于Python+OpenCV实现图片及视频中选定区域颜色识别的文章就介绍到这了,更多相关Python OpenCV颜色识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv如何识别图片上带颜色的圆

    本文实例为大家分享了opencv识别图片上带颜色的圆的具体代码,供大家参考,具体内容如下 识别带颜色的圆,首先需要先查询该颜色的HSV值,下图部分紫色归为红色了: 比如红色: //红色的HSV值 int low_H = 0,low_S = 123,low_V = 100; int High_H = 5,High_S = 255,High_V = 255; 然后将图片从BGR转化成HSV,接着二值化: cvtColor(image,src,COLOR_BGR2HSV); //从BGR-> HSV

  • opencv摄像头捕获识别颜色

    本文实例为大家分享了opencv摄像头捕获识别颜色的具体代码,供大家参考,具体内容如下 #include "highgui.h" #include "iostream" using namespace std; int main() { CvCapture* pCap = cvCreateCameraCapture(1 );//这里-1也可以,不过我的电脑装的有CyberLink YouCam软件, int flag=0; //OpenCV会默认调用该摄像头,而不调

  • python+opencv实现文字颜色识别与标定功能

    最近接了一个比较简单的图像处理的单子,花了一点时间随便写了一下: 数据集客户没有是自己随便创建的: 程序如下: """ Code creation time:September 11, 2021 Author:PanBo Realize function:It mainly realizes the recognition and calibration of fonts with different colors """ import nump

  • Python+OpenCV实现基于颜色的目标识别

    目录 任务 主要代码 效果展示 学习了一点opencv的知识于是找了个小项目来实践一下.这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,也欢迎各位大佬指正. 任务 让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标. 因为场地固定,背景单一,所以省下来很多操作和处理.于是就有两种解决思路:第一种是基于气球形状做轮廓提取,只要是闭合椭圆或圆形形就认为是目标物体:第二种是基于气球颜色,只要符合目标物体的颜色就认为是目标物体. 因为摄像头是装在四足机器人(它的

  • Python+OpenCV实现图片及视频中选定区域颜色识别

    近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步优化,但提升有限. 主要实现过程:按不同颜色的取值范围,对图像进行循环遍历,转换为灰度图,将本次遍历的颜色像素转换为白色,对白色部分进行膨胀处理,使其更加连续,计算白色部分外轮廓包围的面积累加求和,比较每种颜色围起来面积,保存最大值及其颜色,所有颜色遍历完后,返回最大值对应的颜色,显示在图像上 如果有类似的颜色识别的任务,可参考以下代码修改后实现具

  • opencv实现图片与视频中人脸检测功能

    本文实例为大家分享了opencv实现人脸检测功能的具体代码,供大家参考,具体内容如下 第一章:反思与总结 上一篇博客我相信自己将人脸检测中的AdaBoost算法解释的非常清晰了,以及如何训练人脸检测的强分类器:人脸检测中AdaBoost算法详解.事后,自我感觉对这个人脸检测还是不够具体,所以自己抽了一下午的时间用opencv实现图片与视频中的人脸检测,下面是我用vs2013加opencv4.9来实现的.做一下声明,我的代码是参考OpenCV实现人脸检测的一个博客写的,非常感谢这位博主,我学到了很

  • 对Python+opencv将图片生成视频的实例详解

    如下所示: import cv2 fps = 16 size = (width,height) videowriter = cv2.VideoWriter("a.avi",cv2.VideoWriter_fourcc('M','J','P','G'),fps,size) for i in range(1,200): img = cv2.imread('%d'.jpg % i) videowriter.write(img) 以上这篇对Python+opencv将图片生成视频的实例详解就是

  • 巧妙使用python opencv库玩转视频帧率

    目录 需求背景 关于opencv 安装opencv opencv-python获取视频相关信息 需求背景 在很多时候我们需要抽取视频的某一帧做一些分析或修改等:比如笔者需求就是判断一个人在该视频中出现的频率,以判断他是否是这段视频的主角: 关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高

  • Python+OpenCV 实现图片无损旋转90°且无黑边

    0. 引言 有如上一张图片,在以往的图像旋转处理中,往往得到如图所示的图片. 然而,在进行一些其他图像处理或者图像展示时,黑边带来了一些不便.本文解决图片旋转后出现黑边的问题,实现了图片尺寸不变的旋转(以上提到的黑边是图片的一部分). 1. 方法流程 (1)旋转图片,得到有黑边的旋转图片. (2)找出图片区域(不含黑边)的位置. (3)创建一个空图片(其实是矩阵). (4)将图片区域搬到此空图片. 2. 程序 #!/usr/bin/python # -*- coding: UTF-8 -*- "

  • python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)

    一.利用直方图的方式进行批量的图片缺陷检测(方法简单) 二.步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比较 img = cv2.imread("0.bmp") #原图灰度转换 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) #循环要检测的图,均灰度化 for i in range(1, 6): t1=cv2.cvtColor(cv2.imread

  • python opencv旋转图片的使用方法

    背景 在图像处理中,有的时候会有对图片进行角度旋转的处理,尤其是在计算机视觉中对于图像扩充,旋转角度扩充图片是一种常见的处理.这种旋转图片的应用场景也比较多,比如用户上传图片是竖着的时候,不好进行处理,也需要对其进行旋转,以便后续算法处理.常见的旋转处理有两种方式,一种是转化为numpy矩阵后,对numpy矩阵进行处理,另外一种是使用opencv自带的函数进行各种变换处理,以实现旋转角度的结果. 原始图像: opencv函数 旋转中常用的函数有以下几个函数 cv2.transpose: 对图像矩

  • python OpenCV计算图片相似度的5种算法

    目录 5种算法 参考文章: 原始两张图片: 代码运行结果如下. 5种算法 值哈希算法.差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同. 三直方图和单通道直方图的值为0-1,值越大,相似度越高. 源代码如下: import cv2 import numpy as np from PIL import Image import requests from io import BytesIO import matplotlib matplo

  • Python OpenCV实现图片预处理的方法详解

    目录 一.图片预处理 1.1 边界填充(padding) 1.2 融合图片(mixup) 1.3 图像阈值 二.滤波器 2.1 均值滤波器 2.2 方框滤波器 2.3 高斯滤波器 2.4 中值滤波 2.5 所有滤波器按照上述顺序输出 一.图片预处理 1.1 边界填充(padding) 方法 : cv2.copyMakeBorder BORDER_REPLICATE:复制法,也就是复制最边缘像素. BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abc

  • python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法

    如下所示: #coding=utf-8 #读取图片 返回图片某像素点的b,g,r值 import cv2 import numpy as np img=cv2.imread('./o.jpg') px=img[10,10] print px blue=img[10,10,0] print blue green=img[10,10,1] print blue red=img[10,10,2] print blue 以上这篇python opencv 读取图片 返回图片某像素点的b,g,r值的实现方

随机推荐