Repository navigation
Expand file tree
/
Copy pathUndistortionModel.cpp
More file actions
72 lines (62 loc) · 2.61 KB
/
Copy pathUndistortionModel.cpp
File metadata and controls
72 lines (62 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
#include "iarc7_vision/UndistortionModel.hpp"
#include "ros_utils/ParamUtils.hpp"
namespace iarc7_vision {
UndistortionModel::UndistortionModel(const ros::NodeHandle& nh,
const cv::Size& image_size)
: image_size_(image_size),
new_image_size_(
ros_utils::ParamUtils::getParam<int>(nh, "out_width"),
ros_utils::ParamUtils::getParam<int>(nh, "out_height"))
{
cv::Mat camera_matrix(3, 3, CV_32FC1);
camera_matrix.at<float>(0, 0) =
ros_utils::ParamUtils::getParam<double>(nh, "f_x");
camera_matrix.at<float>(0, 1) = 0.;
camera_matrix.at<float>(0, 2) =
ros_utils::ParamUtils::getParam<double>(nh, "c_x");
camera_matrix.at<float>(1, 0) = 0.;
camera_matrix.at<float>(1, 1) =
ros_utils::ParamUtils::getParam<double>(nh, "f_y");
camera_matrix.at<float>(1, 2) =
ros_utils::ParamUtils::getParam<double>(nh, "c_y");
camera_matrix.at<float>(2, 0) = 0.;
camera_matrix.at<float>(2, 1) = 0.;
camera_matrix.at<float>(2, 2) = 1.;
cv::Mat dist(5, 1, CV_32FC1);
dist.at<float>(0, 0) = ros_utils::ParamUtils::getParam<double>(nh, "k1");
dist.at<float>(1, 0) = ros_utils::ParamUtils::getParam<double>(nh, "k2");
dist.at<float>(2, 0) = ros_utils::ParamUtils::getParam<double>(nh, "p1");
dist.at<float>(3, 0) = ros_utils::ParamUtils::getParam<double>(nh, "p2");
dist.at<float>(4, 0) = ros_utils::ParamUtils::getParam<double>(nh, "k3");
cv::Mat new_camera_matrix = cv::getOptimalNewCameraMatrix(
camera_matrix, dist, image_size_, 0, new_image_size_, 0, true);
cv::Mat map1_cpu;
cv::Mat map2_cpu;
cv::initUndistortRectifyMap(camera_matrix,
dist,
cv::Mat(),
new_camera_matrix,
new_image_size_,
CV_32FC1,
map1_cpu,
map2_cpu);
map1_ = cv::cuda::GpuMat(map1_cpu);
map2_ = cv::cuda::GpuMat(map2_cpu);
}
void UndistortionModel::undistort(const cv::cuda::GpuMat& in,
cv::cuda::GpuMat& out,
cv::cuda::Stream& stream) const
{
if (in.size() != image_size_) {
throw std::runtime_error("Image size does not match");
}
cv::cuda::remap(in,
out,
map1_,
map2_,
cv::INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(),
stream);
}
} // namespace iarc7_vision