Ejemplo n.º 1
0
def test_psb_Builder_simple_obj():
    builder = Builder(VisionSubclass,
                      Args("path/to/images", keyword_argument=True),
                      ProcessorA,
                      Args(color='color'),
                      ProcessorB,
                      Args(camera=CustomObject('a var', 'b var')),
                      display_results=True)

    d = builder.todict()
    assert (d == truth_builder_simple_obj)

    processor = builder.build()

    assert (isinstance(processor, ProcessorB))
    assert (isinstance(processor.source, ProcessorA))
    assert (isinstance(processor.source.source, VisionSubclass))

    assert (processor.display_results)
    assert (processor.source.display_results)
    assert (processor.source.source.display_results)

    assert (isinstance(processor._camera, CustomObject))
    assert (processor._camera.a == 'a var')
    assert (processor._camera.b == 'b var')
    assert (processor.source._color == 'color')
    assert (processor.name == "ProcessorB <- ProcessorA <- path/to/images")

    with processor as vision:
        for frame in vision:
            break
Ejemplo n.º 2
0
def test_psb_Builder_Builder_fromdict():
    builder = Builder.fromdict(
        truth_builder_stereo,
        (ProcessorA, ProcessorB, ProcessorC, VisionSubclass, CustomObject))

    d = builder.todict()
    assert (d == truth_builder_stereo)

    processor = builder.build()

    assert (isinstance(processor, ProcessorC))

    assert (isinstance(processor._a, ProcessorB))
    assert (isinstance(processor._a.source, ProcessorA))
    assert (isinstance(processor._a.source.source, VisionSubclass))

    assert (isinstance(processor._b, ProcessorB))
    assert (isinstance(processor._b.source, ProcessorA))
    assert (isinstance(processor._b.source.source, VisionSubclass))

    assert (processor._camera == 'camera')
    assert (
        processor.name ==
        "ProcessorB <- ProcessorA <- path/to/left_images : ProcessorB <- ProcessorA <- path/to/right_images"
    )

    with processor as vision:
        for frame in vision:
            break
Ejemplo n.º 3
0
def test_psb_Builder_Builder():
    builder = Builder(Builder(VisionSubclass,
                              Args("path/to/left_images",
                                   keyword_argument=True),
                              ProcessorA,
                              Args(color='color left'),
                              ProcessorB,
                              Args(camera=None),
                              display_results=1),
                      Builder(VisionSubclass,
                              Args("path/to/right_images",
                                   keyword_argument=True),
                              ProcessorA,
                              Args(color='color right'),
                              ProcessorB,
                              Args(camera=None),
                              display_results=2),
                      ProcessorC,
                      Args(camera='camera'),
                      display_results=True)

    d = builder.todict()
    assert (d == truth_builder_stereo)

    processor = builder.build()

    assert (isinstance(processor, ProcessorC))

    assert (isinstance(processor._a, ProcessorB))
    assert (isinstance(processor._a.source, ProcessorA))
    assert (isinstance(processor._a.source.source, VisionSubclass))

    assert (isinstance(processor._b, ProcessorB))
    assert (isinstance(processor._b.source, ProcessorA))
    assert (isinstance(processor._b.source.source, VisionSubclass))

    assert (processor.display_results)
    assert (processor._a.display_results == 1)
    assert (processor._a.source.display_results == 1)
    assert (processor._a.source.source.display_results == 1)
    assert (processor._b.display_results == 2)
    assert (processor._b.source.display_results == 2)
    assert (processor._b.source.source.display_results == 2)

    assert (processor._camera == 'camera')
    assert (
        processor.name ==
        "ProcessorB <- ProcessorA <- path/to/left_images : ProcessorB <- ProcessorA <- path/to/right_images"
    )

    with processor as vision:
        for frame in vision:
            break
Ejemplo n.º 4
0
def test_psb_Builder_fromdict_simple():
    builder = Builder.fromdict(truth_builder_simple,
                               (ProcessorA, ProcessorB, VisionSubclass))
    d = builder.todict()
    assert (d == truth_builder_simple)

    processor = builder.build()

    assert (isinstance(processor, ProcessorB))
    assert (isinstance(processor.source, ProcessorA))
    assert (isinstance(processor.source.source, VisionSubclass))

    assert (processor._camera == 'camera')
    assert (processor.source._color == 'color')
    assert (processor.name == "ProcessorB <- ProcessorA <- path/to/images")

    with processor as vision:
        for frame in vision:
            break
