-->
-->
智能设备

树莓派之球形追踪

字号+作者: 来源: 2016-01-27 16:52 我要评论() 收藏成功收藏本文

展示如何用树莓上的OpenCV追踪兵乓球。它也可以用来追踪任何能从背景中探测到的球形物体,可以应用于捡球机器人或其他的一些项目。...

教程展示如何用树莓上的OpenCV追踪兵乓球。它也可以用来追踪任何能从背景中探测到的球形物体,可以应用于捡球机器人或其他的一些项目。

所需材料:

  • 树莓派

  • 支持树莓派的USB摄像头

  • 一台Linux主机(最好是Linux Mint/ Ubuntu),我已经用Linux Mint 17测试过了

  • 对debian系统的经验

第一步:初始设置

  • 连接键盘,鼠标,摄像头,以太网或无线网卡,HDMI显示器,电源

  • 给树莓派供电

  • Raspbian 引导到GUI (图形用户界面)

  • 打开终端并安装 OpenCV

  • 将下发代码另存为bdtct.py,文件复制"bdtct.py"到树莓派主文件夹

import cv2
import cv2.cv as cv
import numpy as np

kernel = np.ones((5,5),np.uint8)

# Take input from webcam
cap = cv2.VideoCapture(-1)

# Reduce the size of video to 320x240 so rpi can process faster
cap.set(3,320)
cap.set(4,240)

def nothing(x):
    pass
# Creating a windows for later use
cv2.namedWindow('HueComp')
cv2.namedWindow('SatComp')
cv2.namedWindow('ValComp')
cv2.namedWindow('closing')
cv2.namedWindow('tracking')


# Creating track bar for min and max for hue, saturation and value
# You can adjust the defaults as you like
cv2.createTrackbar('hmin', 'HueComp',12,179,nothing)
cv2.createTrackbar('hmax', 'HueComp',37,179,nothing)

cv2.createTrackbar('smin', 'SatComp',96,255,nothing)
cv2.createTrackbar('smax', 'SatComp',255,255,nothing)

cv2.createTrackbar('vmin', 'ValComp',186,255,nothing)
cv2.createTrackbar('vmax', 'ValComp',255,255,nothing)

# My experimental values
# hmn = 12
# hmx = 37
# smn = 145
# smx = 255
# vmn = 186
# vmx = 255


while(1):

    buzz = 0
    _, frame = cap.read()

    #converting to HSV
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    hue,sat,val = cv2.split(hsv)

    # get info from track bar and appy to result
    hmn = cv2.getTrackbarPos('hmin','HueComp')
    hmx = cv2.getTrackbarPos('hmax','HueComp')
    

    smn = cv2.getTrackbarPos('smin','SatComp')
    smx = cv2.getTrackbarPos('smax','SatComp')


    vmn = cv2.getTrackbarPos('vmin','ValComp')
    vmx = cv2.getTrackbarPos('vmax','ValComp')

    # Apply thresholding
    hthresh = cv2.inRange(np.array(hue),np.array(hmn),np.array(hmx))
    sthresh = cv2.inRange(np.array(sat),np.array(smn),np.array(smx))
    vthresh = cv2.inRange(np.array(val),np.array(vmn),np.array(vmx))

    # AND h s and v
    tracking = cv2.bitwise_and(hthresh,cv2.bitwise_and(sthresh,vthresh))

    # Some morpholigical filtering
    dilation = cv2.dilate(tracking,kernel,iterations = 1)
    closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)
    closing = cv2.GaussianBlur(closing,(5,5),0)

    # Detect circles using HoughCircles
    circles = cv2.HoughCircles(closing,cv.CV_HOUGH_GRADIENT,2,120,param1=120,param2=50,minRadius=10,maxRadius=0)
    # circles = np.uint16(np.around(circles))

    #Draw Circles
    if circles is not None:
            for i in circles[0,:]:
                # If the ball is far, draw it in green
                if int(round(i[2])) < 30:
                    cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),int(round(i[2])),(0,255,0),5)
                    cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),2,(0,255,0),10)
				# else draw it in red
                elif int(round(i[2])) > 35:
                    cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),int(round(i[2])),(0,0,255),5)
                    cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),2,(0,0,255),10)
                    buzz = 1

	#you can use the 'buzz' variable as a trigger to switch some GPIO lines on Rpi :)
    # print buzz                    
    # if buzz:
        # put your GPIO line here

    
    #Show the result in frames
    cv2.imshow('HueComp',hthresh)
    cv2.imshow('SatComp',sthresh)
    cv2.imshow('ValComp',vthresh)
    cv2.imshow('closing',closing)
    cv2.imshow('tracking',frame)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cap.release()

cv2.destroyAllWindows()

第二步:运行代码

  • 在树莓派终端导航到之前复制"bdtct.py"文件的文件夹

  • 运行命令:sudo python bdctc.py ,会打开5个如上图一样的窗口

  • 把一个兵乓球(最好黄色)放在摄像头前面

  • 球会在窗口内被追踪。如果没有,调节 "HueComp", "SatComp" 和 "ValComp"窗口的滑块,多试几次直到像上图一样,记下滑块的值以在"bdtct.py"文件进行编辑

1.树莓派吧遵循行业规范,任何转载的稿件都会明确标注作者和来源,如有版权问题,请联系QQ613789238删除。; 2.树莓派吧的原创文章,请转载时务必注明文章作者和"来源:树莓派吧",不尊重原创的行为树莓派吧或将追究责任; 3.作者投稿可能会经树莓派吧编辑修改或补充。

网友点评