Message ID | 20200922100400.30766-7-david.plowman@raspberrypi.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi David, Thank you for the patch. On Tue, Sep 22, 2020 at 11:04:00AM +0100, David Plowman wrote: > This allows the user to request digital zoom by adding, for example, > "-z 0.25,0.25,0.5,0.5" which would give a 2x zoom, still centred in > the middle of the image. > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com> A command line option would make more sense for the cam application I think. In qcam, I would rather like to have the zoom integrated in the UI. Is this something you would be interested in developing, or should I try to appoint a volunteer ? :-) > --- > src/qcam/main.cpp | 3 +++ > src/qcam/main_window.cpp | 20 ++++++++++++++++++++ > src/qcam/main_window.h | 1 + > 3 files changed, 24 insertions(+) > > diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp > index f60d3ce..9f8435d 100644 > --- a/src/qcam/main.cpp > +++ b/src/qcam/main.cpp > @@ -38,6 +38,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[]) > "renderer", ArgumentRequired, "renderer"); > parser.addOption(OptStream, &streamKeyValue, > "Set configuration of a camera stream", "stream", true); > + parser.addOption(OptZoom, OptionString, > + "Specify crop for digital zoom as fractions x,y,width,height e.g. 0.25,0.25,0.5,0.5", > + "zoom", ArgumentRequired, "zoom"); > > OptionsParser::Options options = parser.parse(argc, argv); > if (options.isSet(OptHelp)) > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp > index 985743f..fb54b15 100644 > --- a/src/qcam/main_window.cpp > +++ b/src/qcam/main_window.cpp > @@ -25,6 +25,8 @@ > #include <QtDebug> > > #include <libcamera/camera_manager.h> > +#include <libcamera/control_ids.h> > +#include <libcamera/property_ids.h> > #include <libcamera/version.h> > > #include "dng_writer.h" > @@ -502,6 +504,24 @@ int MainWindow::startCapture() > requests.push_back(request); > } > > + /* Set up digital zoom if it was requested on the command line. */ > + if (options_.isSet(OptZoom)) { > + std::string zoom = options_[OptZoom].toString(); > + float x, y, width, height; > + > + if (sscanf(zoom.c_str(), "%f,%f,%f,%f", &x, &y, &width, &height) == 4) { > + Size sensorArea = camera_->properties().get(properties::SensorOutputSize); > + Rectangle crop(x * sensorArea.width, > + y * sensorArea.height, > + width * sensorArea.width, > + height * sensorArea.height); > + > + requests.front()->controls().set(controls::IspCrop, crop); > + } else { > + qWarning() << "Invalid zoom values - ignoring"; > + } > + } > + > /* Start the title timer and the camera. */ > titleTimer_.start(2000); > frameRateInterval_.start(); > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h > index 5c61a4d..e46eb70 100644 > --- a/src/qcam/main_window.h > +++ b/src/qcam/main_window.h > @@ -39,6 +39,7 @@ enum { > OptHelp = 'h', > OptRenderer = 'r', > OptStream = 's', > + OptZoom = 'z', > }; > > class CaptureRequest
Hi Laurent Thanks for the reply! On Tue, 22 Sep 2020 at 12:31, Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote: > > Hi David, > > Thank you for the patch. > > On Tue, Sep 22, 2020 at 11:04:00AM +0100, David Plowman wrote: > > This allows the user to request digital zoom by adding, for example, > > "-z 0.25,0.25,0.5,0.5" which would give a 2x zoom, still centred in > > the middle of the image. > > > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com> > > A command line option would make more sense for the cam application I > think. In qcam, I would rather like to have the zoom integrated in the > UI. Is this something you would be interested in developing, or should I > try to appoint a volunteer ? :-) With my knowledge of Qt being non-existent you might have more luck with another volunteer. However, it sounds like it might be worthwhile converting my qcam patch into a cam patch instead. I'll wait a couple of days and see if there's any more feedback but then I'll send a v2 with that change. Thanks! David > > > --- > > src/qcam/main.cpp | 3 +++ > > src/qcam/main_window.cpp | 20 ++++++++++++++++++++ > > src/qcam/main_window.h | 1 + > > 3 files changed, 24 insertions(+) > > > > diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp > > index f60d3ce..9f8435d 100644 > > --- a/src/qcam/main.cpp > > +++ b/src/qcam/main.cpp > > @@ -38,6 +38,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[]) > > "renderer", ArgumentRequired, "renderer"); > > parser.addOption(OptStream, &streamKeyValue, > > "Set configuration of a camera stream", "stream", true); > > + parser.addOption(OptZoom, OptionString, > > + "Specify crop for digital zoom as fractions x,y,width,height e.g. 0.25,0.25,0.5,0.5", > > + "zoom", ArgumentRequired, "zoom"); > > > > OptionsParser::Options options = parser.parse(argc, argv); > > if (options.isSet(OptHelp)) > > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp > > index 985743f..fb54b15 100644 > > --- a/src/qcam/main_window.cpp > > +++ b/src/qcam/main_window.cpp > > @@ -25,6 +25,8 @@ > > #include <QtDebug> > > > > #include <libcamera/camera_manager.h> > > +#include <libcamera/control_ids.h> > > +#include <libcamera/property_ids.h> > > #include <libcamera/version.h> > > > > #include "dng_writer.h" > > @@ -502,6 +504,24 @@ int MainWindow::startCapture() > > requests.push_back(request); > > } > > > > + /* Set up digital zoom if it was requested on the command line. */ > > + if (options_.isSet(OptZoom)) { > > + std::string zoom = options_[OptZoom].toString(); > > + float x, y, width, height; > > + > > + if (sscanf(zoom.c_str(), "%f,%f,%f,%f", &x, &y, &width, &height) == 4) { > > + Size sensorArea = camera_->properties().get(properties::SensorOutputSize); > > + Rectangle crop(x * sensorArea.width, > > + y * sensorArea.height, > > + width * sensorArea.width, > > + height * sensorArea.height); > > + > > + requests.front()->controls().set(controls::IspCrop, crop); > > + } else { > > + qWarning() << "Invalid zoom values - ignoring"; > > + } > > + } > > + > > /* Start the title timer and the camera. */ > > titleTimer_.start(2000); > > frameRateInterval_.start(); > > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h > > index 5c61a4d..e46eb70 100644 > > --- a/src/qcam/main_window.h > > +++ b/src/qcam/main_window.h > > @@ -39,6 +39,7 @@ enum { > > OptHelp = 'h', > > OptRenderer = 'r', > > OptStream = 's', > > + OptZoom = 'z', > > }; > > > > class CaptureRequest > > -- > Regards, > > Laurent Pinchart
diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp index f60d3ce..9f8435d 100644 --- a/src/qcam/main.cpp +++ b/src/qcam/main.cpp @@ -38,6 +38,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[]) "renderer", ArgumentRequired, "renderer"); parser.addOption(OptStream, &streamKeyValue, "Set configuration of a camera stream", "stream", true); + parser.addOption(OptZoom, OptionString, + "Specify crop for digital zoom as fractions x,y,width,height e.g. 0.25,0.25,0.5,0.5", + "zoom", ArgumentRequired, "zoom"); OptionsParser::Options options = parser.parse(argc, argv); if (options.isSet(OptHelp)) diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index 985743f..fb54b15 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -25,6 +25,8 @@ #include <QtDebug> #include <libcamera/camera_manager.h> +#include <libcamera/control_ids.h> +#include <libcamera/property_ids.h> #include <libcamera/version.h> #include "dng_writer.h" @@ -502,6 +504,24 @@ int MainWindow::startCapture() requests.push_back(request); } + /* Set up digital zoom if it was requested on the command line. */ + if (options_.isSet(OptZoom)) { + std::string zoom = options_[OptZoom].toString(); + float x, y, width, height; + + if (sscanf(zoom.c_str(), "%f,%f,%f,%f", &x, &y, &width, &height) == 4) { + Size sensorArea = camera_->properties().get(properties::SensorOutputSize); + Rectangle crop(x * sensorArea.width, + y * sensorArea.height, + width * sensorArea.width, + height * sensorArea.height); + + requests.front()->controls().set(controls::IspCrop, crop); + } else { + qWarning() << "Invalid zoom values - ignoring"; + } + } + /* Start the title timer and the camera. */ titleTimer_.start(2000); frameRateInterval_.start(); diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index 5c61a4d..e46eb70 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -39,6 +39,7 @@ enum { OptHelp = 'h', OptRenderer = 'r', OptStream = 's', + OptZoom = 'z', }; class CaptureRequest
This allows the user to request digital zoom by adding, for example, "-z 0.25,0.25,0.5,0.5" which would give a 2x zoom, still centred in the middle of the image. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> --- src/qcam/main.cpp | 3 +++ src/qcam/main_window.cpp | 20 ++++++++++++++++++++ src/qcam/main_window.h | 1 + 3 files changed, 24 insertions(+)