Пример #1
0
static cv::Mat generateRadianceMap(const cv::Mat& rc)
{
  cv::Size size = getImage(0).size();
  
  cv::Mat_<cv::Vec3f> radiance(size);
  
  for (int y = 0; y < size.height; ++y) {
    for (int x = 0; x < size.width; ++x) {
      cv::Vec3f sum(0,0,0), wsum(0,0,0);
      
      for (int p = 0, n = numImages(); p < n; ++p) {
        const cv::Mat& img = getImage(p);
        cv::Vec3b c = img.at<cv::Vec3b>(y, x);
        float exptime = getExposureTime(p);
        
        cv::Vec3f tmp, wtmp(weight(c[0]), weight(c[1]), weight(c[2]));
        tmp[0] = (rc.at<float>(c[0], 0) - std::log(exptime)) * wtmp[0];
        tmp[1] = (rc.at<float>(c[1], 1) - std::log(exptime)) * wtmp[1];
        tmp[2] = (rc.at<float>(c[2], 2) - std::log(exptime)) * wtmp[2];
        sum += tmp;
        wsum += wtmp;
      }
      
      cv::Vec3f tmp;
      tmp[0] = std::exp( sum[0] / wsum[0] );
      tmp[1] = std::exp( sum[1] / wsum[1] );
      tmp[2] = std::exp( sum[2] / wsum[2] );
      
      radiance.at<cv::Vec3f>(y, x) = tmp;
    }
  }
  
  return radiance;
}
Пример #2
0
float Camera::getExposureTime(int whichSide)
{
	float eTime = -1.0;
#ifdef _WIN32
	int retCode = eSPAEAWB_GetExposureTime(whichSide, &eTime);
#elif __APPLE__
    eTime = getExposureTime(whichSide);
#endif
	return eTime;
}
Пример #3
0
void QCamQHY5::changeExposure(int e) {
   // update exposure time
   frameExposure_=getExposureTime(e);

   // update display
   int transferTime=1558*(height_+26)/PIXEL_RATE;
   if(transferTime>frameExposure_) {
      exposureValue->setText(QString().sprintf("%2i fps (max)",(int)(1.0/(float)transferTime*1000)));
   } else {
      if(frameExposure_<1000)
         exposureValue->setText(QString().sprintf("%2i fps",(int)(1.0/(float)frameExposure_*1000)));
      else
         exposureValue->setText(QString().sprintf("%2.1f s",((float)frameExposure_/1000)));
   }
}
Пример #4
0
QCamQHY5::QCamQHY5() {
   // set cam label
   label(QString("QHY5"));
   // vars init
   sizeTable_=NULL;
   exposureValue=NULL;

   // message
   cerr << "Starting QHY5, please wait..." << endl;

   // setting exposure
   if(settings.haveKey("QHY5_EXPOSURE")) {
      frameExposure_=atoi(settings.getKey("QHY5_EXPOSURE"));
      if(frameExposure_==0)
         frameExposure_=getExposureTime(0);
   } else
      frameExposure_=getExposureTime(0);

   denoise_=FALSE;
   shooting_=FALSE;
   xstart_=0;
   ystart_=0;
   width_=640;
   height_=512;
   targetWidth_=width_;
   targetHeight_=height_;
   targetSize.setWidth(targetWidth_);
   targetSize.setHeight(targetHeight_);

   // setting gains
   if(settings.haveKey("QHY5_GAIN_G1")) {
      gainG1_=atoi(settings.getKey("QHY5_GAIN_G1"));
      if(gainG1_==0) gainG1_=5;
   } else
      gainG1_=5;
   if(settings.haveKey("QHY5_GAIN_G2")) {
      gainG2_=atoi(settings.getKey("QHY5_GAIN_G2"));
      if(gainG2_==0) gainG2_=5;
   } else
      gainG2_=5;
   if(settings.haveKey("QHY5_GAIN_R")) {
      gainR_=atoi(settings.getKey("QHY5_GAIN_R"));
      if(gainR_==0) gainR_=5;
   } else
      gainR_=5;
   if(settings.haveKey("QHY5_GAIN_B")) {
      gainB_=atoi(settings.getKey("QHY5_GAIN_B"));
      if(gainB_==0) gainB_=5;
   } else
      gainB_=5;

   sizeTable=getAllowedSize();
   // get the cam instance
   camera=QHY5cam::instance(QHY5_IMAGER);
   if(camera==NULL) {
      QMessageBox::information(0,"Qastrocam-g2","Unable to reach the QHY5 imager\nLeaving...");
      exit(1);
   }

   // compute the shooting mode
   shootMode_=(frameExposure_<1000);
   // set frame
   inputBuffer_.setMode(GreyFrame);
   inputBuffer_.setSize(QSize(width_,height_));
   // configure the cam
   camera->configure(xstart_,ystart_,width_,height_,gainG1_,gainB_,gainR_,gainG2_,&width_,&height_);
   // set prop.
   static char buff[11];
   snprintf(buff,10,"%dx%d",width_,height_);
   setProperty("FrameSize",buff,true);
   setProperty("CameraName","QHY5");
   setProperty("FrameExposure",frameExposure_);
   setProperty("Gain Green1",gainG1_,false);
   setProperty("Gain Green2",gainG1_,false);
   setProperty("Gain Red",gainR_,false);
   setProperty("Gain Blue",gainB_,false);
}
Пример #5
0
static cv::Mat recoverResponseCurve()
{
  const float lambda = 30.0f;
  constexpr int numSamples = 128;
  cv::Size size = getImage(0).size();
  
  cv::Mat_<float> result(256, 3);
  
  // Sample Pixels
  std::vector<cv::Point> samples(numSamples);
  {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> xdis(0, size.width-1);
    std::uniform_int_distribution<> ydis(0, size.height-1);
    for (int i = 0; i < numSamples; ++i) {
      samples[i].x = xdis(gen);
      samples[i].y = ydis(gen);
    }
  }
  if (1) {
    cv::Mat tmp;
    cv::cvtColor(getImage(numImages()/2), tmp, cv::COLOR_YCrCb2BGR);
    tmp = getImage(numImages()/2).clone();
    for (int i = 0; i < numSamples; ++i)
      cv::circle(tmp, samples[i], 10, cv::Scalar(0, 0, 255), 3);
    cv::imshow("samples", tmp);
    //cv::waitKey(0);
  }
  
  // Solve
  for (int channel = 0; channel < 3; ++channel) {
    
    int row = numSamples * numImages() + 1 + 254;
    int col = 256 + numSamples;
    
    cv::Mat_<float> b(row, 1, 0.0f);
    cv::Mat_<float> ma(row, col, 0.0f);
    
    int k = 0;
    for (int i = 0; i < numSamples; ++i) {
      int x = samples[i].x, y = samples[i].y;
      
      for (int j = 0, n = numImages(); j < n; ++j) {
        const cv::Mat& img = getImage(j);
        float exposureTime = getExposureTime(j);
        
        int z = img.at<cv::Vec3b>(y, x)[channel];
        float w = weight(z);
        
        ma.at<float>(k, z) = w;
        ma.at<float>(k, 256+i) = -w;
        b.at<float>(k, 0) = w * std::log(exposureTime);
        
        ++k;
      }
    }
    
    ma.at<float>(k, 128) = 1.0f;
    ++k;
    
    for (int i = 0; i < 254; ++i) {
      float w = weight(i+1);
      
      ma.at<float>(k, i) = lambda * w;
      ma.at<float>(k, i+1) = -2.0f * lambda * w;
      ma.at<float>(k, i+2) = lambda * w;
      
      ++k;
    }
    
    cv::Mat_<float> x(col, 1, 0.0f);
    cv::Mat_<float> mu(row, row), mw(row, col), mv(col, col);
    
    cv::SVD::compute(ma, mw, mu, mv, cv::SVD::MODIFY_A);
    cv::SVD::backSubst(mw, mu, mv, b, x);
    
    // Get Result
    for (int i = 0; i < 256; ++i) {
      result.at<float>(i, channel) = x.at<float>(i, 0);
    }
  }
  
  return result;
}
Пример #6
0
QStringList *ExifReaderWriter::readExifInfo(QString pictureName, FormatHandler *formatH)
{
    QStringList *exifList = new QStringList;

    Exiv2::Image::AutoPtr image = openExif(pictureName);
    if(image.get() == 0)
        return exifList;
    Exiv2::ExifData &exifData = image->exifData();
    if (exifData.empty()) {
        //nejsou exif data
        return exifList;
    }


    //cteniGPS souradnic
    double lat = readLatLon("Exif.GPSInfo.GPSLatitude", exifData);
    double lon = readLatLon("Exif.GPSInfo.GPSLongitude", exifData);
    double alt = readAltitude("Exif.GPSInfo.GPSAltitude", exifData);
    ////////////////////////////

    //cteni data
    QDateTime *dateTime = NULL;
    if((dateTime = readExifDate(exifData,"Exif.Photo.DateTimeOriginal")) == NULL)
        if((dateTime = readExifDate(exifData,"Exif.Image.DateTimeOriginal")) == NULL)
            if((dateTime = readExifDate(exifData,"Exif.Photo.DateTimeDigitized")) == NULL)
                dateTime = readExifDate(exifData,"Exif.Image.DateTime");


    ////////////////////
    QString cameraMake = readExifItem(exifData, "Exif.Image.Make");
    QString cameraModel = readExifItem(exifData, "Exif.Image.Model");
    QString imageSize = readExifItem(exifData, "Exif.Photo.PixelXDimension")
                        +" x "
                        + readExifItem(exifData, "Exif.Photo.PixelYDimension");
    QString exposureTime = getExposureTime(exifData);
    QString flash = getFlash(exifData);
    //'5' flash fired but strobe return light not detected, '7' flash fired and strobe return light detected.
    QString meteringMode = getMeteringMode(exifData);
    QString fNumber = getFNumber(exifData);
    QString isoSpeed = readExifItem(exifData, "Exif.Photo.ISOSpeedRatings");
    QString focalLength = getFocalLength(exifData);
    QString comment = readExifItem(exifData, "Exif.Photo.UserComment");
    QString exposureBias = getExposureBias(exifData);
    QString exposureProgram = getExposureProgram(exifData);
    //////////////////
    (*exifList) << ((dateTime != NULL) ? dateTime->toString(formatH->formatDateTime) : "")
            << (lat < 1000 ?(formatH->gpsInFormat(lat) + (lat>=0 ? tr("N") : tr("S"))) : "")
            << (lon < 1000 ?(formatH->gpsInFormat(lon) + (lon>=0 ? tr("E") : tr("W"))) : "")
            << (alt > -999 ?(QString::number(alt) + tr(" m")) : "")
            << cameraMake
            << cameraModel
            << exposureTime
            << exposureBias
            << exposureProgram
            << imageSize
            << flash
            << fNumber
            << meteringMode
            << isoSpeed
            << focalLength
            << comment
            ;

    return exifList;

}