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; }
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; }
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))); } }
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); }
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; }
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; }