move abort to end, use SystemExit instead; improve colors

This commit is contained in:
scito
2022-12-29 11:18:57 +01:00
parent d9a4c7ca9f
commit 4209a5db3d

View File

@@ -58,11 +58,6 @@ from qrcode import QRCode
import protobuf_generated_python.google_auth_pb2 import protobuf_generated_python.google_auth_pb2
def abort(*args, **kwargs):
eprint(*args, **kwargs)
sys.exit(1)
try: try:
import cv2 import cv2
import numpy import numpy
@@ -71,7 +66,7 @@ try:
import pyzbar.pyzbar as zbar import pyzbar.pyzbar as zbar
from qreader import QReader from qreader import QReader
except ImportError as e: except ImportError as e:
abort(f""" raise SystemExit(f"""
ERROR: Cannot import QReader module. This problem is probably due to the missing zbar shared library. ERROR: Cannot import QReader module. This problem is probably due to the missing zbar shared library.
On Linux and macOS libzbar0 must be installed. On Linux and macOS libzbar0 must be installed.
See in README.md for the installation of the libzbar0. See in README.md for the installation of the libzbar0.
@@ -154,15 +149,14 @@ def extract_otps_from_camera(args):
cam = cv2.VideoCapture(args.camera) cam = cv2.VideoCapture(args.camera)
window_name = "Extract OTP Secret Keys: Capture QR Codes from Camera" window_name = "Extract OTP Secret Keys: Capture QR Codes from Camera"
cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE) cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE)
neutral_color = 255, 0, 255
sucess_color = 0, 255, 0
font = cv2.FONT_HERSHEY_PLAIN font = cv2.FONT_HERSHEY_PLAIN
font_scale = 1 font_scale = 1
font_thickness = 1 font_thickness = 1
pos_text = 5, 20 pos_text = 5, 20
font_dy = 0, cv2.getTextSize("M", font, font_scale, font_thickness)[0][1] + 5 font_dy = 0, cv2.getTextSize("M", font, font_scale, font_thickness)[0][1] + 5
font_line = cv2.LINE_AA font_line = cv2.LINE_AA
text_color = 255, 255, 255
rect_color = 255, 0, 255
rect_color_success = 0, 255, 0
rect_thickness = 5 rect_thickness = 5
decoder = QReader() decoder = QReader()
@@ -178,7 +172,7 @@ def extract_otps_from_camera(args):
elif qr_mode == QRMode.QREADER: elif qr_mode == QRMode.QREADER:
otp_url = decoder.decode(img, bbox) if found else None otp_url = decoder.decode(img, bbox) if found else None
if found: if found:
cv2.rectangle(img, (bbox[0], bbox[1]), (bbox[2], bbox[3]), rect_color_success if otp_url else rect_color, rect_thickness) cv2.rectangle(img, (bbox[0], bbox[1]), (bbox[2], bbox[3]), sucess_color if otp_url else neutral_color, rect_thickness)
if otp_url: if otp_url:
extract_otps_from_otp_url(otp_url, otp_urls, otps, args) extract_otps_from_otp_url(otp_url, otp_urls, otps, args)
elif qr_mode == QRMode.CV2: elif qr_mode == QRMode.CV2:
@@ -186,22 +180,22 @@ def extract_otps_from_camera(args):
otp_url = qrcode.data.decode('utf-8') otp_url = qrcode.data.decode('utf-8')
pts = numpy.array([qrcode.polygon], numpy.int32) pts = numpy.array([qrcode.polygon], numpy.int32)
pts = pts.reshape((-1, 1, 2)) pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, rect_color_success if otp_url else rect_color, rect_thickness) cv2.polylines(img, [pts], True, sucess_color if otp_url else neutral_color, rect_thickness)
extract_otps_from_otp_url(otp_url, otp_urls, otps, args) extract_otps_from_otp_url(otp_url, otp_urls, otps, args)
else: else:
assert False, f"ERROR: Wrong QReader mode {qr_mode.name}" assert False, f"ERROR: Wrong QReader mode {qr_mode.name}"
cv2.putText(img, f"Mode: {qr_mode.name} (Hit space to change)", pos_text, font, font_scale, text_color, font_thickness, font_line) cv2.putText(img, f"Mode: {qr_mode.name} (Hit space to change)", pos_text, font, font_scale, neutral_color, font_thickness, font_line)
cv2.putText(img, "Hit ESC to quit", tuple(map(add, pos_text, font_dy)), font, font_scale, text_color, font_thickness, font_line) cv2.putText(img, "Hit ESC to quit", tuple(map(add, pos_text, font_dy)), font, font_scale, neutral_color, font_thickness, font_line)
window_dim = cv2.getWindowImageRect(window_name) window_dim = cv2.getWindowImageRect(window_name)
qrcodes_text = f"{len(otp_urls)} QR code{'s'[:len(otp_urls) != 1]} captured" qrcodes_text = f"{len(otp_urls)} QR code{'s'[:len(otp_urls) != 1]} captured"
pos_qrcodes_text = window_dim[2] - cv2.getTextSize(qrcodes_text, font, font_scale, font_thickness)[0][0] - 5, pos_text[1] pos_qrcodes_text = window_dim[2] - cv2.getTextSize(qrcodes_text, font, font_scale, font_thickness)[0][0] - 5, pos_text[1]
cv2.putText(img, qrcodes_text, pos_qrcodes_text, font, font_scale, text_color, font_thickness, font_line) cv2.putText(img, qrcodes_text, pos_qrcodes_text, font, font_scale, neutral_color, font_thickness, font_line)
otps_text = f"{len(otps)} otp{'s'[:len(otps) != 1]} extracted" otps_text = f"{len(otps)} otp{'s'[:len(otps) != 1]} extracted"
pos_otps_text = window_dim[2] - cv2.getTextSize(otps_text, font, font_scale, font_thickness)[0][0] - 5, pos_text[1] + font_dy[1] pos_otps_text = window_dim[2] - cv2.getTextSize(otps_text, font, font_scale, font_thickness)[0][0] - 5, pos_text[1] + font_dy[1]
cv2.putText(img, otps_text, pos_otps_text, font, font_scale, text_color, font_thickness, font_line) cv2.putText(img, otps_text, pos_otps_text, font, font_scale, neutral_color, font_thickness, font_line)
cv2.imshow(window_name, img) cv2.imshow(window_name, img)
key = cv2.waitKey(1) & 0xFF key = cv2.waitKey(1) & 0xFF
@@ -536,5 +530,10 @@ def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs) print(*args, file=sys.stderr, **kwargs)
def abort(*args, **kwargs):
eprint(*args, **kwargs)
sys.exit(1)
if __name__ == '__main__': if __name__ == '__main__':
sys_main() sys_main()