美文网首页OpenCv
Color Tracking by OpenCV-python

Color Tracking by OpenCV-python

作者: 道上的蚂蚁 | 来源:发表于2017-09-13 12:19 被阅读212次

    最近,初学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

    相关文章

      网友评论

      本文标题:Color Tracking by OpenCV-python

      本文链接:https://www.haomeiwen.com/subject/qlcscxtx.html