libcamera: utils: Raspberry Pi Camera Tuning Tool
Initial implementation of the Raspberry Pi (BCM2835) Camera Tuning Tool. All code is licensed under the BSD-2-Clause terms. Copyright (c) 2019-2020 Raspberry Pi Trading Ltd. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
0db2c8dc75
commit
c01cfe14f5
14 changed files with 3552 additions and 0 deletions
141
utils/raspberrypi/ctt/ctt_tools.py
Normal file
141
utils/raspberrypi/ctt/ctt_tools.py
Normal file
|
@ -0,0 +1,141 @@
|
|||
# SPDX-License-Identifier: BSD-2-Clause
|
||||
#
|
||||
# Copyright (C) 2019, Raspberry Pi (Trading) Limited
|
||||
#
|
||||
# ctt_tools.py - camera tuning tool miscellaneous
|
||||
|
||||
import time
|
||||
import re
|
||||
import binascii
|
||||
import os
|
||||
import cv2
|
||||
import numpy as np
|
||||
import imutils
|
||||
import sys
|
||||
import matplotlib.pyplot as plt
|
||||
from sklearn import cluster as cluster
|
||||
from sklearn.neighbors.nearest_centroid import NearestCentroid as get_centroids
|
||||
|
||||
"""
|
||||
This file contains some useful tools, the details of which aren't important to
|
||||
understanding of the code. They ar collated here to attempt to improve code
|
||||
readability in the main files.
|
||||
"""
|
||||
|
||||
"""
|
||||
obtain config values, unless it doesnt exist, in which case pick default
|
||||
Furthermore, it can check if the input is the correct type
|
||||
"""
|
||||
def get_config(dictt,key,default,ttype):
|
||||
try:
|
||||
val = dictt[key]
|
||||
if ttype == 'string':
|
||||
val = str(val)
|
||||
elif ttype == 'num':
|
||||
if 'int' not in str(type(val)):
|
||||
if 'float' not in str(type(val)):
|
||||
raise ValueError
|
||||
elif ttype == 'dict':
|
||||
if type(val) != type(dictt):
|
||||
raise ValueError
|
||||
elif ttype == 'list':
|
||||
if type(val) != type([]):
|
||||
raise ValueError
|
||||
elif ttype == 'bool':
|
||||
ttype = int(bool(ttype))
|
||||
else:
|
||||
val = dictt[key]
|
||||
except (KeyError, ValueError):
|
||||
val = default
|
||||
return val
|
||||
"""
|
||||
argument parser
|
||||
"""
|
||||
def parse_input():
|
||||
arguments = sys.argv[1:]
|
||||
if len(arguments)%2 != 0:
|
||||
raise ArgError('\n\nERROR! Enter value for each arguent passed.')
|
||||
params = arguments [0::2]
|
||||
vals = arguments [1::2]
|
||||
args_dict = dict(zip(params,vals))
|
||||
json_output = get_config(args_dict,'-o',None,'string')
|
||||
directory = get_config(args_dict,'-i',None,'string')
|
||||
config = get_config(args_dict,'-c',None,'string')
|
||||
log_path = get_config(args_dict,'-l',None,'string')
|
||||
if directory == None:
|
||||
raise ArgError('\n\nERROR! No input directory given.')
|
||||
if json_output == None:
|
||||
raise ArgError('\n\nERROR! No output json given.')
|
||||
return json_output,directory,config,log_path
|
||||
"""
|
||||
custom arg and macbeth error class
|
||||
"""
|
||||
class ArgError(Exception):
|
||||
pass
|
||||
class MacbethError(Exception):
|
||||
pass
|
||||
|
||||
"""
|
||||
correlation function to quantify match
|
||||
"""
|
||||
def correlate(im1,im2):
|
||||
f1 = im1.flatten()
|
||||
f2 = im2.flatten()
|
||||
cor = np.corrcoef(f1,f2)
|
||||
return cor[0][1]
|
||||
|
||||
"""
|
||||
get list of files from directory
|
||||
"""
|
||||
def get_photos(directory='photos'):
|
||||
filename_list = []
|
||||
for filename in os.listdir(directory):
|
||||
if 'jp' in filename or '.dng' in filename:
|
||||
filename_list.append(filename)
|
||||
return filename_list
|
||||
|
||||
"""
|
||||
display image for debugging... read at your own risk...
|
||||
"""
|
||||
def represent(img,name='image'):
|
||||
# if type(img) == tuple or type(img) == list:
|
||||
# for i in range(len(img)):
|
||||
# name = 'image {}'.format(i)
|
||||
# cv2.imshow(name,img[i])
|
||||
# else:
|
||||
# cv2.imshow(name,img)
|
||||
# cv2.waitKey(0)
|
||||
# cv2.destroyAllWindows()
|
||||
# return 0
|
||||
"""
|
||||
code above displays using opencv, but this doesn't catch users pressing 'x'
|
||||
with their mouse to close the window.... therefore matplotlib is used....
|
||||
(thanks a lot opencv)
|
||||
"""
|
||||
grid = plt.GridSpec(22,1)
|
||||
plt.subplot(grid[:19,0])
|
||||
plt.imshow(img,cmap='gray')
|
||||
plt.axis('off')
|
||||
plt.subplot(grid[21,0])
|
||||
plt.title('press \'q\' to continue')
|
||||
plt.axis('off')
|
||||
plt.show()
|
||||
|
||||
# f = plt.figure()
|
||||
# ax = f.add_subplot(211)
|
||||
# ax2 = f.add_subplot(122)
|
||||
# ax.imshow(img,cmap='gray')
|
||||
# ax.axis('off')
|
||||
# ax2.set_figheight(2)
|
||||
# ax2.title('press \'q\' to continue')
|
||||
# ax2.axis('off')
|
||||
# plt.show()
|
||||
|
||||
|
||||
"""
|
||||
reshape image to fixed width without distorting
|
||||
returns image and scale factor
|
||||
"""
|
||||
def reshape(img,width):
|
||||
factor = width/img.shape[0]
|
||||
return cv2.resize(img,None,fx=factor,fy=factor),factor
|
Loading…
Add table
Add a link
Reference in a new issue