示例#1
0
void Projection::createPanoImage_Diff_Abs_() {
    unsigned int numCam = input_package_->size();
    unsigned int wImage = input_package_->at(0).width();
    
    #pragma omp parallel for
    for (unsigned int y = 0; y < height_; ++y) {
	for (unsigned int x = 0; x < width_; ++x) {
	    bool check_overlap = false;
	    for (unsigned int i = 0; i < numCam; ++i) 
		check_overlap = (check_overlap || (*mask_package_)[i].data()[x + y * width_]);
	    Coordinate_ coordinate = *(mask_cylinder_ + x + y * width_);
	    int cam_index = coordinate.cam_index;
	    if ((cam_index >= 0) && (!check_overlap)) {
		unsigned int xD = (unsigned int)coordinate.point.u(), yD = (unsigned int)coordinate.point.v(); // Read integer point
		(*pano_image_).data()[3*(x + y * width_)] = (*input_package_)[cam_index].data()[3*(xD + yD * wImage)];
		(*pano_image_).data()[3*(x + y * width_) + 1] = (*input_package_)[cam_index].data()[3*(xD + yD * wImage) + 1];
		(*pano_image_).data()[3*(x + y * width_) + 2] = (*input_package_)[cam_index].data()[3*(xD + yD * wImage) + 2];
	    }
	}
    }
    
    Package<Image>*	tmp;
    tmp = new Package<Image>(input_package_->size(),width_, height_, Image::RGB, true);
    for (unsigned int camera = 0; camera < numCam; ++camera) {
	#pragma omp parallel for
	for (unsigned int y = 0; y < height_; ++y) {
	    for (unsigned int x = 0; x < width_; ++x) {
		if ((*mask_package_)[camera].data()[x + y * width_] || (*mask_package_)[(camera-1+numCam)%numCam].data()[x + y * width_]) {
		    RealPoint2D pos = maps_[camera][x + y * width_];
		    unsigned int xD = (unsigned int)pos.u(), yD = (unsigned int)pos.v(); // Read integer point
		    (*tmp)[camera].data()[3*(x + y * width_)] = (*input_package_)[camera].data()[3*(xD + yD * wImage)];
		    (*tmp)[camera].data()[3*(x + y * width_) + 1] = (*input_package_)[camera].data()[3*(xD + yD * wImage) + 1];
		    (*tmp)[camera].data()[3*(x + y * width_) + 2] = (*input_package_)[camera].data()[3*(xD + yD * wImage) + 2];
		} 
	    }
	}
    }
    
    const float coff_r = 0.299, coff_g = 0.587, coff_b = 0.114;	// CCIR 601
    //   const float coff_r = 0.2126, coff_g = 0.7152, coff_b = 0.0722;	// ITU-R
    
    for (unsigned int camera = 0; camera < numCam; ++camera) {
	#pragma omp parallel for
	for (unsigned int y = 0; y < height_; ++y) {
	    for (unsigned int x = 0; x < width_; ++x) {
		if ((*mask_package_)[camera].data()[x + y * width_]) {
		    unsigned int camera1 = (camera + 1) % numCam;
		    
		    float c1 =    coff_r * (float)((tmp->at(camera)).data()[3*(x + y * (tmp->at(camera)).width())]) 
		    + coff_g * (float)((tmp->at(camera)).data()[3*(x + y * (tmp->at(camera)).width()) + 1])  
		    + coff_b * (float)((tmp->at(camera)).data()[3*(x + y * (tmp->at(camera)).width()) + 2]);
		    
		    float c2 = 	coff_r * (float)((tmp->at(camera1)).data()[3*(x + y * (tmp->at(camera1)).width())]) 
		    + coff_g * (float)((tmp->at(camera1)).data()[3*(x + y * (tmp->at(camera1)).width()) + 1])  
		    + coff_b * (float)((tmp->at(camera1)).data()[3*(x + y * (tmp->at(camera1)).width()) + 2]);
		    float dssim = fabs(c1 - c2);
		    
		    //cout << dssim << "	";
		    (*pano_image_).data()[3*(x + y * width_)] = (unsigned int) (dssim);
		    (*pano_image_).data()[3*(x + y * width_) + 1] = (unsigned int) (dssim);
		    (*pano_image_).data()[3*(x + y * width_) + 2] = (unsigned int) (dssim);
		} 
	    }
	}
    }
    
    delete tmp;
}
示例#2
0
void Projection::createPanoImage_Diff_Structure_() {
    unsigned int numCam = input_package_->size();
    unsigned int wImage = input_package_->at(0).width();
    
    #pragma omp parallel for
    for (unsigned int y = 0; y < height_; ++y) {
	for (unsigned int x = 0; x < width_; ++x) {
	    bool check_overlap = false;
	    for (unsigned int i = 0; i < numCam; ++i) 
		check_overlap = (check_overlap || (*mask_package_)[i].data()[x + y * width_]);
	    Coordinate_ coordinate = *(mask_cylinder_ + x + y * width_);
	    int cam_index = coordinate.cam_index;
	    if ((cam_index >= 0) && (!check_overlap)) {
		unsigned int xD = (unsigned int)coordinate.point.u(), yD = (unsigned int)coordinate.point.v(); // Read integer point
		(*pano_image_).data()[3*(x + y * width_)] = (*input_package_)[cam_index].data()[3*(xD + yD * wImage)];
		(*pano_image_).data()[3*(x + y * width_) + 1] = (*input_package_)[cam_index].data()[3*(xD + yD * wImage) + 1];
		(*pano_image_).data()[3*(x + y * width_) + 2] = (*input_package_)[cam_index].data()[3*(xD + yD * wImage) + 2];
	    }
	}
    }
    
    Package<Image>*	tmp;
    tmp = new Package<Image>(input_package_->size(),width_, height_, Image::RGB, true);
    for (unsigned int camera = 0; camera < numCam; ++camera) {
	#pragma omp parallel for
	for (unsigned int y = 0; y < height_; ++y) {
	    for (unsigned int x = 0; x < width_; ++x) {
		if ((*mask_package_)[camera].data()[x + y * width_] || (*mask_package_)[(camera-1+numCam)%numCam].data()[x + y * width_]) {
		    RealPoint2D pos = maps_[camera][x + y * width_];
		    unsigned int xD = (unsigned int)pos.u(), yD = (unsigned int)pos.v(); // Read integer point
		    (*tmp)[camera].data()[3*(x + y * width_)] = (*input_package_)[camera].data()[3*(xD + yD * wImage)];
		    (*tmp)[camera].data()[3*(x + y * width_) + 1] = (*input_package_)[camera].data()[3*(xD + yD * wImage) + 1];
		    (*tmp)[camera].data()[3*(x + y * width_) + 2] = (*input_package_)[camera].data()[3*(xD + yD * wImage) + 2];
		} 
	    }
	}
    }
    //   Image img = tmp->at(0);
    //   img.save("test.png", Image::PNG);
    //   img = tmp->at(1);
    //   img.save("test1.png", Image::PNG);
    
    for (unsigned int camera = 0; camera < numCam; ++camera) {
	#pragma omp parallel for
	for (unsigned int y = 0; y < height_; ++y) {
	    for (unsigned int x = 0; x < width_; ++x) {
		if ((*mask_package_)[camera].data()[x + y * width_]) {
		    RealPoint2D pos(x,y);
		    unsigned int camera1 = (camera + 1) % numCam;
		    
		    Window_image win1(tmp->at(camera), pos, mask_package_->at(camera), N_size_, N_size_); //3, 3
		    Window_image win2(tmp->at(camera1), pos, mask_package_->at(camera), N_size_, N_size_); //3, 3
		    float dssim = win1.DSSIM(win2);
		    //cout << dssim << "	";
		    (*pano_image_).data()[3*(x + y * width_)] = (unsigned int) (dssim * 255.0);
		    (*pano_image_).data()[3*(x + y * width_) + 1] = (unsigned int) (dssim * 255.0);
		    (*pano_image_).data()[3*(x + y * width_) + 2] = (unsigned int) (dssim * 255.0);
		} 
	    }
	}
    }
    
    delete tmp;
}