From 2fcc544491baa50d28367424dda76d49ecb6cbfa Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 19 Oct 2016 17:51:06 +0000 Subject: [PATCH] - removed dup git-svn-id: http://moon:8086/svn/software/trunk/projects/opencv@327 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- PiCameraPipeline.py | 207 --------------------------- lasertrack.py | 38 +++-- piCameraPipeline/PiCameraPipeline.py | 2 +- picam_test.py | 2 +- 4 files changed, 29 insertions(+), 220 deletions(-) delete mode 100755 PiCameraPipeline.py diff --git a/PiCameraPipeline.py b/PiCameraPipeline.py deleted file mode 100755 index b6938db..0000000 --- a/PiCameraPipeline.py +++ /dev/null @@ -1,207 +0,0 @@ -# import the necessary packages -from __future__ import print_function -from imutils.video import FPS -from picamera import PiCamera -from picamera import array -import imutils -import time -import numpy as np -from threading import Thread -from threading import Lock -from threading import Semaphore - -class Fifo(object): - def __init__(self, dim=(4, 320, 240, 3), dtype=np.uint8): - self.size = 0 - self.capacity = dim[0] - self.wi = 0 - self.ri = 0 - self.buffer = np.empty(dim, dtype=dtype) - self.lock = Lock() - self.sema = Semaphore(value=0) - - def write(self, data): - shouldNotify = False - - self.lock.acquire() - - self.buffer[self.wi] = data - self.wi += 1 - - if self.wi == self.capacity: - self.wi = 0 - - if self.size < self.capacity: - self.size += 1 - shouldNotify = True - - self.lock.release() - - if shouldNotify: - self.sema.release() - - def read(self, timeout=None): - data = None - - if self.sema.acquire(blocking=True, timeout=timeout): - - self.lock.acquire() - - data = self.buffer[self.ri] - self.ri += 1 - - if self.ri == self.capacity: - self.ri = 0 - - self.size -= 1 - - self.lock.release() - - return data - -class RgbProcess(Fifo): - def __init__(self, resolution=(320, 240, 3), numEntries=2, next=None): - super(RgbProcess, self).__init__((numEntries, ) + resolution) - self.next = next - self.thread = Thread(target=self.run) - self.cancel = False - self.fps = None - self.frames = 0 - - # called on construction - def onConstruct(self): - pass - - # called on first frame - def onFirstFrame(self): - self.thread.start() - if self.next is not None: - self.next.onFirstFrame() - - # may be overriden to process in caller context - def onData(self, data): - self.write(data) - - # thread main loop - def run(self): - self.fps = FPS().start() - while not self.cancel: - self.process() - self.frames += 1 - - # abstractmethod - def process(self): - pass - - # should be called to exit thread - def stop(self): - self.fps.stop() - print("Processed " + str(self.frames) + " frames") - print("FPS = " + str(self.frames/self.fps.elapsed())) - self.cancel = True - self.thread.join() - if self.next is not None: - self.next.stop() - -class RgbProcessorAdapter(object): - def __init__(self, resolution=(320, 240, 3)): - self.resolution = resolution - self.frameSize = resolution[0]*resolution[1]*resolution[2] - self.size = 0 - self.frames = 0 - self.fps = None - self.processors = [] - - def processorAdd(self, processor): - self.processors.append(processor) - processor.onConstruct() - - def writable(self): - return True - - def write(self, data): - if self.size == 0: - for proc in self.processors: - proc.onFirstFrame() - - self.fps = FPS().start() - - self.size += len(data) - self.frames += len(data)/self.frameSize - - res = (self.resolution[0], self.resolution[1]) - - -# rgbData = array.bytes_to_rgb(data, res) - rgbData = data - for proc in self.processors: - proc.onData(rgbData) - - def size(self): - return self.size - - def flush(self): - if self.size > 0: - self.fps.stop() - print("Recorded " + str(self.frames) + " frames (" + str(self.size) + " bytes)") - print("FPS = " + str(self.frames/self.fps.elapsed())) - -if ("__main__" == __name__): - import cv2 - - # Unit test with to threaded processors - class MyRgbProcess1(RgbProcess): - def __init__(self, resolution=(320, 240, 3), numEntries=2, next=None): - super(MyRgbProcess1, self).__init__(resolution, numEntries, next) - - def process(self): - data = self.read(1.0) - if data is not None: - gray = cv2.cvtColor(data,cv2.COLOR_BGR2GRAY) - gray_blurred = cv2.medianBlur(gray,5) - - cv2.imshow('displayThread1', gray_blurred) - cv2.waitKey(1) - - if self.next is not None: - self.next.write(cv2.cvtColor(gray_blurred,cv2.COLOR_GRAY2BGR)) - - class MyRgbProcess2(RgbProcess): - def __init__(self, resolution=(320, 240, 3), numEntries=2, next=None): - super(MyRgbProcess2, self).__init__(resolution, numEntries) - - def process(self): - data = self.read(1.0) - if data is not None: - gray = cv2.cvtColor(data,cv2.COLOR_BGR2GRAY) - - # Canny edge detection - canny = cv2.Canny(gray, 100, 50) - cv2.imshow('displayThread2', canny) - cv2.waitKey(1) - - # initialize the camera and stream - camera = PiCamera() - camera.resolution = (320, 240) - camera.framerate = 60 - frameDim = (camera.resolution[0], camera.resolution[1], 3) - myProcessor2 = MyRgbProcess2((240, 320, 3), 4) - myProcessor1 = MyRgbProcess1((240, 320, 3), 4, myProcessor2) - myRgbProcessorAdapter = RgbProcessorAdapter(frameDim) - myRgbProcessorAdapter.processorAdd(myProcessor1) - camera.start_recording(myRgbProcessorAdapter, format="bgr") - - dictFifo = Fifo(dim=(8,), dtype=dict) - dictFifo.write({'a':1, 'b':2}) - print(dictFifo.read()) - - # allow the camera to warmup and start the FPS counter - print("[INFO] sampling frames from `picamera` module...") - time.sleep(10.0) - camera.stop_recording() - myProcessor1.stop() - - # do a bit of cleanup - cv2.destroyAllWindows() - camera.close() - diff --git a/lasertrack.py b/lasertrack.py index f148cd1..86445bd 100755 --- a/lasertrack.py +++ b/lasertrack.py @@ -31,13 +31,16 @@ ap.add_argument("-n", "--seconds", type=int, default=10, help="# of seconds to run") ap.add_argument("-r", "--framerate", type=int, default=30, help="Framerate in frame/s") +ap.add_argument("-e", "--with-ev3", type=bool, default=False, + help="Framerate in frame/s") ap.add_argument("-f", "--filename", type=str, default='piCamera', - help="Whether or not frames should be displayed") + help="Choose video source") args = vars(ap.parse_args()) videoFile = args["filename"] framerate = args["framerate"] seconds = args["seconds"] +with_ev3 = args["with_ev3"] class VideoSource(RgbProcessorAdapter): def __init__(self, fileName, resolution, framerate): @@ -101,12 +104,13 @@ class MyRgbProcess(RgbProcess): if maxVal > 100*minVal: img1_objects = cv2.rectangle(img1_objects,(x-5,y-5),(x+5,y+5),(0,0,255),2) print(maxLoc) - error = float(x)-160 - data = struct.pack("f", error/2) - ev3.system_command.write_mailbox(self.brick, 'ErrorX', data) - error = float(y)-120 - data = struct.pack("f", error/2) - ev3.system_command.write_mailbox(self.brick, 'ErrorY', data) + if self.brick is not None: + error = float(x)-160 + data = struct.pack("f", error/2) + ev3.system_command.write_mailbox(self.brick, 'ErrorX', data) + error = float(y)-120 + data = struct.pack("f", error/2) + ev3.system_command.write_mailbox(self.brick, 'ErrorY', data) else: # Contour approach @@ -135,10 +139,22 @@ class MyRgbProcess(RgbProcess): self.next.write(cv2.cvtColor(gray_blurred,cv2.COLOR_GRAY2BGR)) # Connect to brick -with ev3.EV3() as brick: +if with_ev3: + with ev3.EV3() as brick: + + videoSource = VideoSource(videoFile, (width,height,3), framerate) + proc = MyRgbProcess(brick, (240, 320, 3), 4) + videoSource.processorAdd(proc) + videoSource.start() + + print("[INFO] sampling THREADED frames from `" + videoFile + "` at " + str(framerate) + " frame/s") + time.sleep(seconds) + videoSource.stop() + proc.stop() +else: videoSource = VideoSource(videoFile, (width,height,3), framerate) - proc = MyRgbProcess(brick, (240, 320, 3), 4) + proc = MyRgbProcess(None, (240, 320, 3), 4) videoSource.processorAdd(proc) videoSource.start() @@ -147,7 +163,7 @@ with ev3.EV3() as brick: videoSource.stop() proc.stop() - # do a bit of cleanup - cv2.destroyAllWindows() +# do a bit of cleanup +cv2.destroyAllWindows() diff --git a/piCameraPipeline/PiCameraPipeline.py b/piCameraPipeline/PiCameraPipeline.py index d669c18..3a079d6 100755 --- a/piCameraPipeline/PiCameraPipeline.py +++ b/piCameraPipeline/PiCameraPipeline.py @@ -174,7 +174,7 @@ if ("__main__" == __name__): class MyRgbProcess2(RgbProcess): def __init__(self, resolution=(320, 240, 3), numEntries=2, next=None): - super(MyRgbProcess2, self).__init__(resolution, numEntries) + super(MyRgbProcess2, self).__init__(resolution, numEntries, next) def process(self): data = self.read(1.0) diff --git a/picam_test.py b/picam_test.py index 0271905..9875ac9 100755 --- a/picam_test.py +++ b/picam_test.py @@ -27,7 +27,7 @@ if ("__main__" == __name__): class MyRgbProcess2(RgbProcess): def __init__(self, resolution=(320, 240, 3), numEntries=2, next=None): - super(MyRgbProcess2, self).__init__(resolution, numEntries) + super(MyRgbProcess2, self).__init__(resolution, numEntries, next) def process(self): data = self.read(1.0)