#include "imagepipeline.h" #include #include #include #include #include #include ImagePipeline::ImagePipeline(Cameras* cameras, QObject *parent): QObject(parent), cameras_(cameras) { connect(cameras_, &Cameras::newImages, this, &ImagePipeline::apply); } cv::Mat ImagePipeline::process(const Profile profile, std::vector images) { qDebug()<<__FUNCTION__<<"got"< remapedImages; remapedImages.reserve(images.size()); try { if(profile.nodistort && images.size() > 0) { for(auto& image : images) { if(profile.cameras[0].id == image.cameraId) { RemapedImage img; img.origin.x = 0; img.origin.y = 0; image.mat.copyTo(img.image); if(profile.cameras[0].darkmap.data) img.image = img.image - profile.cameras[0].darkmap; remapedImages.push_back(img); break; } } } else { for(Camera::Image& image : images) { qDebug()<<__FUNCTION__<<"image cam id"< 0) { cv::Mat output = simpleStich(remapedImages); output.convertTo(output, CV_32FC1, 1.0/255.0, 0); if(profile.lightmap.data) normalize(output, profile.lightmap); if(profile.calcurve.data) applyCurve(output, profile.calcurve); return output; } else { qDebug()<<"Image pipe failure insufficant matched images"; return cv::Mat(); } } void ImagePipeline::apply(std::vector images) { if(!invalid_) { futureImageWatchers_.push_back(new QFutureWatcher()); connect(futureImageWatchers_.back(), &QFutureWatcher::finished, this, &ImagePipeline::imageFinished); statusMsg("Processing"); QFuture futureImage = QtConcurrent::run(&ImagePipeline::process, profile_, images); futureImageWatchers_.back()->setFuture(futureImage); } } void ImagePipeline::setProfile(const Profile& profile) { profile_ = profile; cameras_->setExposureTime(profile_.exposureTime); cameras_->setLighting(profile_.lighting); qDebug()<<"setting profile "<getCameras())) { invalid_ = true; sigInvalidProfile("A camera required for this profile is not available"); } statusMsg("set profile " + profile_.getName()); } void ImagePipeline::imageFinished() { for(size_t i = 0; i < futureImageWatchers_.size(); ++i) { if(futureImageWatchers_[i]->isFinished()) { cv::Mat result = futureImageWatchers_[i]->result(); if(result.data) { sigResult(Camera::Image(result, 0)); delete futureImageWatchers_[i]; futureImageWatchers_.erase(futureImageWatchers_.begin()+i); i--; statusMsg("Finished"); } else { sigInvalidProfile("Image pipe failure"); } } } }