#include "Calibrator.h" #include "structured_light.h" #include "CalibrationData.h" #include #include Calibrator::Calibrator() { } Calibrator::~Calibrator() { } void Calibrator::addFrameSequence(std::vector &frameSeq) { int n = frameSeqs.size(); frameSeqs.resize(n+1); std::vector &frame = frameSeqs[n]; for(int i = 0; i < frameSeq.size(); i++) { frame.push_back(frameSeq[i]); } std::cout <<"Calibrator::addFrameSequence : frame.size(): "<< frame.size() << std::endl; } void Calibrator::reset() { frameSeqs.clear(); board_corners.clear(); projector_corners.clear(); pattern_list.clear(); } void Calibrator::setBoardRows(int rows) { board_rows = rows; board_size = cv::Size(board_rows, board_cols); } void Calibrator::setBoardCols(int cols) { board_cols = cols; board_size = cv::Size(board_rows, board_cols); } void Calibrator::setCornerSize(double cornerSize) { dot_dis = cornerSize; corner_size = cv::Size2f(cornerSize, cornerSize); } void Calibrator::setDotDiameter(double dotDiameter) { dot_diameter = dotDiameter; } void Calibrator::setCalibBoard(unsigned board) { board_type = board; } CalibrationData* Calibrator::calibrate() { CalibrationData *res = new CalibrationData(); // detect corners //////////////////////////////////// for(int i = 0; i < frameSeqs.size(); i++) { std::vector corners = extract_board_corners( frameSeqs[i][0] ); board_corners.push_back(corners); // std::cout< pcorners; for(int i = 0; i < frameSeqs.size(); i++) { std::vector const& corners = board_corners[i]; cv::Mat pattern_image; cv::Mat min_max_image; if(corners.size()==0) { projector_corners.push_back(pcorners); pattern_list.push_back(pattern_image); continue; } if(!decode_gray_set(i , pattern_image ,min_max_image)) { projector_corners.push_back(pcorners); pattern_list.push_back(pattern_image); continue; } pattern_list.push_back(pattern_image); for (std::vector::const_iterator iter=corners.begin(); iter!=corners.end(); iter++) { const cv::Point2f & p = *iter; cv::Point2f q; //find an homography around p unsigned WINDOW_SIZE = 30; std::vector img_points , proj_points; if (p.x>WINDOW_SIZE && p.y>WINDOW_SIZE && p.x+WINDOW_SIZE(h); register const cv::Vec2b * min_max_row = min_max_image.ptr(h); //cv::Vec2f * out_row = out_pattern_image.ptr(h); for (unsigned w=p.x-WINDOW_SIZE; w0 || std::isnan(pattern[1])>0) { continue; } if ((min_max[1]-min_max[0]) < static_cast(threshold)) { //apply threshold and skip continue; } img_points.push_back(cv::Point2f(w, h)); proj_points.push_back(cv::Point2f(pattern)); //out_pattern = pattern; } } cv::Mat H = cv::findHomography(img_points , proj_points, cv::RANSAC); // std::cout << " H:\n" << H << std::endl; cv::Point3d Q = cv::Point3d(cv::Mat(H*cv::Mat(cv::Point3d(p.x , p.y , 1.0)))); q = cv::Point2f(Q.x/Q.z ,Q.y/Q.z); // jiuzheng // q.y += 118; pcorners.push_back(q); } else { pcorners.clear(); break; } } std::cout< world_corners; for (int h=0; h > objectPoints; objectPoints.reserve(count); for (unsigned i=0; i world_corners_p; for (int h=0; h > objectPoints_p; objectPoints_p.reserve(count); for (unsigned i=0; i cam_rvecs , cam_tvecs; int cam_flags = cal_flags; cv::Size imageSize = frameSeqs[0][0].size(); res->cam_error = cv::calibrateCamera(objectPoints , board_corners , imageSize , res->Kc , res->kc ,cam_rvecs , cam_tvecs); std::cout<<"calibrate the camera !"< proj_rvecs , proj_tvecs; int proj_flags = cal_flags; cv::Size projector_size(912, 1140); res->proj_error = cv::calibrateCamera(objectPoints_p , projector_corners, projector_size , res->Kp , res->kp , proj_rvecs , proj_tvecs); std::cout<<"calibrate the projector !"<stereo_error = cv::stereoCalibrate(objectPoints , board_corners , projector_corners , res->Kc , res->kc , res->Kp ,res->kp ,imageSize /*ignored*/ , res->Rp , res->Tp , E , F ); // res->stereo_error = cv::stereoCalibrate(objectPoints , board_corners , projector_corners , res->Kc , res->kc , res->Kp ,res->kp ,imageSize /*ignored*/ , res->Rp , res->Tp , E , F , // cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS ,50 ,DBL_EPSILON) , // cv::CALIB_FIX_INTRINSIC /*cv::CALIB_USE_INTRINSIC_GUESS + cal_flags*/); std::cout<<"stereo calibration !"< Calibrator::extract_board_corners(cv::Mat &gray_image) { std::vector corners; int image_scale = 1; if (gray_image.rows<1) { return corners; } cv::Size imageSize = gray_image.size(); if (imageSize.width>1024) { image_scale = imageSize.width/1024; } cv::Mat small_img; if (image_scale>1) { cv::resize(gray_image , small_img , cv::Size(gray_image.cols/image_scale , gray_image.rows/image_scale)); } else { small_img = gray_image; } if(board_type == Chessboard) { cv::findChessboardCorners(small_img, board_size, corners); } else if(board_type == Circular) { cv::findCirclesGrid(small_img, board_size, corners); } if (corners.size()) { for (std::vector::iterator iter=corners.begin(); iter!=corners.end(); iter++) { *iter = image_scale*(*iter); } cv::cornerSubPix(gray_image , corners , cv::Size(11 , 11) , cv::Size(-1 , -1) , cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30 , 0.1)); } return corners; } bool Calibrator::decode_gray_set(int ind , cv::Mat & pattern_image, cv::Mat & min_max_image) { if (ind >= frameSeqs.size()) { //out of bounds return false; } //estimate direct component //b = config.value("robust_estimation/b" DEFAULT_B).toFloat(); std::vector images; // QList direct_component_images(QList() << 15 << 16 << 17 << 18 << 35 << 36 << 37 << 38); int total_images = frameSeqs[ind].size(); int total_patterns = total_images/2 - 1; const int direct_light_count = 4; const int direct_light_offset = 4; QList direct_component_images; for (unsigned i=0; i