Ejemplo n.º 5
0
def main():
    parser = ArgumentParser(description="Stereo Camera calibration tool")
    parser.add_argument("left", help="Left Camera device ID/folder")
    parser.add_argument("right", help="Left Camera device ID/folder")
    parser.add_argument("-f",
                        "--file",
                        default="stereo_camera.json",
                        help="Output filename of the calibrated camera")
    parser.add_argument("-i",
                        "--size",
                        default="640,480",
                        help="Frame width and height")
    parser.add_argument("-p", "--fps", default="5", help="Frame rate")
    parser.add_argument("-g",
                        "--grid",
                        default="9,7",
                        help="Grid shape of the calibration target")
    parser.add_argument("-N",
                        type=int,
                        default=30,
                        help="Number of samples to gather")
    parser.add_argument("-t",
                        "--test",
                        const=True,
                        default=False,
                        action='store_const',
                        help="Test camera calibration file")
    parser.add_argument("-d",
                        "--disparity",
                        const=True,
                        default=False,
                        action='store_const',
                        help="Calculate Disparity Map")

    args = parser.parse_args()
    grid = tuple(int(i) for i in args.grid.split(','))
    size = tuple(int(i) for i in args.size.split(','))

    try:
        left = int(args.left)
        right = int(args.right)
    except:
        left = args.left
        right = args.right

    camera_model = None
    if args.test:
        with open(args.file) as f:
            camera_model = StereoCamera.fromdict(json.load(f))
            print("{} was loaded for evaluation".format(args.file))

    builder = Builder(
        Builder(VideoCapture,
                Args(left, width=size[0], height=size[1], fps=int(args.fps)),
                ImageTransform, Args(ocl=args.test), CalibratedCamera,
                Args(None if camera_model is None else camera_model.left)),
        Builder(VideoCapture,
                Args(right, width=size[0], height=size[1], fps=int(args.fps)),
                ImageTransform, Args(ocl=args.test), CalibratedCamera,
                Args(None if camera_model is None else camera_model.right)),
        CalibratedStereoCamera,
        Args(camera_model,
             max_samples=args.N,
             grid_shape=grid,
             calculate_disparity=args.disparity,
             display_results=True))

    if args.test:
        with builder.build() as vision:
            for frame in vision:
                if cv2.waitKey(1) == 27:
                    break
    else:
        with builder.build() as vision:
            cam = None
            while not cam:
                cam = vision.calibrate()
                if cv2.waitKey(1) == 27:
                    print("Calibration was aborted")
                    return

            with open(args.file, "w") as f:
                f.write(json.dumps(cam.todict(), indent=4))
                print("{} was written".format(args.file))
Ejemplo n.º 6
0
def main():
    parser = ArgumentParser(description="Camera calibration tool")
    parser.add_argument("camera", help="Camera device ID/folder")
    parser.add_argument("-f",
                        "--file",
                        default="camera.json",
                        help="Output filename of the calibrated camera")
    parser.add_argument("-g",
                        "--grid",
                        default="9,7",
                        help="Grid shape of the calibration target")
    parser.add_argument("-i",
                        "--size",
                        default="640,480",
                        help="Frame width and height")
    parser.add_argument("-p", "--fps", default="5", help="Frame rate")
    parser.add_argument("-N",
                        type=int,
                        default=30,
                        help="Number of samples to gather")
    parser.add_argument("-t",
                        "--test",
                        const=True,
                        default=False,
                        action='store_const',
                        help="Test camera calibration file")

    args = parser.parse_args()
    grid = tuple(int(i) for i in args.grid.split(','))
    size = tuple(int(i) for i in args.size.split(','))

    try:
        camera = int(args.camera)
    except:
        camera = args.camera

    camera_model = None
    if args.test:
        with open(args.file) as f:
            camera_model = PinholeCamera.fromdict(json.load(f))

    builder = Builder(
        VideoCapture,
        Args(camera, width=size[0], height=size[1], fps=int(args.fps)),
        CalibratedCamera,
        Args(camera_model,
             max_samples=args.N,
             grid_shape=grid,
             display_results=True))

    if args.test:
        with builder.build() as vision:
            for frame in vision:
                if cv2.waitKey(1) == 27:
                    break
    else:
        with builder.build() as vision:
            cam = None
            while not cam:
                cam = vision.calibrate()
                cv2.waitKey(1)

            with open(args.file, "w") as f:
                f.write(json.dumps(cam.todict(), indent=4))
