Beispiel #1
0
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 ;

}
Beispiel #3
0
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";
	
}