[opencv] rectification boilerplate
TG-8
This commit is contained in:
parent
f5f4bd4115
commit
2b12a0be9b
@ -6,15 +6,16 @@
|
|||||||
namespace score {
|
namespace score {
|
||||||
|
|
||||||
class Image {
|
class Image {
|
||||||
public:
|
public:
|
||||||
Image();
|
Image();
|
||||||
explicit Image(const cv::Mat& image);
|
explicit Image(const cv::Mat &image);
|
||||||
~Image();
|
~Image();
|
||||||
|
|
||||||
[[nodiscard]] cv::Mat get() const;
|
/// @note data_ could be changed through this
|
||||||
|
[[nodiscard]] cv::Mat get();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
cv::Mat data_;
|
cv::Mat data_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace score
|
||||||
22
include/cloud_point/matrixFactory.h
Normal file
22
include/cloud_point/matrixFactory.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "opencv2/core/hal/interface.h"
|
||||||
|
#include "opencv2/core/mat.hpp"
|
||||||
|
#include <stdexcept>
|
||||||
|
namespace score {
|
||||||
|
|
||||||
|
class CameraMatrixFactory {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @param rpc < vector of size Width*Height
|
||||||
|
* @throw runtime_error if size is not Width*Height
|
||||||
|
*/
|
||||||
|
template <size_t Width, size_t Height>
|
||||||
|
static cv::Mat create(std::vector<double> rpc) {
|
||||||
|
if (rpc.size() != Width * Height)
|
||||||
|
throw std::runtime_error("Vector size is not Width*Height");
|
||||||
|
return {Width, Height, CV_64F, rpc.data()};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace score
|
||||||
16
include/cloud_point/rectify.h
Normal file
16
include/cloud_point/rectify.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "cloud_point/image.h"
|
||||||
|
#include <opencv2/calib3d.hpp>
|
||||||
|
|
||||||
|
namespace score {
|
||||||
|
|
||||||
|
class Rectify {
|
||||||
|
public:
|
||||||
|
Rectify();
|
||||||
|
~Rectify();
|
||||||
|
|
||||||
|
void perform(Image &image, cv::Mat cameraMatrix,
|
||||||
|
cv::Mat distCoeffs = cv::Mat::zeros(1, 5, CV_64F));
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace score
|
||||||
@ -5,18 +5,14 @@
|
|||||||
|
|
||||||
namespace score {
|
namespace score {
|
||||||
|
|
||||||
Image::Image() {
|
Image::Image() {
|
||||||
//no work
|
// no work
|
||||||
}
|
}
|
||||||
|
|
||||||
Image::Image(const cv::Mat& image) {
|
Image::Image(const cv::Mat &image) { this->data_ = image; }
|
||||||
this->data_ = image;
|
|
||||||
}
|
|
||||||
|
|
||||||
Image::~Image() = default;
|
Image::~Image() = default;
|
||||||
|
|
||||||
cv::Mat Image::get() const {
|
cv::Mat Image::get() { return this->data_; }
|
||||||
return this->data_;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
} // namespace score
|
||||||
@ -9,7 +9,8 @@ if not opencv_dep.found()
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
cloud_point_sources = files(
|
cloud_point_sources = files(
|
||||||
'image.cpp'
|
'image.cpp',
|
||||||
|
'rectify.cpp'
|
||||||
)
|
)
|
||||||
|
|
||||||
cpc_deps = [ cloud_point_rpc_dep, opencv_dep ]
|
cpc_deps = [ cloud_point_rpc_dep, opencv_dep ]
|
||||||
|
|||||||
23
src/cloud_point/rectify.cpp
Normal file
23
src/cloud_point/rectify.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include "opencv2/calib3d.hpp"
|
||||||
|
#include <cloud_point/rectify.h>
|
||||||
|
|
||||||
|
namespace score {
|
||||||
|
|
||||||
|
Rectify::Rectify() = default;
|
||||||
|
Rectify::~Rectify() = default;
|
||||||
|
/**
|
||||||
|
* @brief perform rectification operation on providen image
|
||||||
|
* @param cameraMatrix matrix of intrinsic params of size 3x3
|
||||||
|
* @param distCoeffs distortion matrix
|
||||||
|
* @param image reference to image object (changed in-place)
|
||||||
|
*/
|
||||||
|
void Rectify::perform(Image &image, cv::Mat cameraMatrix, cv::Mat distCoeffs) {
|
||||||
|
cv::Mat newmatrix = cv::getOptimalNewCameraMatrix(
|
||||||
|
cameraMatrix, distCoeffs, {image.get().size[0], image.get().size[1]},
|
||||||
|
1);
|
||||||
|
cv::Mat output;
|
||||||
|
cv::undistort(image.get(), output, cameraMatrix, distCoeffs, newmatrix);
|
||||||
|
output.copyTo(image.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace score
|
||||||
@ -1,6 +1,7 @@
|
|||||||
//
|
//
|
||||||
// Created by vptyp on 12.03.2026.
|
// Created by vptyp on 12.03.2026.
|
||||||
//
|
//
|
||||||
|
#include "cloud_point/rectify.h"
|
||||||
#include <gmock/gmock.h>
|
#include <gmock/gmock.h>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
@ -89,3 +90,18 @@ TEST_F(ImageTest, CreateDepth) {
|
|||||||
EXPECT_DOUBLE_EQ(mat.at<double>(0, 0), 0.0);
|
EXPECT_DOUBLE_EQ(mat.at<double>(0, 0), 0.0);
|
||||||
EXPECT_DOUBLE_EQ(mat.at<double>(4, 9), 49.0);
|
EXPECT_DOUBLE_EQ(mat.at<double>(4, 9), 49.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ImageTest, RectificationNoThrow) {
|
||||||
|
score::Rectify rectify;
|
||||||
|
score::ImageRPC rpc;
|
||||||
|
rpc.width = 10;
|
||||||
|
rpc.height = 20;
|
||||||
|
rpc.type = score::ImageRPC::Type::BGR;
|
||||||
|
rpc.data.resize(rpc.width * rpc.height * 3, 128);
|
||||||
|
score::Image image = score::ImageFactory::create(rpc);
|
||||||
|
double fx = 10.1, fy = 20.2, cx = 30.3, cy = 40.4;
|
||||||
|
cv::Mat cameraMatrix =
|
||||||
|
(cv::Mat_<double>(3, 3) << fx, 0, cx, 0, fy, cy, 0, 0, 1);
|
||||||
|
|
||||||
|
EXPECT_NO_THROW(rectify.perform(image, cameraMatrix));
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user