Ejemplo n.º 7
0
def main():
    parser = ArgumentParser(description="""Remote Processor Stack Server using Pyro4
    Processor Stack Builder json example:

    {
        "args": [
            {
                "args": [0],
                "class": "VideoCapture",
                "objects": {},
                "kwargs": {"width":  1280, "height":  720}
            },
            {
                "args": [],
                "class": "ImageTransform",
                "objects": {},
                "kwargs": {"ocl":  false}
            },
            {
                "args": [],
                "class": "CalibratedCamera",
                "objects": {
                    "object__PinholeCamera0": {
                        "rectify": null,
                        "distortion": [
                            [
                                0.07507829590903714,
                                0.2133670120228787,
                                0.004960489645345226,
                                -0.0019449662761104394,
                                -1.0317011493764785
                            ]
                        ],
                        "projection": null,
                        "matrix": [
                            [
                                732.8937676878295,
                                0.0,
                                311.31379638926603
                            ],
                            [
                                0.0,
                                728.1072411106162,
                                261.6539111360498
                            ],
                            [
                                0.0,
                                0.0,
                                1.0
                            ]
                        ],
                        "size": [
                            640,
                            480
                        ]
                    }
                },
                "kwargs": {"camera": "object__PinholeCamera0"}
            },
            {
                "args": [],
                "class": "FeatureExtraction",
                "objects": {},
                "kwargs": {"feature_type": "ORB", "enabled":  true}
            }
        ],
        "objects": {},
        "kwargs": {}
    }
    """)
    parser.add_argument("name", help="Name of the remote Pyro4 source object")
    parser.add_argument("file", help="Processor Stack builder Json file")
    parser.add_argument("-H", "--host", default="localhost", help="Hostname of the server (default: localhost)")
    parser.add_argument("-n", "--nameserver", default=None, help="hostname of the name server (default: empty)")
    parser.add_argument("-p", "--port", default=0, help="Port of the server (default: 0)")
    parser.add_argument("-l", "--lazy", const=True, default=False, action='store_const',
                        help="Specifies whether to do lazy capturing, e.g. on demand (default: false)")

    args = parser.parse_args()

    classes = (
        ImagesReader,
        VideoCapture,
        PyroCapture,
        CalibratedCamera,
        CalibratedStereoCamera,
        PinholeCamera,
        StereoCamera,
        ImageTransform,
        FeatureExtraction,
        BackgroundSeparation,
        HistogramBackprojection,
        BlobExtraction,
        MultiThreading,
        MultiProcessing
    )
    with open(args.file) as f:
        builder = Builder.fromdict(json.load(f), classes)

    print("Building processor stack...")
    vision = builder.build()

    print("Initializing server...")
    server = Server(args.name, vision, host=args.host, port=args.port, nameserver=args.nameserver, freerun=not args.lazy)

    print("Starting server...")
    try:
        server.run()
    except KeyboardInterrupt:
        print("Exiting...")
Ejemplo n.º 8
0
def main():
    parser = ArgumentParser(description="Camera calibration tool")
    parser.add_argument("device", help="Camera device ID/folder")
    parser.add_argument("-f",
                        "--file",
                        default="model.json",
                        help="Output filename of the learned model")
    parser.add_argument("-c",
                        "--camera",
                        default="camera.json",
                        help="Calibrated PinholeCamera file")
    parser.add_argument("-H",
                        "--hand",
                        default="hand.json",
                        help="Color histogram of the hand")
    parser.add_argument("-e",
                        "--feature_type",
                        default="ORB",
                        help="Feature Type (e.g. ORB/FREAK/SIFT)")
    parser.add_argument("-i",
                        "--size",
                        default="640,480",
                        help="Frame width and height")
    parser.add_argument("-p", "--fps", default="5", help="Frame rate")
    parser.add_argument("-t",
                        "--test",
                        const=True,
                        default=False,
                        action='store_const',
                        help="Test learned model")

    args = parser.parse_args()
    size = tuple(int(i) for i in args.size.split(','))

    try:
        camera = int(args.device)
    except:
        camera = args.device

    camera_model = None
    object_model = None
    hand_model = HAND_MODEL
    if args.test:
        with open(args.file) as f:
            pass
            object_model = ObjectModel.fromdict(json.load(f))
    try:
        with open(args.camera) as f:
            camera_model = PinholeCamera.fromdict(json.load(f))
    except:
        pass

    try:
        with open(args.hand) as f:
            hand_model = np.float32(json.load(f))
    except:
        pass

    if args.test:
        builder = Builder(
            VideoCapture,
            Args(camera, width=size[0], height=size[1], fps=int(args.fps)),
            CalibratedCamera,
            Args(camera_model,
                 enabled=camera_model is not None,
                 display_results=True), FeatureExtraction,
            Args(feature_type=args.feature_type), ObjectRecognitionEngine,
            Args(feature_type=args.feature_type, display_results=True))
        object_model.display_results = True
        with builder.build() as engine:
            engine.models[object_model.name] = object_model
            for frame in engine:
                if cv2.waitKey(1) == 27:
                    break
    else:
        builder = Builder(
            VideoCapture,
            Args(camera, width=size[0], height=size[1],
                 fps=int(args.fps)), CalibratedCamera,
            Args(camera_model, enabled=camera_model
                 is not None), HistogramBackprojection,
            Args(hand_model,
                 invert=True,
                 combine_masks=True,
                 enabled=hand_model is not None,
                 display_results=True), BackgroundSeparation,
            Args(algorithm="MOG", display_results=True), FeatureExtraction,
            Args(feature_type=args.feature_type, display_results=True),
            ObjectRecognitionEngine,
            Args(feature_type=args.feature_type, display_results=True))
        print("'b' to relearn background")
        print("Spacebar to learn model view")
        with builder.build() as vision:
            last = 0
            cur = 0
            for frame, obj in vision:
                cur += 1
                ch = cv2.waitKey(1)
                if ch == 27:
                    break
                elif ch == ord(' ') and cur - last > 30:
                    model = vision.enroll("object",
                                          frame,
                                          add=True,
                                          display_results=True)
                    last = cur
                    if model is not None:
                        print("model updated: %i" % len(model))
                    if model:
                        object_model = model
                elif ch == ord('b'):
                    vision.vision.background_num = 0

            if object_model:
                with open(args.file, "w") as f:
                    f.write(json.dumps(object_model.todict(), indent=4))