diff --git a/cv-node/config/config.json b/cv-node/config/config.json index 954cb0882ab338781dd3b9ec8cca48fe7b3364f7..4e4a982b7e8fa0c09f71f07b651fc2ddfd97fecb 100644 --- a/cv-node/config/config.json +++ b/cv-node/config/config.json @@ -10,6 +10,7 @@ "frame_delay": 100, "num_frames": 25, "assume_zero_tangential_distortion": true, + "fix_aspect_ratio": true, "fix_principal_point_at_center": true, "use_fisheye_model": false, "fix_k1": false, @@ -19,7 +20,8 @@ "fix_k5": true, "save": true, "use_intrinsics": true, - "use_extrinsics": true + "use_extrinsics": true, + "flip_vertical": false }, "camera": { "name": "Pansonic Lumix DMC-FZ300", diff --git a/cv-node/include/ftl/calibrate.hpp b/cv-node/include/ftl/calibrate.hpp index 7af77206d686e2043a792454c21cce7625e1e6c5..1982b4dc192816d6f2e4ac8d8f5df2eabd371886 100644 --- a/cv-node/include/ftl/calibrate.hpp +++ b/cv-node/include/ftl/calibrate.hpp @@ -5,6 +5,7 @@ #include <ftl/local.hpp> #include <string> #include <vector> +#include <nlohmann/json.hpp> namespace cv { class FileStorage; @@ -21,7 +22,7 @@ class Calibrate { enum InputType { INVALID, CAMERA, VIDEO_FILE, IMAGE_LIST }; void write(cv::FileStorage& fs) const; - void read(const cv::FileNode& node); + void read(const nlohmann::json& node); void validate(); //Mat nextImage(); @@ -65,7 +66,7 @@ class Calibrate { }; public: - Calibrate(ftl::LocalSource *s, const std::string &cal); + Calibrate(ftl::LocalSource *s, nlohmann::json &config); bool recalibrate(); diff --git a/cv-node/src/calibrate.cpp b/cv-node/src/calibrate.cpp index a74f999f44b123732dc923ed12236534d8fd6853..ef2e6fcb7dcf78220a54c80c1aac257de51b42fc 100644 --- a/cv-node/src/calibrate.cpp +++ b/cv-node/src/calibrate.cpp @@ -46,30 +46,30 @@ void Calibrate::Settings::write(FileStorage& fs) const // //<< "Input" << input << "}"; } -void Calibrate::Settings::read(const FileNode& node) //Read serialization for this class +void Calibrate::Settings::read(const nlohmann::json& node) //Read serialization for this class { - node["BoardSize_Width" ] >> boardSize.width; - node["BoardSize_Height"] >> boardSize.height; - node["Calibrate_Pattern"] >> patternToUse; - node["Square_Size"] >> squareSize; - node["Calibrate_NrOfFrameToUse"] >> nrFrames; - node["Calibrate_FixAspectRatio"] >> aspectRatio; - node["Write_DetectedFeaturePoints"] >> writePoints; - node["Write_extrinsicParameters"] >> writeExtrinsics; - node["Write_gridPoints"] >> writeGrid; + boardSize.width = node["board_size"][0]; + boardSize.height = node["board_size"][1]; + //node["Calibrate_Pattern"] >> patternToUse; + squareSize = node["square_size"]; + nrFrames = node["num_frames"]; + aspectRatio = node["fix_aspect_ratio"]; + //node["Write_DetectedFeaturePoints"] >> writePoints; + //node["Write_extrinsicParameters"] >> writeExtrinsics; + //node["Write_gridPoints"] >> writeGrid; //node["Write_outputFileName"] >> outputFileName; - node["Calibrate_AssumeZeroTangentialDistortion"] >> calibZeroTangentDist; - node["Calibrate_FixPrincipalPointAtTheCenter"] >> calibFixPrincipalPoint; - node["Calibrate_UseFisheyeModel"] >> useFisheye; - node["Input_FlipAroundHorizontalAxis"] >> flipVertical; + calibZeroTangentDist = node["assume_zero_tangential_distortion"]; + calibFixPrincipalPoint = node["fix_principal_point_at_center"]; + useFisheye = node["use_fisheye_model"]; + flipVertical = node["flip_vertical"]; //node["Show_UndistortedImage"] >> showUndistorsed; //node["Input"] >> input; - node["Input_Delay"] >> delay; - node["Fix_K1"] >> fixK1; - node["Fix_K2"] >> fixK2; - node["Fix_K3"] >> fixK3; - node["Fix_K4"] >> fixK4; - node["Fix_K5"] >> fixK5; + delay = node["frame_delay"]; + fixK1 = node["fix_k1"]; + fixK2 = node["fix_k2"]; + fixK3 = node["fix_k3"]; + fixK4 = node["fix_k4"]; + fixK5 = node["fix_k5"]; validate(); } @@ -112,7 +112,7 @@ void Calibrate::Settings::validate() if (calibFixPrincipalPoint) flag |= fisheye::CALIB_FIX_PRINCIPAL_POINT; } - calibrationPattern = NOT_EXISTING; + /*calibrationPattern = NOT_EXISTING; if (!patternToUse.compare("CHESSBOARD")) calibrationPattern = CHESSBOARD; if (!patternToUse.compare("CIRCLES_GRID")) calibrationPattern = CIRCLES_GRID; if (!patternToUse.compare("ASYMMETRIC_CIRCLES_GRID")) calibrationPattern = ASYMMETRIC_CIRCLES_GRID; @@ -120,7 +120,7 @@ void Calibrate::Settings::validate() { LOG(ERROR) << " Camera calibration mode does not exist: " << patternToUse; goodInput = false; - } + }*/ atImageList = 0; } @@ -166,16 +166,16 @@ bool runCalibration(Calibrate::Settings& s, Size imageSize, Mat& cameraMatrix, vector<vector<Point2f> > imagePoints, float grid_width, bool release_object); -Calibrate::Calibrate(ftl::LocalSource *s, const std::string &cal) : local_(s) { - FileStorage fs(cal, FileStorage::READ); // Read the settings +Calibrate::Calibrate(ftl::LocalSource *s, nlohmann::json &config) : local_(s) { + /*FileStorage fs(cal, FileStorage::READ); // Read the settings if (!fs.isOpened()) { LOG(ERROR) << "Could not open the configuration file: \"" << cal << "\""; return; - } + }*/ //fs["Settings"] >> settings_; - settings_.read(fs["Settings"]); - fs.release(); + settings_.read(config); + //fs.release(); if (!settings_.goodInput) { @@ -534,7 +534,7 @@ static bool _runCalibration( Calibrate::Settings& s, Size& imageSize, Mat& camer } vector<vector<Point3f> > objectPoints(1); - calcBoardCornerPositions(s.boardSize, s.squareSize, objectPoints[0], s.calibrationPattern); + calcBoardCornerPositions(s.boardSize, s.squareSize, objectPoints[0], Calibrate::Settings::CHESSBOARD); objectPoints[0][s.boardSize.width - 1].x = objectPoints[0][0].x + grid_width; newObjPoints = objectPoints[0]; diff --git a/cv-node/src/main.cpp b/cv-node/src/main.cpp index 95b04d3ff1dea95c06f204c8674399e95d7ebff8..4fbe18c48921d5305c088c7da14a4694d5796c2d 100644 --- a/cv-node/src/main.cpp +++ b/cv-node/src/main.cpp @@ -111,7 +111,7 @@ int main(int argc, char **argv) { }*/ // Perform or load calibration intrinsics + extrinsics - Calibrate calibrate(lsrc, OPTION_calibration_config); + Calibrate calibrate(lsrc, config["calibration"]); if (config["calibrate"]) calibrate.recalibrate(); if (!calibrate.isCalibrated()) LOG(WARNING) << "Cameras are not calibrated!";