#include "imagepipeline.h" #include #include #include #include #include #include #include #include ImagePipeline::ImagePipeline(Cameras* cameras, bool simpleStichingAlg, QObject *parent): QObject(parent), cameras_(cameras), simpleStichingAlg_(simpleStichingAlg) { connect(cameras_, &Cameras::newImages, this, &ImagePipeline::apply); } void ImagePipeline::applyDarkMap(cv::Mat& image, const cv::Mat& darkmap) { cv::Mat localDarkMap; if(image.size() != darkmap.size()) { qWarning()<<"image and darkmap not of the same size"< images, bool simpleStichingAlg) { qDebug()<<__func__<<"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) applyDarkMap(img.image, profile.cameras[0].darkmap); remapedImages.push_back(img); break; } } } else { for(Camera::Image& image : images) { qDebug()<<__func__<<"image cam id"< 0) { std::sort(remapedImages.begin(), remapedImages.end(), [](const RemapedImage& imgA, const RemapedImage& imgB) -> bool {return imgA.origin.x < imgB.origin.x;}); cv::Mat output; if(simpleStichingAlg) output = simpleStich(remapedImages); else output = stich(remapedImages, true); if(output.depth() != CV_8U) output.convertTo(output, CV_8U); if(output.channels() == 3) cv::cvtColor(output, output, cv::COLOR_BGR2GRAY); output.convertTo(output, CV_32FC1, 1.0/255.0, 0); if(profile.lightmap.data) { qDebug()<<"output"< 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, simpleStichingAlg_); futureImageWatchers_.back()->setFuture(futureImage); } } void ImagePipeline::setProfile(const Profile& profile) { profile_ = profile; cameras_->setExposureTime(profile_.exposureTime); cameras_->setLighting(profile_.lighting); cameras_->setSetup(profile_.cameras); 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"); } } } }