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是指定转换到相应的颜色空间;

函数返回值是转换后的图像变量。

原图像与转换后的图像如下所示:

Color Tracking by OpenCV-python_第1张图片

从两幅图像的对比结果上看,很显然,由于受到光线,杂色等的影响,颜色识别的效果并不理想,那么,我们尝试着用一些简单的形态学处理方法来解决这个问题。

首先,我们可以尝试先通过简单的腐蚀运算来消除多余的细小的噪声点。

>>>mask = cv2.erode(mask, None, iterations=2)

接着,通过膨胀运算来消除各个分散区域之间的细小缝隙。

>>>mask = cv2.dilate(mask, None, iterations=7 )

最后,再用简单的腐蚀运算来尽可能的还原色块的本来形状和大小。

>>>mask = cv2.erode(mask, None, iterations=5)

以下是形态学方法处理前后的图像对比:

Color Tracking by OpenCV-python_第2张图片

当然,如果还有一种叫轮廓近似的方法,当你由于各种原因,所想要采集的图像区域并不是一个规则的图像,而存在着或多或少,或深或浅,或大或小的毛刺,那么可以尝试用这种方法还原一个近似的规则形状。相关的函数有 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' )

效果图如下(左边边框内为截取的图形,右边为输出结果):

Color Tracking by OpenCV-python_第3张图片

(2)hsv画板:玩一下此画板,可以加深你对hsv颜色空间的理解,同时,也有利于确定hsv值。

在该文件目录下输入以下两行代码,即可弹出画板:

>>>import Color_palette_HSV

>>>Color_palette_HSV.color_palette_HSV()

效果图如下:打开开关,滑动 H,S,V 三个滑条,就可看到下方的颜色界面有明显变化。如下图所示(HSV为( 0, 255, 255)时,颜色为鲜红色),按下  ‘ Esc ’ 键退出 :

Color Tracking by OpenCV-python_第4张图片

当然这两个只是小工具,起到帮助作用,实际的颜色一般都需要试调。

这两个小工具的代码也比较简单,我就不一一介绍。

以上都是我的拙见,如果有什么错误的地方或者改进的地方,欢迎留言。

参考链接:http://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/

参考书籍:《opencv-python-tutroals》


StudentID_Tracking

你可能感兴趣的:(Color Tracking by OpenCV-python)