libcamera v0.7.2+rpt20260817
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 <vector>
12
13#include <libcamera/base/span.h>
14
15#include <libcamera/geometry.h>
16
18
19#include "lsc_base.h"
20
21namespace libcamera {
22
23namespace ipa {
24
25namespace lsc {
26
28{
29public:
30 Polynomial(double cx = 0.0, double cy = 0.0, double k0 = 0.0,
31 double k1 = 0.0, double k2 = 0.0, double k3 = 0.0,
32 double k4 = 0.0)
33 : cx_(cx), cy_(cy), cnx_(0), cny_(0),
34 coefficients_({ k0, k1, k2, k3, k4 })
35 {
36 }
37
38 double sampleAtNormalizedPixelPos(double x, double y) const;
39 double getM() const;
40 void setReferenceImageSize(const Size &size);
41
42private:
43 double cx_;
44 double cy_;
45 double cnx_;
46 double cny_;
47 std::array<double, 5> coefficients_;
48 Size imageSize_;
49};
50
51} /* namespace lsc */
52
54{
55private:
56 using PolynomialComponents = std::map<std::string, lsc::Polynomial, std::less<>>;
57 using PolynomialComponentsMap = std::map<unsigned int, PolynomialComponents>;
58
59public:
60 int parseLscData(const ValueNode &sets,
61 const LscDescriptor &descriptor) override;
62
64 sampleForCrop(const Rectangle &cropRectangle,
65 std::vector<double> xPos, std::vector<double> yPos) override;
66
67private:
68 std::vector<float> samplePolynomial(const lsc::Polynomial &poly,
69 Span<const double> xPositions,
70 Span<const double> yPositions,
71 const Rectangle &cropRectangle);
72 PolynomialComponentsMap lscData_;
73};
74
75} /* namespace ipa */
76
77} /* 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:35
std::map< unsigned int, Components > ComponentsMap
Associate a colour temperature to a LSC table.
Definition lsc_base.h:38
Radial Polynomial LSC algorithm implementation.
Definition lsc_polynomial.h:54
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:28
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:30
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:27
Data structure to manage tree of values.