Update intrinsic with the new camera matrix from undistortion

This commit is contained in:
ob-yalian
2025-12-29 09:54:10 +08:00
parent 6c44310645
commit eafd7d21e4
3 changed files with 45 additions and 26 deletions
+20 -9
View File
@@ -928,9 +928,9 @@ OBStreamType obStreamTypeFromString(const std::string &stream_type) {
}
}
cv::Mat undistortImage(const cv::Mat &image, const OBCameraIntrinsic &intrinsic,
const OBCameraDistortion &distortion) {
cv::Mat undistorted_image;
UndistortedImageResult undistortImage(const cv::Mat &image, const OBCameraIntrinsic &intrinsic,
const OBCameraDistortion &distortion) {
UndistortedImageResult result;
cv::Mat camera_matrix = cv::Mat::eye(3, 3, CV_64F);
camera_matrix.at<double>(0, 0) = intrinsic.fx;
camera_matrix.at<double>(1, 1) = intrinsic.fy;
@@ -940,12 +940,23 @@ cv::Mat undistortImage(const cv::Mat &image, const OBCameraIntrinsic &intrinsic,
// Create the distortion coefficients matrix using the extended distortion model
cv::Mat dist_coeffs = (cv::Mat_<float>(8, 1) << distortion.k1, distortion.k2, distortion.p1,
distortion.p2, distortion.k3, distortion.k4, distortion.k5, distortion.k6);
// Undistort the image using OpenCV's undistort function
// This function corrects for lens distortion
cv::undistort(image, undistorted_image, camera_matrix, dist_coeffs);
return undistorted_image;
std::cout << "1" << camera_matrix << std::endl;
cv::Size image_size(image.cols, image.rows);
cv::Mat new_camera_matrix =
cv::getOptimalNewCameraMatrix(camera_matrix, dist_coeffs, image_size, 0.0, image_size);
std::cout << new_camera_matrix << std::endl;
// Undistort the image using the new camera matrix
cv::undistort(image, result.image, camera_matrix, dist_coeffs, new_camera_matrix);
std::cout << new_camera_matrix << std::endl;
// Update the intrinsic parameters with the new camera matrix
result.new_intrinsic = intrinsic; // Copy original values first
result.new_intrinsic.fx = new_camera_matrix.at<double>(0, 0);
result.new_intrinsic.fy = new_camera_matrix.at<double>(1, 1);
result.new_intrinsic.cx = new_camera_matrix.at<double>(0, 2);
result.new_intrinsic.cy = new_camera_matrix.at<double>(1, 2);
result.new_intrinsic.width = image.cols;
result.new_intrinsic.height = image.rows;
return result;
}
std::string getDistortionModels(OBCameraDistortion distortion) {
switch (distortion.model) {