bool MFReconstruct::runReconstruction() { bool runSucess = false; ///加载相机标定参数及所采集图像 for(int i = 0; i < 2; i++){ camsPixels[i] = new cv::vector<double>[cameraHeight * cameraWidth];//将每个相机图像中的每个像素在投影区域中的横坐标记录 runSucess = loadCamImgs(scanFolder[i], imgPrefix[i], imgSuffix); ///对指针存储器camsPixels赋值,camsPixels[i]的地址就是camPixel的地址 camPixels = camsPixels[i]; ///截至这一步,实例camera的position、width、height属性已被赋值,camera对应cameras[i] if(!runSucess)//如果加载图片失败,中断 break; else{ computeShadows(); decodePatterns(); unloadCamImgs(); } } if(runSucess){ points3DProjView = new PointCloudImage(cameraWidth, cameraHeight, haveColor); //最后一个bool值代表是否上色,这里改为false triangulation(camsPixels[0],camsPixels[1]); } return runSucess; }
Reconstructor::~Reconstructor(void) { unloadCamImgs(); if(points3DProjView) delete points3DProjView ; }
bool MFReconstruct::loadCamImgs(QString folder, QString prefix, QString suffix)//load camera images { cv::Mat tmp; if(!camImgs.empty()) unloadCamImgs(); sr->calParameters(); for(int i = 0; i < numberOfImgs; i++){ QString path; path = folder;//这里folder要达到left/right一层 path += prefix + QString::number(i) + suffix; tmp.release(); tmp = cv::imread(path.toStdString(),0);//flag=0 Return a grayscale image if(tmp.empty()){ QMessageBox::warning(NULL,tr("Load Images"),tr("Scan Images not found!")); break; } else{ if (processl){//第一次调用loadImg时认为是加载左相机图像 sr->doStereoRectify(tmp,true); //cv::imwrite(path.toStdString(),tmp); } else{ sr->doStereoRectify(tmp,false); //cv::imwrite(path.toStdString(),tmp); } ///这里对图像进行归一化操作,以细化图像灰度细节 cv::Mat out = cv::Mat(tmp.rows,tmp.cols,CV_64FC1); Utilities::matToGray(tmp,out); camImgs.push_back(out); // cv::normalize(out,out,255.0,0.0,cv::NORM_MINMAX); // cv::imwrite(savePath_.toStdString()+"/q.png",out); } } processl = !processl;//每调用一次loadCamImgs都对“当前是否处理左图像”取反 return !tmp.empty(); }
void Reconstructor::runReconstruction() { for(int i=0; i< numOfCams; i++) { if(cameras[i].distortion.empty()) { std::cout<<"Camera "<<i<< "is not set.\n"; exit(-1); } if(pathSet[i] == false) { std::cout<<"Image path for camera "<< i <<" is not set."; exit(-1); } } GrayCodes grays(proj_w,proj_h); numOfColBits = grays.getNumOfColBits(); numOfRowBits = grays.getNumOfRowBits(); numberOfImgs = grays.getNumOfImgs(); for(int i=0; i < numOfCams; i++) { //findProjectorCenter(); cameras[i].position = cv::Point3f(0,0,0); cam2WorldSpace(cameras[i],cameras[i].position); camera = &cameras[i]; camsPixels[i] = new cv::vector<cv::Point>[proj_h*proj_w]; camPixels = camsPixels[i]; loadCamImgs(camFolder[i],imgPrefix[i],imgSuffix[i]); colorImgs.push_back(cv::Mat()); colorImgs[i] = color; computeShadows(); if(saveShadowMask_) { std::stringstream path; path<<"cam"<<i+1<<"Mask.png"; saveShadowImg(path.str().c_str()); } decodePaterns(); unloadCamImgs(); } //reconstruct points3DProjView = new PointCloudImage( proj_w, proj_h , true ); for(int i = 0; i < numOfCams; i++) { for(int j=i+1; j< numOfCams; j++) triangulation(camsPixels[i],cameras[i],camsPixels[j],cameras[j],i,j); } }
//load camera images void Reconstructor::loadCamImgs( std::string folder,std::string prefix,std::string suffix) { cv::Mat tmp; std::cout<<"Loading Camera Images..."; if(!camImgs.empty()) unloadCamImgs(); for(int i=0; i<numberOfImgs;i++) { std::stringstream path; path<<folder.c_str(); if(i+1<10) path<<"0"; path << prefix.c_str() << i+1 << suffix.c_str(); tmp.release(); tmp = cv::imread(path.str().c_str()); if(tmp.empty()) { std::cout<<"\nError loading cam image "<<i+1<<". Press Any Key to Exit."; getch(); exit(-1); } //auto contrast if(autoContrast) { Utilities::autoContrast(tmp,tmp); if(saveAutoContrast) { std::stringstream p; p<<folder.c_str() << "AutoContrastSave/" << prefix.c_str() << i+1 << suffix.c_str(); cv::imwrite(p.str().c_str(),tmp); } } if(i==0) { color = tmp; } cv::cvtColor(tmp, tmp, CV_BGR2GRAY); camImgs.push_back(tmp); } if(camera->width==0) { camera->height=camImgs[0].rows; camera->width =camImgs[0].cols; } std::cout<<"done!\n"; }