加载内参,对一个目录下所有原图进行去畸变处理(c++ code)

加载内参,对一个目录下所有原图进行去畸变处理(code save)

#include <gflags/gflags.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <boost/filesystem.hpp>
#include <opencv2/opencv.hpp>

#include "common/utility/file_util.hpp"
#include "common/utility/vehicle_config_util.hpp"

DEFINE_string(image_path, "", "path to image data");
DEFINE_string(camera_sensor_name, "", "camera sensor name");
DEFINE_string(vehicle_config_path, "", "path to vehicle config path");
DEFINE_string(output_dir, "", "path to save data for verify");

static bool ValidateEmpty(const char *flag, const std::string &value) {
    return value.empty() ? false : true;
}

DEFINE_validator(image_path, &ValidateEmpty);
DEFINE_validator(camera_sensor_name, &ValidateEmpty);
DEFINE_validator(vehicle_config_path, &ValidateEmpty);
DEFINE_validator(output_dir, &ValidateEmpty);

bool SaveUndistImage(const cv::Mat &K,
                           const cv::Mat &dist_coeff,
                           const std::vector<std::string> &image_files,
                           const std::string &camera_sensor_name,
                           const std::string &output_dir);
bool GetAllFiles(const std::string &dir, std::vector<std::string> *file_names);

int main(int argc, char *argv[]) {
    if (!image_path_validator_registered ||
        !camera_sensor_name_validator_registered ||
        !vehicle_config_path_validator_registered ||
        !output_dir_validator_registered) {
        return 1;
    }
    gflags::SetUsageMessage(
        "This program is used to calibrate camera intrinsic.");
    gflags::ParseCommandLineFlags(&argc, &argv, true);

    std::vector<std::string> image_files;
    if (GetAllFiles(FLAGS_image_path, &image_files) == false) {
        std::cerr << "read image data failed: " << FLAGS_image_path
                  << std::endl;
        return 1;
    }

    calib::CameraIntrinsic cam_intrin;
    std::string camera_intrinsic_file =
        FLAGS_vehicle_config_path + "/" + FLAGS_camera_sensor_name + "/" +
        FLAGS_camera_sensor_name + "-intrinsic.json";
    if (calib::VehicleConfigUtil::LoadCameraIntrinsic(camera_intrinsic_file,
                                                      &cam_intrin) == false) {
        std::cerr << "read intrinsic failed: " << camera_intrinsic_file
                  << std::endl;
        return -1;
    }

    cv::Mat intrinsic_k =
        (cv::Mat_<double>(3, 3) << cam_intrin.K(0, 0), cam_intrin.K(0, 1),
         cam_intrin.K(0, 2), cam_intrin.K(1, 0), cam_intrin.K(1, 1),
         cam_intrin.K(1, 2), cam_intrin.K(2, 0), cam_intrin.K(2, 1),
         cam_intrin.K(2, 2));
    cv::Mat intrinsic_dist =
        (cv::Mat_<double>(4, 1) << cam_intrin.distortion(0, 0),
         cam_intrin.distortion(1, 0), cam_intrin.distortion(2, 0),
         cam_intrin.distortion(3, 0));

    std::cout << "K:" << std::endl << intrinsic_k << std::endl;
    std::cout << "dist_coeff:" << std::endl << intrinsic_dist << std::endl;

    if (SaveUndistImage(intrinsic_k, intrinsic_dist, image_files,
                              FLAGS_camera_sensor_name,
                              FLAGS_output_dir) == false) {
        std::cerr << " save Verify undist image failed " << std::endl;
        return -1;
    }

    return 0;
}

bool SaveUndistImage(const cv::Mat &K,
                           const cv::Mat &dist_coeff,
                           const std::vector<std::string> &image_files,
                           const std::string &camera_sensor_name,
                           const std::string &output_dir) {
    // save undist image
    std::string undist_img_output_path =
        output_dir + "/" + camera_sensor_name + "_undist";
    if (calib::FileUtil::IsExists(undist_img_output_path)) {
        calib::FileUtil::DeleteFile(undist_img_output_path);
    }
    if (!calib::FileUtil::IsDirectory(undist_img_output_path)) {
        calib::FileUtil::CreateDirectories(undist_img_output_path);
    }

    for (const auto &image_file : image_files) {
        cv::Mat image = cv::imread(image_file, cv::IMREAD_GRAYSCALE);
        if (image.empty()) {
            std::cerr << "read image failed" << std::endl;
            return false;
        }
        cv::Mat undist_img;
        cv::Mat map_x_ori, map_y_ori;
        cv::initUndistortRectifyMap(K, dist_coeff, cv::Mat(), K, image.size(),
                                    CV_32F, map_x_ori, map_y_ori);

        cv::remap(image, undist_img, map_x_ori, map_y_ori, cv::INTER_LINEAR);

        size_t start = image_file.rfind("/");
        size_t end = image_file.rfind(".");

        std::string img_id = image_file.substr(start + 1, end - start - 1);

        std::string image_undist_file =
            undist_img_output_path + "/" + img_id + "_undist.png";
        cv::imwrite(image_undist_file, undist_img);
    }
    return true;
}

bool GetAllFiles(const std::string &dir, std::vector<std::string> *file_names) {
    boost::filesystem::path target_path(dir);
    boost::filesystem::directory_iterator end_iter;
    for (boost::filesystem::directory_iterator iter(target_path);
         iter != end_iter; ++iter) {
        std::string file_name = iter->path().string();
        file_names->push_back(file_name);
    }
    if (file_names->empty()) {
        std::cerr << "empty directory" << std::endl;
        return false;
    }

    return true;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值