• OpenCV 图像和ROI去畸变


    void calibration_distort(string cur_photo_path) {
        cv::Mat cameraMatrix[70];
        cv::Mat distortionCoeff[70];
        std::vector<cv::Mat> undistortImg(70);
        std::string datapath = "./data";
        for (int i = 0; i <NUM_CAMS; i++)
        {
            cout << "undistorting cam: " << i + 1 <<" "<< cur_photo_path<<endl;
            int camera_id = i;
            loadcamerapara(cameraMatrix[i], distortionCoeff[i], camera_id, datapath);
            undistortImgandjson(cameraMatrix[i], distortionCoeff[i], camera_id, undistortImg[i], datapath, cur_photo_path);
            cv::imwrite("./1230data/undistortImg/CCD" + to_string(i + 1) + ".bmp", undistortImg[i]);
        }
        cout << "图像去畸变finished!" << endl;
    }
    
    
    void loadcamerapara(cv::Mat & cameraMatrix, cv::Mat & distortionCoeff, int camera_id, std::string datapath)
    {
        double fx,cx,fy,cy,kc1,kc2,kc3,kc4;
        double temp;
        char buffer[256];
        std::ifstream in(datapath+"/camera_para/CCD"+std::to_string(camera_id+1)+".cal");
      // std::ifstream in("C:/Users/gzr2018/Desktop/xuening'data/11-16/11-16/waicanCCD"+ std::to_string(camera_id + 1)+".txt");
        int idd=0;
        for(int i=0;i<5;i++)//原来是 5
                in.getline (buffer,100);
        in>>fx;in>>temp;in>>cx;
        in>>temp;in>>fy;in>>cy;
        for(int i=0;i<2;i++)
                in.getline (buffer,100);
     /*   std::ifstream in2("C:/Users/gzr2018/Desktop/xuening'data/1115/waicanCCD" + std::to_string(camera_id + 1) + ".txt");
        for (int i = 0; i < 8; i++)
            in2.getline(buffer, 100);*/
        in>>kc1;in>>kc2;in>>kc3;in>>kc4;
        cameraMatrix = ( cv::Mat_<double> ( 3,3 ) << fx,0.000000,cx,
                            0.000000,fy,cy,
                            0.000000,0.000000,1.000000  );
        distortionCoeff = ( cv::Mat_<double> ( 1,4 ) << kc1, kc2, kc3, kc4 );
    
        //std::cout<<cameraMatrix<<std::endl;
        //std::cout<<distortionCoeff<<std::endl;
    }
    void undistortImgandjson(cv::Mat cameraMatrix, cv::Mat distortionCoeff, int camera_id, cv::Mat& undistortImg, 
    std::string datapath, std::string photopath)
    {
        cv::Mat srcMat, histMat;
        if (photopath == "") {
            srcMat = cv::imread(datapath + "/rawImg/CCD" + std::to_string(camera_id + 1) + ".bmp",0);
        }
        else {
            srcMat = cv::imread(photopath + "/CCD" + std::to_string(camera_id + 1) + ".bmp",0);
        }
    
        //histMat = cv::imread(photopath + "/HistMatch/CCD" + std::to_string(camera_id + 1) + ".bmp");
        
        //srcMat = MyHistMatch(histMat, srcMat);
    
        cv::Mat dstMat,new_matrix;
        undistort(srcMat, dstMat, cameraMatrix, distortionCoeff, new_matrix);
    
        //dstMat = MyHistMatch(histMat, dstMat);
        
            //boost::filesystem::path dir((datapath+"/undistortImg").c_str());
            //boost::filesystem::create_directory(dir);
     	    //mkdir((datapath+"/undistortImg").c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
            //imwrite(datapath+"/undistortImg/CCD"+std::to_string(camera_id+1)+".bmp", dstMat);  
        
        undistortImg = dstMat;
        //return;
        std::string jsonpath = datapath+"/rawImg_json/camera-CCD"+std::to_string(camera_id+1)+".json";
        std::ifstream jsonfile(jsonpath);
        nlohmann::json roifile;
        jsonfile >> roifile;
    
        std::string camera_no = roifile["camera"];
        //std::cout<<camera_no<<":"<<std::endl;
        nlohmann::json roi = roifile["roi"];
    
        nlohmann::json root;
        root["camera"]=camera_no;
        nlohmann::json jsonroi[max_roi_size];
        //std::cout<<roi.size()<<std::endl;
        for (int i=0; i<roi.size(); i++)
        {
            cv::Mat cut_image;
            cv::Rect m_select;
            std::string name = roi[i]["name"];
            int lx = roi[i]["lx"];
            int ly = roi[i]["ly"];
            int rx = roi[i]["rx"];
            int ry = roi[i]["ry"];
            checkroi(lx,ly,rx,ry);
            jsonroi[i]["name"]=name;
            std::vector<cv::Point2d> src;
            std::vector<cv::Point2d> tmp;
            std::vector<cv::Point2d> dst;
            cv::Point2d p1(lx,ly);
            src.push_back(p1);
            myUndistortPoints(src, dst, cameraMatrix, distortionCoeff);
            //std::cout<<name<<" "<<lx<<" "<<ly<<" "<<rx<<" "<<ry<<std::endl;	
            //std::cout<<dst[0]<<std::endl;
            jsonroi[i]["lx"]=dst[0].x;    
            jsonroi[i]["ly"]=dst[0].y;  
            if (dst[0].x > 5472 || dst[0].y > 3648)
                continue;
            //box tempbox;
            //tempbox.lx = dst[0].x;   
            //tempbox.ly = dst[0].y;   
            src.clear();
            tmp.clear();
            dst.clear();
            cv::Point2d p2(rx,ry);
            src.push_back(p2);
            myUndistortPoints(src, dst, cameraMatrix, distortionCoeff);
            //std::cout<<dst[0]<<std::endl;
            jsonroi[i]["rx"]=dst[0].x;    
            jsonroi[i]["ry"]=dst[0].y;  
            if (dst[0].x < 0 || dst[0].y < 0)
                continue;
            //tempbox.rx = dst[0].x;   
            //tempbox.ry = dst[0].y;  
            src.clear();
            tmp.clear();
            dst.clear();
            root["roi"].push_back(jsonroi[i]);
        }
        //std::cout<<"read json complete."<<std::endl;
        jsonfile.close();
    	//mkdir((datapath+"/undistortImg_json").c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
        boost::filesystem::path dir((datapath+"/undistortImg_json").c_str());
        boost::filesystem::create_directory(dir);
        std::ofstream os(datapath+"/undistortImg_json/camera-CCD"+std::to_string(camera_id+1)+".json");
        os << root.dump(4) << std::endl;
        os.close();
    }
    
  • 相关阅读:
    python+requests+excel 接口测试
    Pycharm配置git
    ubuntu16.04+ROS安装kinectV1
    ubuntu16.04安装有道词典
    ROS kinetic语音识别
    在Ubuntu16.04中python环境下实现tab键补全
    ros kinetic安装rbx1
    ubuntu14.04安装opencv3.1
    ubuntu16.04SSH无法连接
    VC6中函数点go to definition报告the symbol XXX is undefined
  • 原文地址:https://www.cnblogs.com/gzr2018/p/14293557.html
Copyright © 2020-2023  润新知