[v3,2/2] libcamera: converter: converter_dw100: Allow to transform between different camera matrices
diff mbox series

Message ID 20260709124159.387110-3-stefan.klug@ideasonboard.com
State New
Headers show
Series
  • Add cmNew to dewarp paremeters
Related show

Commit Message

Stefan Klug July 9, 2026, 12:41 p.m. UTC
To configure the lens dewarping, the calibrated camera matrix and the
distortion coefficients are required. For some use cases (like removing
a skew introduced by the camera geometry) it is necessary to define an
additional output camera matrix often called "new camera matrix". Add
that functionality by adding an optional tuning parameter "cmNew" to the
Dewarp configuration. If that parameter is not provided, cm is used
instead.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

---

Changes in v3:
- Improved commit message
- Collected tags
- Fixed code wrapping

Changes in v0.2:
- Swapped cm and cmNew in the output calculation
---
 .../converter/converter_dw100_vertexmap.h         |  2 ++
 src/libcamera/converter/converter_dw100.cpp       | 15 ++++++++++++++-
 .../converter/converter_dw100_vertexmap.cpp       |  8 ++++++--
 3 files changed, 22 insertions(+), 3 deletions(-)

Patch
diff mbox series

diff --git a/include/libcamera/internal/converter/converter_dw100_vertexmap.h b/include/libcamera/internal/converter/converter_dw100_vertexmap.h
index 1f2f9c88e8e8..8cb86ed546f6 100644
--- a/include/libcamera/internal/converter/converter_dw100_vertexmap.h
+++ b/include/libcamera/internal/converter/converter_dw100_vertexmap.h
@@ -34,6 +34,7 @@  public:
 	struct DewarpParams {
 		DewarpParams()
 			: cm(Matrix<double, 3, 3>::identity()),
+			  cmNew(Matrix<double, 3, 3>::identity()),
 			  coefficients({})
 		{
 		}
@@ -41,6 +42,7 @@  public:
 		int setCoefficients(Span<const double> coeffs);
 
 		Matrix<double, 3, 3> cm;
+		Matrix<double, 3, 3> cmNew;
 
 		struct {
 			double k1;
diff --git a/src/libcamera/converter/converter_dw100.cpp b/src/libcamera/converter/converter_dw100.cpp
index d05823fa4d4c..77f778c7f103 100644
--- a/src/libcamera/converter/converter_dw100.cpp
+++ b/src/libcamera/converter/converter_dw100.cpp
@@ -104,9 +104,10 @@  int ConverterDW100Module::init(const ValueNode &params)
 
 	auto &cm = params["cm"];
 	auto &coefficients = params["coefficients"];
+	auto &cmNew = params["cmNew"];
 
 	/* If nothing is provided, the dewarper is still functional */
-	if (!cm && !coefficients)
+	if (!cm && !coefficients && !cmNew)
 		return 0;
 
 	if (!cm) {
@@ -140,6 +141,18 @@  int ConverterDW100Module::init(const ValueNode &params)
 		return -EINVAL;
 	}
 
+	if (cmNew) {
+		matrix = cmNew.get<Matrix<double, 3, 3>>();
+		if (!matrix) {
+			LOG(Converter, Error) << "Failed to load 'cmNew' value";
+			return -EINVAL;
+		}
+
+		dp.cmNew = *matrix;
+	} else {
+		dp.cmNew = dp.cm;
+	}
+
 	dewarpParams_ = dp;
 
 	return 0;
diff --git a/src/libcamera/converter/converter_dw100_vertexmap.cpp b/src/libcamera/converter/converter_dw100_vertexmap.cpp
index a990ab4952b4..d5fbfdaafde2 100644
--- a/src/libcamera/converter/converter_dw100_vertexmap.cpp
+++ b/src/libcamera/converter/converter_dw100_vertexmap.cpp
@@ -234,6 +234,9 @@  int dw100VerticesForLength(const int length)
  * \var Dw100VertexMap::DewarpParams::cm
  * \brief The camera matrix
  *
+ * \var Dw100VertexMap::DewarpParams::cmNew
+ * \brief The new camera matrix after dewarping
+ *
  * \var Dw100VertexMap::DewarpParams::coefficients
  * \brief Structure containing the lens dewarp coefficients
 
@@ -665,10 +668,11 @@  Vector2d Dw100VertexMap::dewarpPoint(const Vector2d &p)
 	double x, y;
 	double xout, yout;
 	auto &cm = dewarpParams_->cm;
+	auto &cmNew = dewarpParams_->cmNew;
 	auto &c = dewarpParams_->coefficients;
 
-	y = (p.y() - cm[1][2]) / cm[1][1];
-	x = (p.x() - cm[0][2] - y * cm[0][1]) / cm[0][0];
+	y = (p.y() - cmNew[1][2]) / cmNew[1][1];
+	x = (p.x() - cmNew[0][2] - y * cmNew[0][1]) / cmNew[0][0];
 
 	double r2 = x * x + y * y;
 	double r4 = r2 * r2;