脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python+OpenCV实现图片及视频中选定区域颜色识别

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

2022-07-22 17:53wydilearn Python

这篇文章主要为大家详细介绍了如何利用Python+OpenCV实现图片及视频中选定区域颜色识别功能,文中的示例代码讲解详细,感兴趣的可以了解一下

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

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

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

colorList.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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

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

示例图片2

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

示例图片3

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

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

原文链接:https://www.cnblogs.com/wydilearn/p/16505887.html

延伸 · 阅读

精彩推荐
  • Pythonpython daemon守护进程实现

    python daemon守护进程实现

    这篇文章主要介绍了python daemon守护进程实现,需要的朋友可以参考下...

    Python教程网2392020-09-05
  • Pythonpython 设置输出图像的像素大小方法

    python 设置输出图像的像素大小方法

    今天小编就为大家分享一篇python 设置输出图像的像素大小方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    妖白12302021-07-31
  • Pythonpython多线程http压力测试脚本

    python多线程http压力测试脚本

    这篇文章主要为大家详细介绍了python多线程http压力测试脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    feihuadao6262021-07-20
  • PythonPython异常处理操作实例详解

    Python异常处理操作实例详解

    这篇文章主要介绍了Python异常处理操作,结合实例形式分析了Python异常处理的相关原理、操作语句与使用技巧,需要的朋友可以参考下...

    chengqiuming10832021-02-20
  • Python详解tensorflow实现迁移学习实例

    详解tensorflow实现迁移学习实例

    本篇文章主要介绍了详解tensorflow实现迁移学习实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    疯女孩爱飞10292021-01-14
  • Pythonpython实现搜索文本文件内容脚本

    python实现搜索文本文件内容脚本

    这篇文章主要为大家详细介绍了python实现搜索文本文件内容的脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    warrenjiang9942021-03-08
  • Python几行Python代码爬取3000+上市公司的信息

    几行Python代码爬取3000+上市公司的信息

    今天小编就为大家分享一篇关于几行Python代码爬取3000+上市公司的信息,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Python新世界10372021-05-21
  • Python如何利用装饰器实现 Python 函数重载

    如何利用装饰器实现 Python 函数重载

    这篇文章主要介绍了如何利用装饰器实现 Python 函数重载,需要的朋友可以参考下面文章内容,希望能帮助到你...

    豌豆花下猫7662022-01-01