diff --git a/src/camera.h b/src/camera.h index 3229f01..a1f43e9 100644 --- a/src/camera.h +++ b/src/camera.h @@ -20,8 +20,8 @@ public: { public: cv::Mat mat; - size_t cameraId; - Image(cv::Mat mati, size_t cameraIdi): mat(mati), cameraId(cameraIdi){} + uint64_t cameraId; + Image(cv::Mat mati, uint64_t cameraIdi): mat(mati), cameraId(cameraIdi){} Image() = default; Image(const Image& img) = default; }; @@ -29,7 +29,7 @@ private: cam::Camera* camera_ = nullptr; void callback(cv::Mat); - size_t cameraId_; + uint64_t cameraId_; signals: void newImage(Image); @@ -38,7 +38,7 @@ public: Camera(cam::Camera::Description); ~Camera(); cam::Camera* cam(){return camera_;} - size_t id() const {return cameraId_;} + uint64_t id() const {return cameraId_;} bool operator==(const Camera& cam){return cam.id() == id();} bool operator!=(const Camera& cam){return !operator==(cam);} }; diff --git a/src/cameras.cpp b/src/cameras.cpp index cba009c..8783e5b 100644 --- a/src/cameras.cpp +++ b/src/cameras.cpp @@ -9,7 +9,9 @@ Cameras::Cameras(uvosled* led): led_(led) { ledTimer.setSingleShot(true); + cameraFailureTimer.setSingleShot(true); connect(&ledTimer, &QTimer::timeout, this, &Cameras::lightOff); + connect(&cameraFailureTimer, &QTimer::timeout, this, &Cameras::reloadCameras); } Cameras::~Cameras() @@ -29,6 +31,11 @@ bool Cameras::setCameras(const std::vector& descriptio return ret; } +void Cameras::reloadCameras() +{ + setCameras(getCameras()); +} + void Cameras::clear() { @@ -70,6 +77,9 @@ bool Cameras::addCamera(const cam::Camera::Description& desc) return false; } + enableCapture(false); + blockCaptureId_ = cameras_.back()->id(); + cameras_.back()->cam()->setExposureTime(exposrueTime_); if(desc.getVendor().find("Photonfocus") != std::string::npos) @@ -80,11 +90,11 @@ bool Cameras::addCamera(const cam::Camera::Description& desc) camera->cam()->setAcquisitionMode(cam::Camera::MODE_FREE); camera->cam()->setFrameRate(10); camera->cam()->startAcquisition(); - struct timespec tv = {0, 200000000}; - nanosleep(&tv, nullptr); + std::this_thread::sleep_for (std::chrono::milliseconds(200)); camera->cam()->stopAcquisition(); cameras_.pop_back(); camera = nullptr; + std::this_thread::sleep_for (std::chrono::milliseconds(200)); cameras_.push_back(std::shared_ptr(new Camera(desc))); if(!cameras_.back()->cam()->isOpen()) { @@ -112,6 +122,8 @@ void Cameras::finishAddCamera(std::shared_ptr camera) camera->cam()->setTriggerMode(cam::Camera::TRIGGER_SOFTWARE); setFree(free_); connect(camera.get(), &Camera::newImage, this, &Cameras::imageRecived); + if(blockCaptureId_ == camera->id()) + enableCapture(true); qDebug()<<"Using camera"<id(); } @@ -229,8 +241,12 @@ void Cameras::imageRecived(Camera::Image img) qDebug()<<"Recived"<cam()->getTemperature(temp)) + mean+=temp; + else + failure = true; + } + if(!failure) + return mean/cameras_.size(); + else + return NAN; +} + void Cameras::setSetup(const std::vector& setups) { for(auto& camera : cameras_) diff --git a/src/cameras.h b/src/cameras.h index a9e04c8..0a3219b 100644 --- a/src/cameras.h +++ b/src/cameras.h @@ -26,10 +26,12 @@ private: bool free_ = false; bool disable_ = false; double exposrueTime_ = 1.0/60.0; + uint64_t blockCaptureId_ = 0; LightingSetup lighting_; std::vector> cameras_; std::vector images_; QTimer ledTimer; + QTimer cameraFailureTimer; bool lightFor(const LightingSetup& lighting, double time); @@ -42,6 +44,7 @@ signals: void cameraRemoved(std::shared_ptr camera); void cameraAdded(std::shared_ptr camera); void newImages(std::vector images); + void enableCapture(bool enable); public slots: @@ -51,6 +54,7 @@ public slots: bool stop(); bool setFree(bool free); void setLighting(const LightingSetup& lighting) {lighting_ = lighting;} + void reloadCameras(); public: Cameras(uvosled* led = nullptr); @@ -62,6 +66,7 @@ public: std::shared_ptr getCamera(size_t id); size_t numCameras(){return cameras_.size();} void clear(); + double getMeanTemp(); void load(QSettings& settings); void store(QSettings& settings); void disable(bool disable); diff --git a/src/imagepipeline.cpp b/src/imagepipeline.cpp index 197bc20..1804afa 100644 --- a/src/imagepipeline.cpp +++ b/src/imagepipeline.cpp @@ -6,6 +6,7 @@ #include #include #include +#include ImagePipeline::ImagePipeline(Cameras* cameras, QObject *parent): QObject(parent), cameras_(cameras) { @@ -14,7 +15,7 @@ ImagePipeline::ImagePipeline(Cameras* cameras, QObject *parent): QObject(parent) cv::Mat ImagePipeline::process(const Profile profile, std::vector images) { - qDebug()<<__FUNCTION__<<"got"< remapedImages; remapedImages.reserve(images.size()); @@ -80,7 +81,13 @@ cv::Mat ImagePipeline::process(const Profile profile, std::vector if(remapedImages.size() > 0) { std::sort(remapedImages.begin(), remapedImages.end(), [](const RemapedImage& imgA, const RemapedImage& imgB) -> bool {return imgA.origin.x < imgB.origin.x;}); - cv::Mat output = simpleStich(remapedImages); + cv::Mat output = stich(remapedImages); + + 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) diff --git a/src/main.cpp b/src/main.cpp index 075774e..8ead414 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,10 +23,10 @@ const char* organziation = "UVOS"; const char* application = "UVOS"; const char* version = "UVOS"; -std::vector showCameraSelectionDialog(bool* accepted = nullptr) +std::vector showCameraSelectionDialog(bool* accepted = nullptr, QWidget* w = nullptr) { std::vector ret; - CameraDialog diag(cam::Camera::getAvailableCameras()); + CameraDialog diag(cam::Camera::getAvailableCameras(), w); diag.show(); if(diag.exec() == QDialog::Accepted) @@ -42,13 +42,13 @@ std::vector showCameraSelectionDialog(bool* accepted = return ret; } -void showProfileDialog(Cameras* cameras) +void showProfileDialog(Cameras* cameras, QWidget* w) { qDebug()<<__FUNCTION__; cameras->stop(); cameras->disable(true); std::vector descs = cameras->getCameras(); - ProfileDialog diag(cameras); + ProfileDialog diag(cameras, w); diag.show(); diag.exec(); cameras->disable(false); @@ -56,7 +56,7 @@ void showProfileDialog(Cameras* cameras) int main(int argc, char *argv[]) { - Log::level = Log::WARN; + Log::level = Log::DEBUG; uvosled led; int uvosledRet = uvosled_connect(&led); @@ -99,17 +99,23 @@ int main(int argc, char *argv[]) QObject::connect(&cameras, &Cameras::cameraAdded, &w, &MainWindow::addCamera); QObject::connect(&cameras, &Cameras::cameraRemoved, &w, &MainWindow::removeCamera); + QObject::connect(&cameras, &Cameras::enableCapture, &w, &MainWindow::enableCapture); QObject::connect(&w, &MainWindow::sigCapture, [&cameras](){cameras.start(); cameras.trigger();}); - QObject::connect(&w, &MainWindow::sigChooseCameras, [&cameras]() + QTimer temperatureTimer; + temperatureTimer.setSingleShot(false); + QObject::connect(&temperatureTimer, &QTimer::timeout, [&cameras, &w](){w.setTemperature(cameras.getMeanTemp());}); + temperatureTimer.start(1000); + + QObject::connect(&w, &MainWindow::sigChooseCameras, [&cameras, &w]() { bool accepted; - std::vector descs = showCameraSelectionDialog(&accepted); + std::vector descs = showCameraSelectionDialog(&accepted, &w); if(accepted) cameras.setCameras(descs); }); - QObject::connect(&w, &MainWindow::sigEditProfiles, [&cameras, &w](){showProfileDialog(&cameras); w.refreshProfiles();}); + QObject::connect(&w, &MainWindow::sigEditProfiles, [&cameras, &w](){showProfileDialog(&cameras, &w); w.refreshProfiles();}); QObject::connect(&pipe, &ImagePipeline::sigResult, w.mainImageViewer(), &CvImageViewer::setImage, Qt::QueuedConnection); QObject::connect(&pipe, &ImagePipeline::sigResult, [&w](){w.statusMsg("idle");}); QObject::connect(&pipe, &ImagePipeline::sigInvalidProfile, &w, &MainWindow::profileInconpatible); diff --git a/src/ui/cameralistwidget.cpp b/src/ui/cameralistwidget.cpp index 879cfd1..6042f53 100644 --- a/src/ui/cameralistwidget.cpp +++ b/src/ui/cameralistwidget.cpp @@ -31,9 +31,7 @@ void CameraListWidget::setCameras(const std::vector& d qDebug()<<"cameras: "<(desc_.size())); for(size_t i = 0; i < desc_.size(); ++i) - { setItem(static_cast(i), 0, new QTableWidgetItem((desc_[i].getVendor() + " " + desc_[i].getModel()).c_str())); - } } std::vector CameraListWidget::getSelectedDescriptions() diff --git a/src/ui/cvimageviewer.cpp b/src/ui/cvimageviewer.cpp index d13e5d6..1133582 100644 --- a/src/ui/cvimageviewer.cpp +++ b/src/ui/cvimageviewer.cpp @@ -100,7 +100,6 @@ void CvImageViewer::mousePressEvent(QMouseEvent *event) } else { - sigValue(x, y, 0); } } diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 7f0ec41..2ff4fb5 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -12,7 +12,7 @@ MainWindow::MainWindow(QWidget *parent) , ui(new Ui::MainWindow) { ui->setupUi(this); - ui->statusbar->showMessage("idle"); + ui->statusbar->showMessage("no cameras"); connect(ui->actionQuit, &QAction::triggered, [this](bool checked){(void)checked; close();}); connect(ui->actionCameras, &QAction::triggered, [this](bool checked){(void)checked; sigChooseCameras();}); connect(ui->actionProfile, &QAction::triggered, [this](bool checked){(void)checked; sigEditProfiles();}); @@ -32,6 +32,11 @@ void MainWindow::setImageValue(size_t x, size_t y, double value) ui->lcdNumber->display(value); } +void MainWindow::setTemperature(double temp) +{ + ui->lcdNumber_temp->display(temp); +} + void MainWindow::saveImage() { if(!ui->mainViewer->getImage().data) @@ -59,7 +64,16 @@ void MainWindow::openImage() { cv::Mat image; cv::FileStorage matf(fileName.toStdString(), cv::FileStorage::READ); - matf["image"]>>image; + try + { + matf["image"]>>image; + } + catch(const cv::Exception& ex) + { + qDebug()<statusbar->showMessage(enable ? "idle" : "cameras not ready" ); + ui->pushButtonCapture->setEnabled(enable); +} + void MainWindow::addCamera(std::shared_ptr camera) { viewers_.push_back(new CvImageViewer(this, camera->id())); diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 0f33bd9..f245063 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -36,6 +36,8 @@ public slots: bool setProfile(const QString& profileName); QString getProfileName(); void statusMsg(QString msg); + void enableCapture(bool capture); + void setTemperature(double temp); public: MainWindow(QWidget *parent = nullptr); diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui index 784b7f2..0378a26 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -42,7 +42,7 @@ 0 0 - 278 + 182 483 @@ -74,8 +74,8 @@ 0 0 - 467 - 313 + 563 + 282 @@ -152,6 +152,9 @@ + + false + Capture @@ -180,6 +183,36 @@ + + + + 0 + + + + + true + + + Mean camera temperature [℃] + + + + + + + true + + + 0.000000000000000 + + + 0 + + + + +