Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to get camera supported resolutions using Qt5?
QtWS25 Last Chance

How to get camera supported resolutions using Qt5?

Scheduled Pinned Locked Moved General and Desktop
23 Posts 5 Posters 17.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • X Offline
    X Offline
    xtingray
    wrote on last edited by
    #1

    Right now, I'm migrating my Qt4 application into Qt5. The next piece of code works like a charm in Qt4, the variable "resolutions" returns the list of resolutions supported by my webcam:
    @
    QList<QByteArray> cameraDevices = QCamera::availableDevices();
    QByteArray cameraDevice = cameraDevices[0];
    QCamera *camera = new QCamera(cameraDevice);
    QCameraImageCapture *imageCapture = new QCameraImageCapture(camera);
    QList<QSize> resolutions = imageCapture->supportedResolutions();
    @

    But when I compile this code using Qt5, I only get an empty list of resolutions :(

    Any hint? Thanks!


    Qt Developer

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      You should add which version of Qt 5 you are using on which OS

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • X Offline
        X Offline
        xtingray
        wrote on last edited by
        #3

        Thanks for the advice!

        I'm using Qt version 5.2.1 from Ubuntu 14.04 (x86_64).

        Note: I'm not using the Qt packages from Ubuntu but the Qt online installer.


        Qt Developer

        1 Reply Last reply
        0
        • A Offline
          A Offline
          andreyc
          wrote on last edited by
          #4

          String
          @
          QCamera *camera = new QCamera(cameraDevice);
          @
          returns camera in "QCamera::UnloadedStatus":http://qt-project.org/doc/qt-5/qcamera.html#Status-enum

          I think you need to "load":http://qt-project.org/doc/qt-5/qcamera.html#load camera before requesting its capabilities.

          1 Reply Last reply
          0
          • X Offline
            X Offline
            xtingray
            wrote on last edited by
            #5

            I tried it again calling the "load()":http://qt-project.org/doc/qt-5/qcamera.html#load method:

            @
            QList<QByteArray> cameraDevices = QCamera::availableDevices();
            QByteArray cameraDevice = cameraDevices[0];
            QCamera *camera = new QCamera(cameraDevice);
            camera->load();
            qDebug() << "Camera status: " << camera->status();
            QCameraImageCapture *imageCapture = new QCameraImageCapture(camera);
            QList<QSize> resolutions = imageCapture->supportedResolutions();
            @

            Console output: *** Camera status: 4 ***

            QCamera::LoadedStatus 4
            The camera is loaded and ready to be configured. This status indicates the camera device is opened and it's possible to query for supported image and video capture settings, like resolution, framerate and codecs.

            And although I get the status 4 (QCamera::LoadedStatus), the list of resolutions is still empty :(

            PS: I made a trivial example using the same code, in case that someone else want to try it and confirm the issue: http://maefloresta.com/portal/files/sample.zip


            Qt Developer

            1 Reply Last reply
            0
            • X Offline
              X Offline
              xtingray
              wrote on last edited by
              #6

              The same issue has been confirmed using Qt 5.3.0 :(


              Qt Developer

              1 Reply Last reply
              0
              • A Offline
                A Offline
                andreyc
                wrote on last edited by
                #7

                I looked into Qt multimedia sources and I've found that supportedResolutions() call depends on a multimedia backend plugin of OS.

                The code bellow (you can put it to the end of your main.cpp from sample.zip) shows how the call imageCapture->supportedResolutions(); is executed. It is not full trace of course, only part that is relevant to supportedResolutions.

                @
                QMediaObject* mediaObject = imageCapture->mediaObject();
                qDebug() << "mediaObject" << mediaObject;
                if (mediaObject) {
                QMediaService* service = mediaObject->service();
                qDebug() << "media service" << service;
                if (service) {
                QImageEncoderControl* encoderControl = qobject_cast<QImageEncoderControl*>(service->requestControl(QImageEncoderControl_iid));
                qDebug() << "encoderControl" << encoderControl;
                if (encoderControl) {
                QImageEncoderSettings settings;
                bool continuous = false;
                qDebug() << "settings null" << settings.isNull();
                QList<QSize> resolutions = encoderControl->supportedResolutions(settings, &continuous);
                qDebug() << "Camera resolution list size: " << resolutions.size();
                qDebug() << "settings null" << settings.isNull();
                qDebug() << "continuous" << continuous;
                }
                }
                }
                @

                For MacOS X 10.9 it shows QImageEncoderControl is null, which means that it is not implemented.
                For GNU/Linux (Ubuntu 14.04) it shows QImageEncoderControl but the list of the resolutions is still empty.

                The systems that have plugins and may support QImageEncoderControl::supportedResolutions are android, qnx (BlackBerry uses it too), directshow (Windows), gstreamer (GNU/Linux)

                1 Reply Last reply
                0
                • X Offline
                  X Offline
                  xtingray
                  wrote on last edited by
                  #8

                  Just for your information... the output of my test from Windows 7 using your code. Same result, no resolutions:

                  Starting C:\tupi\build-sample-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\camera.exe...
                  Camera description: "Webcam C170"
                  Camera status: QCamera::UnavailableStatus
                  Camera resolution list size: 0
                  mediaObject QCamera(0x59e820)
                  media service DSCameraService(0x59a970)
                  encoderControl QObject(0x0)
                  C:\tupi\build-sample-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\camera.exe exited with code 0


                  Qt Developer

                  1 Reply Last reply
                  0
                  • X Offline
                    X Offline
                    xtingray
                    wrote on last edited by
                    #9

                    Today I was running some tests from my Linux system (Ubuntu 14.04 x64). This is my report:

                    1. List of gstreamer dependencies installed:
                      http://www.maefloresta.com/tmp/gstreamer-dependencies.txt

                    2. Using Qt 4.8 and the package qtmobility-dev the piece of code of my first post works perfectly.
                      @
                      QList<QSize> resolutions = imageCapture->supportedResolutions();
                      @
                      I got the list of resolutions for three different cameras I'm using with accurate values.

                    Note: The dependencies required by the package "qtmobility-dev" are:
                    libqtconnectivity1 libqtcontacts1 libqtfeedback1 libqtgallery1 libqtlocation1 libqtmultimediakit1 libqtorganizer1 libqtpublishsubscribe1 libqtsensors1 libqtserviceframework1 libqtsysteminfo1 libqtversit1 libqtversitorganizer1 servicefw

                    1. Using either Qt 5.2.1 or Qt 5.3.0 and removing the package qtmobility-dev the function QCameraImageCapture::supportedResolutions() doesn't work any more.
                      Note: I tried two options: the Qt Ubuntu packages and the Qt online installer.

                    2. I was checking the source code of the package qtmobility-dev running: apt-get source qtmobility-dev and comparing the structure and classes against the Qt 5.2.1/5.3.0 and I got the same code:
                      @
                      QList<QSize> QCameraImageCapture::supportedResolutions(const QImageEncoderSettings &settings, bool *continuous) const
                      {
                      if (continuous)
                      *continuous = false;

                      return d_func()->encoderControl ?
                      d_func()->encoderControl->supportedResolutions(settings, continuous) : QList<QSize>();
                      }
                      @

                    All the Qt versions I checked have the module "plugins/multimedia/gstreamer" included, so the problem shouldn't be there.

                    I tried the same test from MS Windows installing all the directshow compounds and the result is the same: an empty list.

                    So, what happened between Qt 4.8.x and Qt 5.2.x with this feature? Is this feature already working for someone using Qt 5.x?


                    Qt Developer

                    1 Reply Last reply
                    0
                    • X Offline
                      X Offline
                      xtingray
                      wrote on last edited by
                      #10

                      Today I had the chance to test my sample from OSX and I got the same result, the method QCameraImageCapture::supportedResolutions() doesn't work here neither:

                      $ uname -a
                      Darwin MacBook-Pro.local 13.1.0 Darwin Kernel Version 13.1.0: Thu Jan 16 19:40:37 PST 2014; root:xnu-2422.90.20~2/RELEASE_X86_64 x86_64

                      $ qmake -version
                      QMake version 3.0
                      Using Qt version 5.3.0 in /Users/test/Qt5.3.0/5.3/clang_64/lib

                      $ ./camera.app/Contents/MacOS/camera
                      Camera description: "Cámara FaceTime HD (integrada)"
                      Camera status: QCamera::LoadedStatus
                      Camera resolution list size: 0


                      Qt Developer

                      1 Reply Last reply
                      0
                      • X Offline
                        X Offline
                        xtingray
                        wrote on last edited by
                        #11

                        Testing the same example but this time using Qt 5.3.1 from Linux, same result:

                        $ ./camera
                        Camera description: "USB2.0 UVC WebCam"
                        Camera status: QCamera::LoadedStatus
                        CameraBinImageEncoder::supportedResolutions()
                        Camera resolution list size: 0

                        The method supportedResolutions() always returns an empty list :(


                        Qt Developer

                        1 Reply Last reply
                        0
                        • T Offline
                          T Offline
                          tr3w
                          wrote on last edited by
                          #12

                          Surprisingly I couldn't find a bug report about this (for linux)...
                          Now here it is:
                          https://bugreports.qt-project.org/browse/QTBUG-40545

                          Follow, upvote, comment. Make some noise!

                          (There is a bug report for windows, but there it is just not supported...
                          https://bugreports.qt-project.org/browse/QTBUG-32743 )

                          1 Reply Last reply
                          0
                          • X Offline
                            X Offline
                            xtingray
                            wrote on last edited by
                            #13

                            Thanks for the hint... I already voted for it! :)


                            Qt Developer

                            1 Reply Last reply
                            0
                            • yeckelY Offline
                              yeckelY Offline
                              yeckel
                              wrote on last edited by
                              #14

                              It looks like that gstreamer on Linux is not returing any value in: camerabinsession.cpp

                              @ GstCaps *supportedCaps = 0;
                              g_object_get(G_OBJECT(m_camerabin),
                              (mode == QCamera::CaptureStillImage) ?
                              SUPPORTED_IMAGE_CAPTURE_CAPS_PROPERTY : SUPPORTED_VIDEO_CAPTURE_CAPS_PROPERTY,
                              &supportedCaps, NULL);
                              if (!supportedCaps)
                              return res;@

                              I was trying calling gstreamer out of QT and was getting NULL as well. Is it a bug in GStreamer?

                              1 Reply Last reply
                              0
                              • yeckelY Offline
                                yeckelY Offline
                                yeckel
                                wrote on last edited by
                                #15

                                It looks like that gstreamer on Linux is not returing any value in: camerabinsession.cpp

                                @ GstCaps *supportedCaps = 0;
                                g_object_get(G_OBJECT(m_camerabin),
                                (mode == QCamera::CaptureStillImage) ?
                                SUPPORTED_IMAGE_CAPTURE_CAPS_PROPERTY : SUPPORTED_VIDEO_CAPTURE_CAPS_PROPERTY,
                                &supportedCaps, NULL);
                                if (!supportedCaps)
                                return res;@

                                I was trying calling gstreamer out of QT and was getting NULL as well. Is it a bug in GStreamer?

                                1 Reply Last reply
                                0
                                • SGaistS Offline
                                  SGaistS Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #16

                                  Hi,

                                  Either that or the device doesn't return the information. Do you have any other way to retrieve that information on your system ?

                                  Interested in AI ? www.idiap.ch
                                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  1 Reply Last reply
                                  0
                                  • SGaistS Offline
                                    SGaistS Offline
                                    SGaist
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #17

                                    Hi,

                                    Either that or the device doesn't return the information. Do you have any other way to retrieve that information on your system ?

                                    Interested in AI ? www.idiap.ch
                                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                    1 Reply Last reply
                                    0
                                    • yeckelY Offline
                                      yeckelY Offline
                                      yeckel
                                      wrote on last edited by
                                      #18

                                      Well, v4l2 is returning:

                                      @$ v4l2-ctl --list-formats-ext
                                      ioctl: VIDIOC_ENUM_FMT
                                      Index : 0
                                      Type : Video Capture
                                      Pixel Format: 'YUYV'
                                      Name : YUV 4:2:2 (YUYV)
                                      Size: Discrete 640x480
                                      Interval: Discrete 0.033s (30.000 fps)
                                      Interval: Discrete 0.067s (15.000 fps)
                                      Size: Discrete 640x360
                                      Interval: Discrete 0.033s (30.000 fps)
                                      Interval: Discrete 0.067s (15.000 fps)
                                      ...@

                                      The structure GstCaps *supportedCaps from previous code, has 0 length, but it's valid but @gst_caps_is_any(supportedCaps) == true@

                                      1 Reply Last reply
                                      0
                                      • yeckelY Offline
                                        yeckelY Offline
                                        yeckel
                                        wrote on last edited by
                                        #19

                                        Well, v4l2 is returning:

                                        @$ v4l2-ctl --list-formats-ext
                                        ioctl: VIDIOC_ENUM_FMT
                                        Index : 0
                                        Type : Video Capture
                                        Pixel Format: 'YUYV'
                                        Name : YUV 4:2:2 (YUYV)
                                        Size: Discrete 640x480
                                        Interval: Discrete 0.033s (30.000 fps)
                                        Interval: Discrete 0.067s (15.000 fps)
                                        Size: Discrete 640x360
                                        Interval: Discrete 0.033s (30.000 fps)
                                        Interval: Discrete 0.067s (15.000 fps)
                                        ...@

                                        The structure GstCaps *supportedCaps from previous code, has 0 length, but it's valid but @gst_caps_is_any(supportedCaps) == true@

                                        1 Reply Last reply
                                        0
                                        • yeckelY Offline
                                          yeckelY Offline
                                          yeckel
                                          wrote on last edited by
                                          #20

                                          I've digged deeper into GStreamer plugin gstcamerabin2.c, here it's querying for pad capabilities @pad = gst_element_get_static_pad (element, padname);

                                          caps = gst_pad_query_caps (pad, NULL);@ and then the query failing "GstPAd.html":http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html

                                          ...gst_pad_query_caps returns all possible caps a pad can operate with, using the pad's CAPS query function, If the query fails, this function will return filter , if not NULL, otherwise ANY.

                                          And this ANY is what's returned into QT and then returned as empty QList. I thing we should use another gstreamer input element aka v4l2src which is stable. Camerabin2 is marked as unstable and under development.

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved