Color Tracking by OpenCV-python
最近,初学OpenCV-python,参考资料,做了一个简单的基于颜色识别的学生证追踪程序,与大家分享如下:
程序主要由三部分构成:
一,摄像头的初始化与采集图像
二,图像处理算法
三,录制视频
程序如下:
(1)打开我的PyScripter编辑器,导入一些必要的包:cv2 是 Opencv 包;numpy 是 矩阵运算相关的包
>>>import cv2
>>>import numpy as np
(2)开启摄像头并配置好相关参数,为图像的采集与保存做准备
>>>cap = cv2.VideoCapture(0)
>>>fourcc = cv2.cv.CV_FOURCC("D", "I", "B", " ")
>>>out = cv2.VideoWriter( 'StudentID_Tracking.avi', fourcc, 20, (640,480) )
做好准备工作后,开始进入正题,即一个实时跟踪颜色并显示的大循环。我们尝试着用 OpenCV 包中的 cv2.inRange() 函数来识别hsv空间下的指定颜色。该函数需要输入三个参数。
参数1是待处理的图像变量;
参数2是指定颜色的hsv下限值;
参数3是指定颜色的hsv上限值;
函数返回值是处理后的二值图像。
(对于HSV颜色空间与RGB颜色空间的相关知识,可以参考以下链接)
通过 cv2.cvtColor() 函数可以将指定图像转换到指定的颜色空间。该函数需要输入两个参数。
参数1是待处理的图像变量;
参数2是指定转换到相应的颜色空间;
函数返回值是转换后的图像变量。
原图像与转换后的图像如下所示:
从两幅图像的对比结果上看,很显然,由于受到光线,杂色等的影响,颜色识别的效果并不理想,那么,我们尝试着用一些简单的形态学处理方法来解决这个问题。
首先,我们可以尝试先通过简单的腐蚀运算来消除多余的细小的噪声点。
>>>mask = cv2.erode(mask, None, iterations=2)
接着,通过膨胀运算来消除各个分散区域之间的细小缝隙。
>>>mask = cv2.dilate(mask, None, iterations=7 )
最后,再用简单的腐蚀运算来尽可能的还原色块的本来形状和大小。
>>>mask = cv2.erode(mask, None, iterations=5)
以下是形态学方法处理前后的图像对比:
当然,如果还有一种叫轮廓近似的方法,当你由于各种原因,所想要采集的图像区域并不是一个规则的图像,而存在着或多或少,或深或浅,或大或小的毛刺,那么可以尝试用这种方法还原一个近似的规则形状。相关的函数有 cv2.approxPolyDP() ,有兴趣的朋友可以尝试一下。
处理后的二值化图像方便我们进行轮廓的提取。需要用到的函数是 cv2.findContours() 。该函数需要输入三个参数。
参数1是待处理的图像变量;
参数2是指定轮廓的检索模式;
参数3是指定轮廓的近似方法;
该函数返回两个值,1是轮廓本身,2是每条轮廓对应的属性。
>>>cnts = cv2.findContours( mask.copy(), cv2.RETR_CCOMP,
cv2.CHAIN_APPROX_SIMPLE)[-2]
当识别到轮廓时,我们通过寻找最大的轮廓来消除噪声干扰,以确保识别的准确性。
>>>c = max( cnts, key = cv2.contourArea )
通过以下两条语句,计算所勾勒轮廓的质心。
>>>M = cv2.moments( c )
>>>center = ( int ( M[ "m10" ] / M[ "m00" ] ), int ( M[ "m01" ] / M[ "m00" ] ) )
在质心位置画出一个蓝色的实心圆点。
>>>cv2.circle( background, center, 5, ( 255, 0, 0 ), -1 )
至此,我们已经完成了本程序最核心的部分。
不要忘了,我们还要录屏:
>>>out.write( background )
录制出来的视频在文末。
最后,我们仍需要再做一些收尾工作:通过按下键盘上的 ‘ q ’ 键退出大循环。
>>>key = cv2.waitKey(1) & 0xFF
>>> if key == ord("q"):
>>> break
同时要释放摄像头和销毁窗口。
>>>cap.release()
>>>out.release()
>>>cv2.destroyAllWindows()
至此,一个基于颜色识别的学生证追踪程序已经完成。
在编写这个程序的过程中,我还编写了两个小工具。主要可以帮助我们确定指定颜色区域的hsv值上限和hsv值下限。
下面分别介绍一下这两个小工具:
(1)抠图工具:运用此工具,再图像界面上,按下左键取起始点后松开,通过移动鼠标可以拉出一个矩形,按下右键后可以确定矩形的边框,从而抠出一个指定的矩形区域,并返回该区域的hsv的上限值与下限值。
在该文件目录下输入以下两行代码,即可弹出图像界面。
>>>import Detectcolor2hsv
>>>Detectcolor2hsv.detectcolor2hsv( 'opencvlogo.jpg' )
效果图如下(左边边框内为截取的图形,右边为输出结果):
(2)hsv画板:玩一下此画板,可以加深你对hsv颜色空间的理解,同时,也有利于确定hsv值。
在该文件目录下输入以下两行代码,即可弹出画板:
>>>import Color_palette_HSV
>>>Color_palette_HSV.color_palette_HSV()
效果图如下:打开开关,滑动 H,S,V 三个滑条,就可看到下方的颜色界面有明显变化。如下图所示(HSV为( 0, 255, 255)时,颜色为鲜红色),按下 ‘ Esc ’ 键退出 :
当然这两个只是小工具,起到帮助作用,实际的颜色一般都需要试调。
这两个小工具的代码也比较简单,我就不一一介绍。
以上都是我的拙见,如果有什么错误的地方或者改进的地方,欢迎留言。
参考链接:http://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/
参考书籍:《opencv-python-tutroals》
StudentID_Tracking