diff --git a/camerapreview.cpp b/camerapreview.cpp index 99d7ed6..8257b03 100644 --- a/camerapreview.cpp +++ b/camerapreview.cpp @@ -14,28 +14,28 @@ CameraPreview::CameraPreview(QWidget *parent):cameraname(""), camera(nullptr), Q QWidget *controls = new QWidget(this); width = new QSpinBox(controls); - width->setSingleStep(4); - width->setMinimum(4); + width->setMinimum(32); width->setMaximum(2048); + width->setSingleStep(32); width->setValue(width->maximum()); connect(width, SIGNAL(textChanged(QString)), SLOT(updateWidth(QString))); height = new QSpinBox(controls); - height->setSingleStep(4); - height->setMinimum(4); + height->setSingleStep(32); + height->setMinimum(32); height->setMaximum(1536); height->setValue(height->maximum()); connect(height, SIGNAL(textChanged(QString)), SLOT(updateHeight(QString))); xoffs = new QSpinBox(controls); - xoffs->setSingleStep(4); + xoffs->setSingleStep(8); xoffs->setMinimum(0); xoffs->setMaximum(2047); xoffs->setValue(0); connect(xoffs, SIGNAL(textChanged(QString)), SLOT(updateXoffs(QString))); yoffs = new QSpinBox(controls); - yoffs->setSingleStep(4); + yoffs->setSingleStep(8); yoffs->setMinimum(0); yoffs->setMaximum(1535); yoffs->setValue(0); @@ -57,12 +57,11 @@ CameraPreview::CameraPreview(QWidget *parent):cameraname(""), camera(nullptr), Q this->layout()->addWidget(controls); //setPrimaryCamera(devicename); qDebug() << "Camera preview constructor"; - takeStill(); } void CameraPreview::setCamera(QString &device){ - qDebug() << "update camera! ";// << device.toStdString(); + qDebug() << "update camera! " << device; cameraname = device; if (camera != nullptr) { qDebug() << "camera is not nullptr! "; @@ -81,7 +80,26 @@ void CameraPreview::setCamera(QString &device){ msgBox.exec(); return; } + int64_t max_height = camera->sensorHeight(); + int64_t max_width = camera->sensorWidth(); + std::cerr << "set spin box values " << max_width << " " << max_height << std::endl; + width->blockSignals(true); + height->blockSignals(true); + xoffs->blockSignals(true); + yoffs->blockSignals(true); + width->setMaximum(max_width); + width->setValue(max_width); + height->setMaximum(max_height); + height->setValue(max_height); + xoffs->setMaximum(max_width - 1); + xoffs->setValue(0); + yoffs->setMaximum(max_height - 1); + yoffs->setValue(0); label->setText(device + " - " + camera->userName()); + width->blockSignals(false); + height->blockSignals(false); + xoffs->blockSignals(false); + yoffs->blockSignals(false); takeStill(); } @@ -89,12 +107,14 @@ void CameraPreview::setCamera(QString &device){ void CameraPreview::takeStill() { qDebug() << "Take Still image!"; if (camera != nullptr && camera->isOpen()) { - MyImage mimg; + ImageSettings s = camera->getImageSettings(); + MyImage mimg(s.width, s.height); bool valid = camera->grabFrame(mimg); if (!valid) { qWarning() << "Grabbing from camera failed!"; return; } + qDebug() << "Grabbed image from camera succeeded!"; QImage img(static_cast(mimg.data()), mimg.width(), mimg.height(), QImage::Format::Format_Grayscale8); QPixmap mpm = QPixmap::fromImage(img); @@ -115,7 +135,7 @@ void CameraPreview::updateWidth(QString s) { // if (xoffs->value() + width->value() > 2048) { // xoffs->setValue(2048 - width->value()); // } - validate(width, xoffs, 2048); + validate(width, xoffs, camera->sensorWidth()); updateROI(); } @@ -123,7 +143,7 @@ void CameraPreview::updateXoffs(QString s) { // if (xoffs->value() + width->value() > 2048) { // width->setValue(2048 - xoffs->value()); // } - validate(xoffs, width, 2048); + validate(xoffs, width, camera->sensorHeight()); updateROI(); } @@ -131,7 +151,7 @@ void CameraPreview::updateHeight(QString s) { // if (height->value() + yoffs->value() > 1536) { // yoffs->setValue(1536 - height->value()); // } - validate(height, yoffs, 1536); + validate(height, yoffs, camera->sensorHeight()); updateROI(); } @@ -139,16 +159,18 @@ void CameraPreview::updateYoffs(QString s) { // if (height->value() + yoffs->value() > 1536) { // height->setValue(1536 - yoffs->value()); // } - validate(yoffs, height, 1536); + validate(yoffs, height, camera->sensorWidth()); updateROI(); } void CameraPreview::validate(QSpinBox *origin, QSpinBox *dest, int limit){ + qDebug() << "validate"; int val = ensureDivbyfour(origin->value()); origin->setValue(val); if (origin->value() + dest->value() > limit) { dest->setValue(limit - origin->value()); } + qDebug() << "validate done"; } int CameraPreview::ensureDivbyfour(int val) { @@ -160,6 +182,7 @@ int CameraPreview::ensureDivbyfour(int val) { } void CameraPreview::updateROI(bool emitSignal) { + qDebug() << "Update roi with signal: " << emitSignal; QImage img = pm.toImage(); double scaling = 800.0 / img.width(); img = img.scaledToWidth(800); @@ -176,20 +199,24 @@ void CameraPreview::updateROI(bool emitSignal) { int rheight = round(height->value() * scaling); qPainter.drawRect(rxoffs, ryoffs, rwidth, rheight); bool bEnd = qPainter.end(); - QPixmap npm = QPixmap::fromImage(img); setImage(npm); if (emitSignal) { emit roiUpdated(xoffs->value(), yoffs->value(), width->value(), height->value()); } + qDebug() << "update ROI done"; } void CameraPreview::setSize(int w, int h) { + qDebug() << "set size " << w << " " << h; width->setValue(w); height->setValue(h); - validate(width, xoffs, 2048); - validate(height, yoffs, 1536); + if (camera != nullptr && camera->isOpen()) { + validate(width, xoffs, camera->sensorWidth()); + validate(height, yoffs, camera->sensorHeight()); + } updateROI(false); + qDebug() << "set size done"; } QString CameraPreview::device(){ @@ -198,12 +225,14 @@ QString CameraPreview::device(){ ROI CameraPreview::getRoi() { ROI r; + uint32_t max_height = camera->sensorHeight(); + uint32_t max_width = camera->sensorWidth(); r.x = xoffs->value(); r.y = yoffs->value(); r.width = width->value(); r.height = height->value(); - r.height = r.height > 1536 ? 1536 - r.y : r.height; - r.width = r.width > 2048 ? 2048 - r.x : r.width; + r.height = r.height > max_height ? max_height - r.y : r.height; + r.width = r.width > max_width ? max_width - r.x : r.width; return r; }