Files
maloja/clicamesh.py

156 lines
4.6 KiB
Python
Executable File

#!/usr/bin/env python
import argparse
from time import sleep
import numpy as np
from matplotlib import pyplot as plt
from cameras.cameraclient import CameraClient
def main():
commands = ["restart", "roi", "status", "test", "show", "save"]
commands.sort()
printable_commands = ", ".join(commands)
parser = argparse.ArgumentParser(description="CLI Cam (esh)")
parser.add_argument("-c", "--camera", help="camera name", default="SATES24-CAMS161-M1")
parser.add_argument("-v", "--verbose", help="verbose output", action="store_true")
subparsers = parser.add_subparsers(title="commands", dest="command", help=printable_commands)
subparser_restart = subparsers.add_parser("restart", description="Restart camera server")
subparser_roi = subparsers.add_parser("roi", description="Set ROI")
subparser_status = subparsers.add_parser("status", description="Print status")
subparser_test = subparsers.add_parser("test", description="Test setting ROIs")
subparser_show = subparsers.add_parser("show", description="Show current image")
subparser_save = subparsers.add_parser("save", description="Save current image")
for sp in subparsers.choices.values():
sp.add_argument("-v", "--verbose", help="verbose output", action="store_true")
subparser_restart.add_argument("-r", "--reset", help="reset ROI", action="store_true")
subparser_roi.add_argument("xmin", type=int, help="x min")
subparser_roi.add_argument("xmax", type=int, help="x max")
subparser_roi.add_argument("ymin", type=int, help="y min")
subparser_roi.add_argument("ymax", type=int, help="y max")
subparser_save.add_argument("filename", help="Output filename")
clargs = parser.parse_args()
command = clargs.command
if command is None:
parser.print_help()
raise SystemExit(1)
camera = CameraClient(clargs.camera)
if clargs.verbose:
print(camera)
print(f"command: {command}")
# print(clargs)
if command == "restart":
do_restart(camera, clargs)
elif command == "roi":
do_roi(camera, clargs)
elif command == "test":
do_test(camera, clargs)
elif command == "status":
do_status(camera, clargs)
elif command == "show":
do_show(camera, clargs)
elif command == "save":
do_save(camera, clargs)
else:
print(f"nothing assigned to command: {command}")
parser.print_help()
raise SystemExit(2)
def do_restart(camera, clargs):
if not clargs.reset:
roi = camera.get_roi()
camera.restart()
if not clargs.reset:
camera.set_roi(*roi, debug=clargs.verbose) #TODO: workaround! why does the first try always set to: [101, 2400, 100, 2061]?
camera.set_roi(*roi, debug=clargs.verbose)
def do_roi(camera, clargs):
camera.set_roi(clargs.xmin, clargs.xmax, clargs.ymin, clargs.ymax, debug=clargs.verbose)
def do_status(camera, clargs):
camera.status
def do_test(camera, _clargs):
camera.reset_roi() # [1, 2560, 1, 2160]
print(camera.get_roi())
for i in (1, 10, 100, 200, 300, 999, 1000, 1001):
camera.set_roi(i, 1500, i, 1900, debug=True)
def do_show(camera, _clargs):
img = camera.get()
proj_x = img.sum(axis=1)
proj_y = img.sum(axis=0)
fig = plt.figure()
# ax_px = fig.add_subplot(222)
# ax_py = fig.add_subplot(223)
# ax_img = fig.add_subplot(221, sharex = ax_px, sharey = ax_py)
left, width = bottom, height = 0.1, 0.65
spacing = 0.005
rect_img = [left, bottom, width, height]
rect_px = [left, bottom + height + spacing, width, 0.2]
rect_py = [left + width + spacing, bottom, 0.2, height]
ax_img = plt.axes(rect_img)
ax_px = plt.axes(rect_px)
ax_py = plt.axes(rect_py)
ax_img.tick_params(direction='in', top=True, right=True)
ax_px.tick_params(direction='in', labelbottom=False)
ax_py.tick_params(direction='in', labelleft=False)
ax_img.imshow(img.T, origin="lower", interpolation="none")
ax_px.plot(proj_x)
ax_py.plot(proj_y, range(len(proj_y)))
# aspx = np.diff(ax_px.get_xlim())[0] / np.diff(ax_px.get_ylim())[0]
# ax_px.set_aspect(aspx)
# aspy = np.diff(ax_py.get_xlim())[0] / np.diff(ax_py.get_ylim())[0]
# ax_py.set_aspect(aspy)
plt.show()
def do_save(camera, clargs):
ext = ".npy"
filename = clargs.filename
filename = filename if filename.endswith(ext) else filename + ext
img = camera.get()
img.dump(filename)
if __name__ == "__main__":
main()
#CA client library tcp receive thread terminating due to a non-standard C++ exception
#FATAL: exception not rethrown
#Aborted (core dumped)
# "solved" by
sleep(0.001)