示例#1
0
 def fire(self):  #pull trigger
     GPIO.setup(18, GPIO.OUT)  ## Setup GPIO Pin 24 to OUT
     GPIO.output(18, True)  ## Turn on GPIO pin 24
     sleep(3)
     GPIO.output(18, False)  ## Turn off GPIO pin 24
     Timer.Countdown(self.triggerwait,
                     self.triggertimer).thread.start()  #between fire
示例#2
0
 def fire(self):  #pull trigger
     self.driver.move(self.servoF, 0)
     sleep(.2)
     self.driver.move(self.servoF, 0.1)
     sleep(.2)
     self.driver.move(self.servoF, 0)
     Timer.Countdown(self.triggerwait,
                     self.triggertimer).thread.start()  #between fire
示例#3
0
def main(display):

    #init
    dims = MyDims()
    cam = Capture.Cam()
    cam.scale(dims.scaledown)
    dims.camDims(cam.w, cam.h)

    #start keyboard, turret
    KeyboardPoller.WaitKey().thread.start()
    turret = Turret.Controller()
    turret.daemon = True
    turret.recenter()
    turret.start()

    #target
    hsvtarget = None  #HSV:0-180,255,255
    rgbtarget = None  #for display only
    #motion detect mode
    cam.getFrame()
    avgframe = np.float32(cam.frame)
    avgtimer = threading.Event()
    avgstarted = False
    modemotion = False
    #sound warning
    warningtimer = threading.Event()
    warningstarted = False

    while (1):

        #capture frame,position
        framexy = turret.xy
        cam.getFrame()
        if display:  #default display
            displayframe = cam.frame

        #track target - hsv target set
        if not hsvtarget == None:
            #10 second arm warning
            if not turret.armed:
                if not warningstarted:
                    Timer.Countdown(1, warningtimer).thread.start()
                    sleep(.1)  #timer set
                    warningstarted = True
                elif not warningtimer.isSet():
                    warningtimer.set()  #once per reset
                    turret.armed = True
            #find best contour in hsv range
            framehsv = cv2.cvtColor(cam.frame, cv2.COLOR_BGR2HSV)
            framemask = cv2.inRange(framehsv, dims.hsvlower, dims.hsvupper)
            if display:  #color copy
                displaymaskframe = cv2.cvtColor(framemask.copy(),
                                                cv2.COLOR_GRAY2BGR)
                displayframe = cv2.addWeighted(cam.frame, 0.7,
                                               displaymaskframe, 0.3, 0)
            best_cnt = getBestContour(framemask, dims.areathreshold)
            if not best_cnt == None:  #if match found
                #get center
                M = cv2.moments(best_cnt)
                cx, cy = int(M['m10'] / M['m00']), int(M['m01'] / M['m00'])
                #update turret
                turret.sendTarget(dims.coordToPulse((cx, cy)), framexy)
                if display:
                    #display circle target
                    objcenter = (cx, cy)
                    objradius = int(
                        round(math.sqrt(cv2.contourArea(best_cnt)), 2))
                    cv2.circle(displayframe, objcenter, objradius, (0, 0, 0),
                               5)
                    cv2.circle(displayframe, objcenter, objradius, rgbtarget,
                               3)

        #wait for motion
        if hsvtarget == None and modemotion == True:
            if not avgstarted:
                print "accumulating average..."
                Timer.Countdown(5, avgtimer).thread.start()
                sleep(.1)  #timer set
                avgstarted = True
            if avgtimer.isSet():
                cv2.accumulateWeighted(cam.frame, avgframe, 0.8)
                resframe = cv2.convertScaleAbs(avgframe)
            else:
                print "waiting for motion..."
                #mask all motion
                motionmask = cv2.absdiff(cam.frame, resframe)
                motionmask = cv2.cvtColor(motionmask, cv2.COLOR_RGB2GRAY)
                _, motionmask = cv2.threshold(motionmask, 25, 255,
                                              cv2.THRESH_BINARY)
                if display:
                    displayframe = motionmask.copy()
                #find best
                cntmask = motionmask.copy()
                cnt = getBestContour(cntmask, dims.areathreshold)
                if not cnt == None:
                    #motion found - mask best, get mean
                    cv2.rectangle(motionmask, tuple([0, 0]),
                                  tuple([cam.w, cam.h]), (0, 0, 0), -1)
                    cv2.drawContours(motionmask, tuple([cnt]), 0,
                                     (255, 255, 255), -1)
                    rgbtarget = cv2.mean(cam.frame, motionmask)
                    framehsv = cv2.cvtColor(cam.frame, cv2.COLOR_BGR2HSV)
                    hsvtarget = cv2.mean(framehsv, motionmask)
                    #set target
                    dims.setHsvRange(hsvtarget)
                    modemotion = False

        if display:
            displayframe = cv2.resize(displayframe,
                                      (dims.displayw, dims.displayh))
            cv2.imshow('display', displayframe)
            key = cv2.waitKey(1)
            #transfer char from opencv window
            if key > 0:
                KeyboardPoller.keypressed.set()
                KeyboardPoller.key = chr(key)

        #key handler
        if KeyboardPoller.keypressed.isSet():
            if KeyboardPoller.key == "a":
                turret.moveLeft()
            elif KeyboardPoller.key == "q":  #quit
                print "Exiting..."
                turret.quit()
                cam.quit()
                cv2.destroyAllWindows()
                break
            elif KeyboardPoller.key == " ":  #reset all
                print "Reset."
                hsvtarget = None
                turret.armed = True
                avgstarted = False
                warningstarted = False
                turret.recenter()
            if KeyboardPoller.key == "r":  #sample center of image
                print "reloading"
                turret.reloadGun()
            elif KeyboardPoller.key == "1":  #start motion detect
                print "Start motion detect."
                modemotion = True
            if KeyboardPoller.key == "2":  #sample center of image
                print "Sample center HSV."
                framecenter = cam.frame[(dims.h / 2) -
                                        dims.sampleradius:(dims.h / 2) +
                                        dims.sampleradius, (dims.w / 2) -
                                        dims.sampleradius:(dims.w / 2) +
                                        dims.sampleradius]
                framecenterhsv = cv2.cvtColor(framecenter, cv2.COLOR_BGR2HSV)
                hsvtarget = [
                    int(cv2.mean(framecenterhsv)[0]),
                    int(cv2.mean(framecenterhsv)[1]),
                    int(cv2.mean(framecenterhsv)[2])
                ]
                rgbtarget = [
                    int(cv2.mean(framecenter)[0]),
                    int(cv2.mean(framecenter)[1]),
                    int(cv2.mean(framecenter)[2])
                ]
            if KeyboardPoller.key == "p":  #toggle armed
                turret.armed = not turret.armed
            if KeyboardPoller.key == "f":  #reset all
                print "Firing"
                turret.fire()
                print "Fired"
            if KeyboardPoller.key == "l":  #target trigger sensitivity
                turret.firesensitivity += .01
            if KeyboardPoller.key == "m":
                turret.firesensitivity -= .01
            #if KeyboardPoller.key=="a": #hue
            #    dims.hsvrange[0] += dims.adjuststep
            if KeyboardPoller.key == "z":
                dims.hsvrange[0] -= dims.adjuststep
            if KeyboardPoller.key == "s":  #sat
                dims.hsvrange[1] += dims.adjuststep
            if KeyboardPoller.key == "x":
                dims.hsvrange[1] -= dims.adjuststep
            if KeyboardPoller.key == "d":  #val
                dims.hsvrange[2] += dims.adjuststep
            if KeyboardPoller.key == "c":
                dims.hsvrange[2] -= dims.adjuststep
            if KeyboardPoller.key == "f":  #area
                dims.areathreshold += dims.adjuststep
            if KeyboardPoller.key == "v":
                dims.areathreshold -= dims.adjuststep
                #adjust target settings/range
            if not hsvtarget == None:
                dims.setHsvRange(hsvtarget)
                print ">> HSV:", hsvtarget[0], hsvtarget[1], hsvtarget[
                    2], "Range:", dims.hsvrange[0], dims.hsvrange[1], dims.hsvrange[
                        2], "Area:", dims.areathreshold, "Armed:", turret.armed, turret.firesensitivity
            #reset key polling
            KeyboardPoller.WaitKey().thread.start()