# SPDX-License-Identifier: BSD-2-Clause # # Copyright (C) 2019, Raspberry Pi Ltd # # 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 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 not isinstance(val, dict): raise ValueError elif ttype == 'list': if not isinstance(val, list): 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 is None: raise ArgError('\n\nERROR! No input directory given.') if json_output is 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 ref='#n24'>24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * libcamera Camera API tests
 */

#include <iostream>

#include "camera_test.h"

using namespace std;

namespace {

class ConfigurationSet : public CameraTest
{
protected:
	int init() override
	{
		int ret = CameraTest::init();
		if (ret)
			return ret;

		config_ = camera_->generateConfiguration({ StreamRole::VideoRecording });
		if (!config_ || config_->size() != 1) {
			cout << "Failed to generate default configuration" << endl;
			CameraTest::cleanup();
			return TestFail;
		}

		return TestPass;
	}

	int run() override
	{
		StreamConfiguration &cfg = config_->at(0);

		if (camera_->acquire()) {
			cout << "Failed to acquire the camera" << endl;
			return TestFail;
		}

		/* Test that setting the default configuration works. */
		if (camera_->configure(config_.get())) {
			cout << "Failed to set default configuration" << endl;
			return TestFail;
		}

		/*
		 * Test that configuring the camera fails if it is not
		 * acquired, this will also test release and reacquiring
		 * of the camera.
		 */
		if (camera_->release()) {
			cout << "Failed to release the camera" << endl;
			return TestFail;
		}

		if (!camera_->configure(config_.get())) {
			cout << "Setting configuration on a camera not acquired succeeded when it should have failed"
			     << endl;
			return TestFail;
		}

		if (camera_->acquire()) {
			cout << "Failed to acquire the camera" << endl;
			return TestFail;
		}

		/*
		 * Test that modifying the default configuration works. Doubling
		 * the default configuration of the VIMC camera is known to
		 * work.
		 */
		cfg.size.width *= 2;
		cfg.size.height *= 2;
		if (camera_->configure(config_.get())) {
			cout << "Failed to set modified configuration" << endl;
			return TestFail;
		}

		/*
		 * Test that setting an invalid configuration fails.
		 */
		cfg.size = { 0, 0 };
		if (!camera_->configure(config_.get())) {
			cout << "Invalid configuration incorrectly accepted" << endl;
			return TestFail;
		}

		return TestPass;
	}

	std::unique_ptr<CameraConfiguration> config_;
};

} /* namespace */

TEST_REGISTER(ConfigurationSet);