libcamera v0.7.2+1-aebe4861-nvm
Supporting cameras in Linux since 2019
Loading...
Searching...
No Matches
lsc_polynomial.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: LGPL-2.1-or-later */
2/*
3 * Copyright (C) 2024, Ideas On Board
4 *
5 * Polynomial based lens shading correction
6 */
7#pragma once
8
9#include <array>
10#include <map>
11#include <span>
12#include <vector>
13
14#include <libcamera/geometry.h>
15
17
18#include "lsc_base.h"
19
20namespace libcamera {
21
22namespace ipa {
23
24namespace lsc {
25
27{
28public:
29 Polynomial(double cx = 0.0, double cy = 0.0, double k0 = 0.0,
30 double k1 = 0.0, double k2 = 0.0, double k3 = 0.0,
31 double k4 = 0.0)
32 : cx_(cx), cy_(cy), cnx_(0), cny_(0),
33 coefficients_({ k0, k1, k2, k3, k4 })
34 {
35 }
36
37 double sampleAtNormalizedPixelPos(double x, double y) const;
38 double getM() const;
39 void setReferenceImageSize(const Size &size);
40
41private:
42 double cx_;
43 double cy_;
44 double cnx_;
45 double cny_;
46 std::array<double, 5> coefficients_;
47 Size imageSize_;
48};
49
50} /* namespace lsc */
51
53{
54private:
55 using PolynomialComponents = std::map<std::string, lsc::Polynomial, std::less<>>;
56 using PolynomialComponentsMap = std::map<unsigned int, PolynomialComponents>;
57
58public:
59 int parseLscData(const ValueNode &sets,
60 const LscDescriptor &descriptor) override;
61
63 sampleForCrop(const Rectangle &cropRectangle,
64 std::vector<double> xPos, std::vector<double> yPos) override;
65
66private:
67 std::vector<float> samplePolynomial(const lsc::Polynomial &poly,
68 std::span<const double> xPositions,
69 std::span<const double> yPositions,
70 const Rectangle &cropRectangle);
71 PolynomialComponentsMap lscData_;
72};
73
74} /* namespace ipa */
75
76} /* namespace libcamera */
Describe a rectangle's position and dimensions.
Definition geometry.h:247
Describe a two-dimensional size.
Definition geometry.h:51
A class representing a tree structure of values.
Definition value_node.h:27
Pure virtual base class for LSC algorithm implementations.
Definition lsc_base.h:33
std::map< unsigned int, Components > ComponentsMap
Associate a colour temperature to a LSC table.
Definition lsc_base.h:36
Radial Polynomial LSC algorithm implementation.
Definition lsc_polynomial.h:53
LscImplementation::ComponentsMap sampleForCrop(const Rectangle &cropRectangle, std::vector< double > xPos, std::vector< double > yPos) override
Re-sample the LSC components for cropRectangle.
Definition lsc_polynomial.cpp:198
int parseLscData(const ValueNode &sets, const LscDescriptor &descriptor) override
Parse polynomial LSC data.
Definition lsc_polynomial.cpp:135
Class for handling even polynomials used in lens shading correction.
Definition lsc_polynomial.h:27
Polynomial(double cx=0.0, double cy=0.0, double k0=0.0, double k1=0.0, double k2=0.0, double k3=0.0, double k4=0.0)
Construct a polynomial using the given coefficients.
Definition lsc_polynomial.h:29
double getM() const
Get the value m as described in the dng specification.
Definition lsc_polynomial.cpp:84
double sampleAtNormalizedPixelPos(double x, double y) const
Sample the polynomial at the given normalized pixel position.
Definition lsc_polynomial.cpp:62
void setReferenceImageSize(const Size &size)
Set the reference image size.
Definition lsc_polynomial.cpp:102
Data structures related to geometric objects.
Base types and definitions for LscImplementation class hierarchy.
Top-level libcamera namespace.
Definition backtrace.h:17
Describe the ISP LSC engine.
Definition lsc_base.h:25
Data structure to manage tree of values.