def runVideoProcess(camnum, camind, camqueue, msgqueue): lasttimesent = time.perf_counter() failures = 0 paused = False camera = makeCamera(camind) while True: if failures >= failure_tolerance: break msg = readQueueWithTimeout(msgqueue) if msg == b"stop": break elif msg == b"pause": paused = True elif msg == b"go": paused = False if paused: continue camvals = pollCamVars(camnum) if True: #camvals["isactive"] and (time.perf_counter()-lasttimesent) >= 1/camvals["framerate"]: ret, img = camera.read() print(ret, img) if ret: if failures > 0: failures = 0 img = processImage(img, camvals) if not camqueue.full(): camqueue.put(img) lasttimesent = time.perf_counter() else: failures += 1 camera.release() msgqueue.put(b"dead")
def runVideoSender(camnum, camind, msgqueue): lasttimesent = time.perf_counter() failures = 0 paused = False camera = makeCamera(camind) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: while True: if failures >= failure_tolerance: break msg = readQueueWithTimeout(msgqueue) if msg == b"stop": break elif msg == b"pause": paused = True elif msg == b"go": paused = False if paused: continue camvals = pollCamVars(camnum) if True: #camvals["isactive"] and (time.perf_counter()-lasttimesent) >= 1/camvals["framerate"]: ret, img = camera.read() time.sleep(failures / 4) print(ret, failures) if ret: print(ret, img) if failures > 0: failures = 0 img = processImage(img, camvals) size = sock.sendto(img, (cliip, 5800 + camnum)) else: failures += 1 finally: camera.release() msgqueue.put(b"dead")
def config(listener): message = b"" camdict = {} qdict = {} badcams = [] indsused = 0 while message != b"start": #Scans for active cameras and posts them to NetworkTables cams = stdreader.scanForCameras() for camnum in cams: if (not camnum in camdict): camera = makeCamera(indsused) camdict[camnum] = camera queue = Queue() qdict[camnum] = queue makeVideoProcess(camera, camnum, queue).start() indsused += 1 for num in qdict: if not camdict[num].grab(): qdict[num].put(b"stop") badcams.append(num) for num in badcams: camdict.pop(num) qdict.pop(num) return camdict, qdict
def exportSwappableStream(sock, camnums, timeout=default_match_time, socktype=UDP): #Camnums are the potential camera numbers to be switched to starttime = time.perf_counter() lastimesent = 0 #The last time since diagnostic data was printed lastimesincediag = 0 framesent = 0 totalsize = 0 activecam = table.getNumber("activecam", camnums[0]) if activecam in camnums: camera = makeCamera(activecam) else: camera = makeCamera(0) while time.perf_counter() - starttime <= time: if activecam != table.getNumber("activecam", camnums[0]): camera.release() activecam = table.getNumber("activecam", camnums[0]) if activecam in camnums: camera = makeCamera(activecam) else: camera = makeCamera(0) camvals = pollCamVars(activecam) if camvals["isactive"] and time.perf_counter( ) - lastimesent >= 1 / camvals[ "framerate"]: #If camera is active and framerate time has passed size = exportImage(camera=camera, camnum=activecam, sock=sock, camvals=camvals, ip=cliip) if size == -1: continue totalsize += size framesent += 1 lastimesent = time.perf_counter() if time.perf_counter() - lastimesincediag >= 10: bytespersec = totalsize / 10 fps = framesent / 10 print("{0} frames sent at {1}fps. Average image size: {2}".format( framesent, fps, bytespersec * 8 / 1000000)) framesent = 0 totalsize = 0 lastimesincediag = time.perf_counter() cv2.waitKey(1)
def makeCam(camnum): """ Tries to make a camera, fails if it doesn't work """ camera = makeCamera(camnum) ret, _ = camera.read() if ret: return camera else: return False
def configLegacy(sock): message = b"" camdict = {} indsused = 0 while message != b"start": #Scans for active cameras and posts them to NetworkTables cams = stdreader.scanForCameras() badcams = exportTestStream(sock, camdict) for camnum in cams: if (not camnum in camdict): camdict[camnum] = makeCamera(indsused) indsused += 1 print(camdict, indsused) for badcam in badcams: cam = camdict.pop(badcam) cam.release() indsused -= 1 message = recvWithTimeout(sock) return camdict
def testCamnum(camnum): camera = makeCamera(camnum) if camera.grab(): return camera else: return None