├── 01-选择ROI区域 ├── README.md ├── demo-pic.png ├── image_roi.png ├── select_roi.py └── 演示视频 │ └── 01-测试视频-选择图像的ROI区域.mkv ├── 02-图像颜色统计HSV ├── HSV颜色统计样例.png ├── README.md ├── image_roi.png ├── img_hsv_stat.py └── 演示视频 │ └── 02-测试视频-图像颜色统计HSV.mkv ├── 03-HSV颜色阈值动态调节工具 ├── README.md ├── ThresholdEditorGUIHsv.py ├── demo-pic.png ├── tmp_bin.png ├── 图片二值化样例.png └── 演示视频 │ └── 03-HSV颜色阈值动态调节工具.mkv ├── 04-色块识别 ├── README.md ├── color_feature.py ├── color_feature.pyc ├── demo-pic.png ├── demo-video.mkv ├── test_color_feature.py ├── 演示视频 │ └── 04-测试视频-色块识别.mkv └── 色块识别演示样例.png ├── IMG ├── HSV-Color-Space.jpg ├── HSV颜色统计样例.png ├── demo-pic.png ├── image_roi.png ├── 图片二值化样例.png ├── 宣传海报.png ├── 屏幕截图-01-测试视频-选择图像的ROI区域.mkv.png ├── 屏幕截图-03-HSV颜色阈值动态调节工具.mkv-1.png └── 色块识别演示样例.png ├── README.md └── TODO.md /01-选择ROI区域/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/01-选择ROI区域/README.md -------------------------------------------------------------------------------- /01-选择ROI区域/demo-pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/01-选择ROI区域/demo-pic.png -------------------------------------------------------------------------------- /01-选择ROI区域/image_roi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/01-选择ROI区域/image_roi.png -------------------------------------------------------------------------------- /01-选择ROI区域/select_roi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | 选取ROI区域 4 | 回车或者空格确认选择 5 | c键 撤销选择 6 | ''' 7 | import numpy as np 8 | import cv2 9 | import sys 10 | 11 | 12 | # 文件路径 13 | # img_path = 'blue-color-block.png' 14 | img_path = sys.argv[1] 15 | 16 | # 读入图片 17 | img = cv2.imread(img_path) 18 | # 创建一个窗口 19 | cv2.namedWindow("image", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) 20 | cv2.imshow("image", img) 21 | # 是否显示网格 22 | showCrosshair = True 23 | 24 | # 如果为Ture的话 , 则鼠标的其实位置就作为了roi的中心 25 | # False: 从左上角到右下角选中区域 26 | fromCenter = False 27 | # Select ROI 28 | rect = cv2.selectROI("image", img, showCrosshair, fromCenter) 29 | 30 | print("选中矩形区域") 31 | (x, y, w, h) = rect 32 | 33 | # Crop image 34 | imCrop = img[y : y+h, x:x+w] 35 | 36 | # Display cropped image 37 | cv2.imshow("image_roi", imCrop) 38 | cv2.imwrite("image_roi.png", imCrop) 39 | cv2.waitKey(0) -------------------------------------------------------------------------------- /01-选择ROI区域/演示视频/01-测试视频-选择图像的ROI区域.mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/01-选择ROI区域/演示视频/01-测试视频-选择图像的ROI区域.mkv -------------------------------------------------------------------------------- /02-图像颜色统计HSV/HSV颜色统计样例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/02-图像颜色统计HSV/HSV颜色统计样例.png -------------------------------------------------------------------------------- /02-图像颜色统计HSV/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/02-图像颜色统计HSV/README.md -------------------------------------------------------------------------------- /02-图像颜色统计HSV/image_roi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/02-图像颜色统计HSV/image_roi.png -------------------------------------------------------------------------------- /02-图像颜色统计HSV/img_hsv_stat.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ''' 4 | 绘制彩图在HSV颜色空间下的统计直方图 5 | ''' 6 | 7 | from matplotlib import pyplot as plt 8 | import numpy as np 9 | import cv2 10 | import sys 11 | 12 | # 读入图片 13 | img_path = sys.argv[1] 14 | img = cv2.imread(img_path) 15 | # img = cv2.imread('little_chess.png') 16 | if img is None: 17 | print("图片读入失败, 请检查图片路径及文件名") 18 | exit() 19 | 20 | 21 | # 将图片转换为HSV格式 22 | img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 23 | # 创建画布 24 | fig, ax = plt.subplots() 25 | # Matplotlib预设的颜色字符 26 | hsvColor = ('y', 'g', 'k') 27 | # 统计窗口间隔 , 设置小了锯齿状较为明显 最小为1 最好可以被256整除 28 | bin_win = 3 29 | # 设定统计窗口bins的总数 30 | bin_num = int(256/bin_win) 31 | # 控制画布的窗口x坐标的稀疏程度. 最密集就设定xticks_win=1 32 | xticks_win = 2 33 | # 设置标题 34 | ax.set_title('HSV Color Space') 35 | lines = [] 36 | for cidx, color in enumerate(hsvColor): 37 | # cidx channel 序号 38 | # color r / g / b 39 | cHist = cv2.calcHist([img], [cidx], None, [bin_num], [0, 256]) 40 | # 绘制折线图 41 | line, = ax.plot(cHist, color=color,linewidth=8) 42 | lines.append(line) 43 | 44 | # 标签 45 | labels = [cname +' Channel' for cname in 'HSV'] 46 | # 添加channel 47 | plt.legend(lines,labels, loc='upper right') 48 | # 设定画布的范围 49 | ax.set_xlim([0, bin_num]) 50 | # 设定x轴方向标注的位置 51 | ax.set_xticks(np.arange(0, bin_num, xticks_win)) 52 | # 设定x轴方向标注的内容 53 | ax.set_xticklabels(list(range(0, 256, bin_win*xticks_win)),rotation=45) 54 | 55 | # 显示画面 56 | plt.show() 57 | -------------------------------------------------------------------------------- /02-图像颜色统计HSV/演示视频/02-测试视频-图像颜色统计HSV.mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/02-图像颜色统计HSV/演示视频/02-测试视频-图像颜色统计HSV.mkv -------------------------------------------------------------------------------- /03-HSV颜色阈值动态调节工具/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/03-HSV颜色阈值动态调节工具/README.md -------------------------------------------------------------------------------- /03-HSV颜色阈值动态调节工具/ThresholdEditorGUIHsv.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | 可视化颜色阈值调参软件 4 | ''' 5 | 6 | import cv2 7 | import numpy as np 8 | import sys 9 | 10 | # 更新MASK图像,并且刷新windows 11 | def updateMask(): 12 | global img 13 | global lowerb 14 | global upperb 15 | global mask 16 | # 计算MASK 17 | mask = cv2.inRange(img_hsv, lowerb, upperb) 18 | 19 | cv2.imshow('mask', mask) 20 | 21 | # 更新阈值 22 | def updateThreshold(x): 23 | 24 | global lowerb 25 | global upperb 26 | 27 | minH = cv2.getTrackbarPos('minH','image') 28 | maxH = cv2.getTrackbarPos('maxH','image') 29 | minS = cv2.getTrackbarPos('minS','image') 30 | maxS = cv2.getTrackbarPos('maxS', 'image') 31 | minV = cv2.getTrackbarPos('minV', 'image') 32 | maxV = cv2.getTrackbarPos('maxV', 'image') 33 | 34 | lowerb = np.int32([minH, minS, minV]) 35 | upperb = np.int32([maxH, maxS, maxV]) 36 | 37 | print('更新阈值') 38 | print(lowerb) 39 | print(upperb) 40 | updateMask() 41 | 42 | def main(img): 43 | global img_hsv 44 | global upperb 45 | global lowerb 46 | global mask 47 | # 将图片转换为HSV格式 48 | img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 49 | 50 | # 颜色阈值 Upper 51 | upperb = None 52 | # 颜色阈值 Lower 53 | lowerb = None 54 | 55 | mask = None 56 | 57 | cv2.namedWindow('image', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) 58 | # cv2.namedWindow('image') 59 | cv2.imshow('image', img) 60 | 61 | # cv2.namedWindow('mask') 62 | cv2.namedWindow('mask', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) 63 | 64 | # 红色阈值 Bar 65 | ## 红色阈值下界 66 | cv2.createTrackbar('minH','image',0,255,updateThreshold) 67 | ## 红色阈值上界 68 | cv2.createTrackbar('maxH','image',0,255,updateThreshold) 69 | ## 设定红色阈值上界滑条的值为255 70 | cv2.setTrackbarPos('maxH', 'image', 255) 71 | cv2.setTrackbarPos('minH', 'image', 0) 72 | # 绿色阈值 Bar 73 | cv2.createTrackbar('minS','image',0,255,updateThreshold) 74 | cv2.createTrackbar('maxS','image',0,255,updateThreshold) 75 | cv2.setTrackbarPos('maxS', 'image', 255) 76 | cv2.setTrackbarPos('minS', 'image', 0) 77 | # 蓝色阈值 Bar 78 | cv2.createTrackbar('minV','image',0,255,updateThreshold) 79 | cv2.createTrackbar('maxV','image',0,255,updateThreshold) 80 | cv2.setTrackbarPos('maxV', 'image', 255) 81 | cv2.setTrackbarPos('minV', 'image', 0) 82 | 83 | # 首次初始化窗口的色块 84 | # 后面的更新 都是由getTrackbarPos产生变化而触发 85 | updateThreshold(None) 86 | 87 | print("调试棋子的颜色阈值, 键盘摁e退出程序") 88 | while cv2.waitKey(0) != ord('e'): 89 | continue 90 | 91 | cv2.imwrite('tmp_bin.png', mask) 92 | cv2.destroyAllWindows() 93 | 94 | if __name__ == "__main__": 95 | # 样例图片 (从命令行中填入) 96 | image_path = sys.argv[1] 97 | # 样例图片 (在代码中填入) 98 | # img = cv2.imread('cfs_samples.jpg') 99 | img = cv2.imread(image_path) 100 | if img is None: 101 | print("Error: 文件路径错误,没有此图片 {}".format(image_path)) 102 | exit(1) 103 | 104 | main(img) -------------------------------------------------------------------------------- /03-HSV颜色阈值动态调节工具/demo-pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/03-HSV颜色阈值动态调节工具/demo-pic.png -------------------------------------------------------------------------------- /03-HSV颜色阈值动态调节工具/tmp_bin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/03-HSV颜色阈值动态调节工具/tmp_bin.png -------------------------------------------------------------------------------- /03-HSV颜色阈值动态调节工具/图片二值化样例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/03-HSV颜色阈值动态调节工具/图片二值化样例.png -------------------------------------------------------------------------------- /03-HSV颜色阈值动态调节工具/演示视频/03-HSV颜色阈值动态调节工具.mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/03-HSV颜色阈值动态调节工具/演示视频/03-HSV颜色阈值动态调节工具.mkv -------------------------------------------------------------------------------- /04-色块识别/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/04-色块识别/README.md -------------------------------------------------------------------------------- /04-色块识别/color_feature.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | 颜色特征识别 4 | ''' 5 | import numpy as np 6 | import cv2 7 | 8 | 9 | def color_block_finder(img, lowerb, upperb, 10 | min_w=0, max_w=None, min_h=0, max_h=None): 11 | ''' 12 | 色块识别 返回矩形信息 13 | ''' 14 | # 转换色彩空间 HSV 15 | img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 16 | # 根据颜色阈值转换为二值化图像 17 | img_bin = cv2.inRange(img_hsv, lowerb, upperb) 18 | 19 | # 寻找轮廓(只寻找最外侧的色块) 20 | bimg, contours, hier = cv2.findContours(img_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 21 | # 声明画布 拷贝自img 22 | canvas = np.copy(img) 23 | # 外接矩形区域集合 24 | rects = [] 25 | 26 | if max_w is None: 27 | # 如果最大宽度没有设定,就设定为图像的宽度 28 | max_w = img.shape[1] 29 | if max_h is None: 30 | # 如果最大高度没有设定,就设定为图像的高度 31 | max_h = img.shape[0] 32 | 33 | # 遍历所有的边缘轮廓集合 34 | for cidx,cnt in enumerate(contours): 35 | # 获取联通域的外界矩形 36 | (x, y, w, h) = cv2.boundingRect(cnt) 37 | 38 | if w >= min_w and w <= max_w and h >= min_h and h <= max_h: 39 | # 将矩形的信息(tuple)添加到rects中 40 | rects.append((x, y, w, h)) 41 | return rects 42 | 43 | def draw_color_block_rect(img, rects,color=(0, 0, 255)): 44 | ''' 45 | 绘制色块的矩形区域 46 | ''' 47 | # 声明画布(canvas) 拷贝自img 48 | canvas = np.copy(img) 49 | # 遍历矩形区域 50 | for rect in rects: 51 | (x, y, w, h) = rect 52 | # 在画布上绘制矩形区域(红框) 53 | cv2.rectangle(canvas, pt1=(x, y), pt2=(x+w, y+h),color=color, thickness=3) 54 | 55 | return canvas -------------------------------------------------------------------------------- /04-色块识别/color_feature.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/04-色块识别/color_feature.pyc -------------------------------------------------------------------------------- /04-色块识别/demo-pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/04-色块识别/demo-pic.png -------------------------------------------------------------------------------- /04-色块识别/demo-video.mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/04-色块识别/demo-video.mkv -------------------------------------------------------------------------------- /04-色块识别/test_color_feature.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | 颜色特征识别测试代码 4 | ''' 5 | import numpy as np 6 | import cv2 7 | from color_feature import color_block_finder,draw_color_block_rect 8 | 9 | def test_color_block_finder_01(): 10 | ''' 11 | 色块识别测试样例1 从图片中读取并且识别 12 | ''' 13 | # 图片路径 14 | img_path = "demo-pic.png" 15 | # 颜色阈值下界(HSV) lower boudnary 16 | lowerb = (96, 210, 85) 17 | # 颜色阈值上界(HSV) upper boundary 18 | upperb = (114, 255, 231) 19 | 20 | # 读入素材图片 BGR 21 | img = cv2.imread(img_path, cv2.IMREAD_COLOR) 22 | # 检查图片是否读取成功 23 | if img is None: 24 | print("Error: 请检查图片文件路径") 25 | exit(1) 26 | 27 | # 识别色块 获取矩形区域数组 28 | rects = color_block_finder(img, lowerb, upperb) 29 | # 绘制色块的矩形区域 30 | canvas = draw_color_block_rect(img, rects) 31 | # 在HighGUI窗口 展示最终结果 32 | cv2.namedWindow('result', flags=cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) 33 | cv2.imshow('result', canvas) 34 | 35 | # 等待任意按键按下 36 | cv2.waitKey(0) 37 | # 关闭其他窗口 38 | cv2.destroyAllWindows() 39 | 40 | def test_color_block_finder_02(): 41 | ''' 42 | 色块识别测试样例2 从视频流中读取并且识别 43 | ''' 44 | # 视频路径 45 | video_path = 'demo-video.mkv' 46 | # 颜色阈值下界(HSV) lower boudnary 47 | lowerb = (96, 210, 85) 48 | # 颜色阈值上界(HSV) upper boundary 49 | upperb = (114, 255, 231) 50 | 51 | 52 | # 读入视频流 53 | cap = cv2.VideoCapture(video_path) 54 | # 色块识别结果展示 55 | cv2.namedWindow('result', flags=cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) 56 | 57 | while(True): 58 | # 逐帧获取画面 59 | # ret ? 画面是否获取成功 60 | ret, frame = cap.read() 61 | 62 | if ret: 63 | img = frame 64 | # 识别色块 获取矩形区域数组 65 | # 同时设定最小高度还有宽度,过滤噪声 66 | rects = color_block_finder(img, lowerb, upperb,min_w=10,min_h=10) 67 | # 绘制色块的矩形区域 68 | canvas = draw_color_block_rect(img, rects) 69 | # 在HighGUI窗口 展示最终结果 更新画面 70 | cv2.imshow('result', canvas) 71 | 72 | else: 73 | print("视频读取完毕或者视频路径异常") 74 | break 75 | 76 | # 这里做一下适当的延迟,每帧延时0.1s钟 77 | if cv2.waitKey(50) & 0xFF == ord('q'): 78 | break 79 | 80 | # 释放资源 81 | cap.release() 82 | cv2.destroyAllWindows() 83 | 84 | 85 | if __name__ == "__main__": 86 | # 测试图片色块识别 87 | # test_color_block_finder_01() 88 | # 测试视频流色块识别 89 | test_color_block_finder_02() 90 | -------------------------------------------------------------------------------- /04-色块识别/演示视频/04-测试视频-色块识别.mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/04-色块识别/演示视频/04-测试视频-色块识别.mkv -------------------------------------------------------------------------------- /04-色块识别/色块识别演示样例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/04-色块识别/色块识别演示样例.png -------------------------------------------------------------------------------- /IMG/HSV-Color-Space.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/HSV-Color-Space.jpg -------------------------------------------------------------------------------- /IMG/HSV颜色统计样例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/HSV颜色统计样例.png -------------------------------------------------------------------------------- /IMG/demo-pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/demo-pic.png -------------------------------------------------------------------------------- /IMG/image_roi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/image_roi.png -------------------------------------------------------------------------------- /IMG/图片二值化样例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/图片二值化样例.png -------------------------------------------------------------------------------- /IMG/宣传海报.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/宣传海报.png -------------------------------------------------------------------------------- /IMG/屏幕截图-01-测试视频-选择图像的ROI区域.mkv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/屏幕截图-01-测试视频-选择图像的ROI区域.mkv.png -------------------------------------------------------------------------------- /IMG/屏幕截图-03-HSV颜色阈值动态调节工具.mkv-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/屏幕截图-03-HSV颜色阈值动态调节工具.mkv-1.png -------------------------------------------------------------------------------- /IMG/色块识别演示样例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1zlab/1ZLAB_Color_Block_Finder/afa0c131abb1089f7d3b91862757d1a7a1c85ab2/IMG/色块识别演示样例.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenCV色块识别-1Z实验室 2 | 3 | 作者: 阿凯 4 | 出品: 1Z实验室(1zlab) **Make Things Easy** 5 | 6 | ## 前言 7 | 8 | 在OpenCV上实现颜色识别是很多人入门计算机视觉(OpenCV)首先会去学习的算法. 9 | 10 | ![色块识别演示样例](./IMG/色块识别演示样例.png) 11 | 12 | 而且颜色识别可以广泛应用于色块追踪, 巡线等机器人项目. 13 | 为了方便大家入门OpenCV以及使用OpenCV实现颜色识别, 阿凯编写了相关的**上位机脚本**, 同时也有. 刚开始的时候, 你的精力可以放在算法流程上面, 没必要在前期过于关注代码的细节. 脚本的代码阿凯也是**逐行注释**的, 也可以作为你的项目参考 . 14 | 15 | 16 | > 备注: 代码兼容Windows, Mac, Ubuntu 17 | 18 | ## 目录 19 | 20 | * [步骤1-选择ROI区域](#1选择ROI区域) 21 | * [步骤2 - 图像颜色统计HSV](#2图像颜色统计HSV) 22 | * [步骤3-颜色阈值动态调节](#3颜色阈值动态调节) 23 | * [步骤4-色块识别](#4色块识别) 24 | 25 | 26 | ## 1选择ROI区域 27 | 28 | 桌面上放置着一个瓶盖, 如果我们想识别蓝色瓶盖的话, 第一步就需要截取蓝色瓶盖的蓝色区域的子图(**ROI, Region Of Interest, 感兴趣区域**). 29 | 30 | 选择ROI区域代码在`01-选择ROI区域`文件夹下. 代码演示视频见: `01-选择ROI区域/演示视频` 31 | 32 | ![image](./IMG/demo-pic.png) 33 | 34 | ```bash 35 | python select_roi.py "图片文件路径" 36 | ``` 37 | 38 | 例如: 39 | 40 | ```bash 41 | python select_roi.py demo-pic.png 42 | ``` 43 | 44 | ![select roi](./IMG/屏幕截图-01-测试视频-选择图像的ROI区域.mkv.png) 45 | 46 | 截取出来的图像就是这样的. 47 | 48 | ![image_roi](./IMG/image_roi.png) 49 | 50 | 51 | 52 | 53 | 54 | ## 2图像颜色统计HSV 55 | 56 | 获取了瓶盖的子图之后, 我们就要对图片在**HSV颜色空间(color space)**下的统计进行可视化的绘制, 从而**获取颜色阈值的初步参考范围**. 57 | 58 | ![HSV](./IMG/HSV-Color-Space.jpg) 59 | 60 | 61 | 62 | 图像颜色统计HSV在`02-图像颜色统计HSV`文件夹下. 代码演示视频见: `02-图像颜色统计HSV/演示视频` 63 | 64 | 65 | 66 | **脚本使用方法** 67 | 68 | ```bash 69 | python img_hsv_stat.py <图片路径> 70 | ``` 71 | 72 | 应用举例. 73 | 74 | ```bash 75 | python img_hsv_stat.py image_roi.png 76 | ``` 77 | 78 | 79 | 80 | ![HSV颜色统计样例](./IMG/HSV颜色统计样例.png) 81 | 82 | 观察上面的统计图,我们可以获取到`蓝色瓶盖`在HSV颜色空间下的分布. 83 | 84 | 85 | 86 | | 通道(Channel) | 最小值(Min) | 最大值(Max) | 87 | | -------------------- | ----------- | ----------- | 88 | | H: Hue 色调/色彩 | 96 | 114 | 89 | | S: Saturation 饱和度 | 210 | 255 | 90 | | V: Value 明暗 | 174 | 216 | 91 | 92 | 93 | 94 | 95 | 96 | ## 3颜色阈值动态调节 97 | 98 | 99 | 100 | 有了大致的颜色范围还不行, 我们需要借助**颜色阈值调节工具**去细化, 对阈值进行微调. 阈值的初始设定,按照之前获取的大致范围开始.然后按照阈值进行图像**二值化(binary)**, 满足阈值条件的像素点为白色, 不满足阈值条件的像素为黑色. 101 | 102 | 103 | 104 | HSV颜色阈值动态调节工具 在`03-HSV颜色阈值动态调节工具 `文件夹下. 代码演示视频见: `03-HSV颜色阈值动态调节工具 /演示视频` 105 | 106 | ![HSV颜色阈值调节工具](./IMG/屏幕截图-03-HSV颜色阈值动态调节工具.mkv-1.png) 107 | 108 | 109 | 110 | **脚本使用说明** 111 | 112 | ```bash 113 | python ThresholdEditorGUIHsv.py + <图片路径> 114 | ``` 115 | 116 | 例如: 117 | 118 | ```bash 119 | python ThresholdEditorGUIHsv.py demo-pic.png 120 | ``` 121 | 122 | 123 | 124 | **阈值调节目标** 125 | 126 | 调节目标,就是要让**目标颜色区域变为白色.** 127 | 128 | ![二值化](./IMG/图片二值化样例.png) 129 | 130 | 选中窗口,按`E`键盘退出程序. 131 | 132 | 133 | 134 | ## 4色块识别 135 | 136 | 获取到颜色阈值了,我们就可以检索画面中的色块啦. 137 | 138 | 色块识别 在`04-色块识别 `文件夹下. 代码演示视频见: `04-色块识别 /演示视频` 139 | 140 | 141 | 142 | ![色块识别](./IMG/色块识别演示样例.png) 143 | 144 | 145 | 146 | **脚本使用方法** 147 | 148 | 运行测试程序`test_color_feature.py` 149 | 150 | ``` 151 | python test_color_feature.py 152 | ``` 153 | 154 | 默认是从视频中读入视频流, 并显示识别后的视频. 155 | 156 | 如果是从图片中读入的话就调整一下代码注释: 157 | 158 | ```python 159 | if __name__ == "__main__": 160 | # 测试图片色块识别 161 | test_color_block_finder_01() 162 | # 测试视频流色块识别 163 | # test_color_block_finder_02() 164 | ``` 165 | 166 | 167 | 168 | 色块识别的核心算法已经封装在`color_block_finder.py` 里面的`color_block_finder` 函数中, 函数返回的是Tuple类型的矩形区域. 通过`draw_color_block_rect` 函数可以绘制画面中的色块. 169 | 170 | 171 | 172 | 颜色阈值如果要调整的话, 调整这里: 173 | 174 | * `lowerb = (minH, minS, minV)` 175 | * `upperb = (maxH, maxS, maxV)` 176 | 177 | ```python 178 | def test_color_block_finder_02(): 179 | ''' 180 | 色块识别测试样例2 从视频流中读取并且识别 181 | ''' 182 | # 视频路径 183 | video_path = 'demo-video.mkv' 184 | # 颜色阈值下界(HSV) lower boudnary 185 | lowerb = (96, 210, 85) 186 | # 颜色阈值上界(HSV) upper boundary 187 | upperb = (114, 255, 231) 188 | ``` 189 | 190 | ![宣传海报](./IMG/宣传海报.png) -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | 3 | 1. 在`README.md`中添加教学链接, 添加相关词条(YUV,二值化等). 4 | 2. 对脚本工具进一步整合,编写更加用户友好型的上位机. --------------------------------------------------------------------------------