A camera problem.
-
@jsulm said in A camera problem.:
@jenya7 No, this belongs to C++ basics: if m_camera is a pointer then you have to use -> if it is not a pointer then you have to use dot. So, what is m_camera in YOUR code?
in camera.h
class Camera : public QMainWindow { Q_OBJECT public: Camera(QObject *parent = nullptr); void takeImage(); private slots: void setCamera(const QCameraInfo &cameraInfo); void startCamera(); void stopCamera(); void record(); void pause(); void stop(); void setMuted(bool); void toggleLock(); void displayCaptureError(int, QCameraImageCapture::Error, const QString &errorString); void configureCaptureSettings(); void configureVideoSettings(); void configureImageSettings(); void displayRecorderError(); void displayCameraError(); void updateCameraDevice(QAction *action); void updateCameraState(QCamera::State); void updateCaptureMode(); void updateRecorderState(QMediaRecorder::State state); void setExposureCompensation(int index); void updateRecordTime(); void processCapturedImage(int requestId, const QImage &img); void updateLockStatus(QCamera::LockStatus, QCamera::LockChangeReason); void displayViewfinder(); void displayCapturedImage(); void readyForCapture(bool ready); void imageSaved(int id, const QString &fileName); protected: void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; private: Ui::Camera *ui; QScopedPointer<QCamera> m_camera; QScopedPointer<QCameraImageCapture> m_imageCapture; QScopedPointer<QMediaRecorder> m_mediaRecorder; QImageEncoderSettings m_imageSettings; QAudioEncoderSettings m_audioSettings; QVideoEncoderSettings m_videoSettings; QString m_videoContainerFormat; bool m_isCapturingImage = false; bool m_applicationExiting = false; };
It's a private member initialized after the camera found in a constructor.
Camera::Camera(QObject *parent) : QObject(parent) { //some code if (cameraInfo == QCameraInfo::defaultCamera()) videoDeviceAction->setChecked(true); setCamera(QCameraInfo::defaultCamera()); }
-
@jsulm said in A camera problem.:
@jenya7 OK, now it makes sense. Did you try to set parent on the viewfinder?
That's it - they use the widget int the app. What should I choose as a parent?
-
@jsulm said in A camera problem.:
@jenya7 Do you have any other UI/widgets in your application?
well...I can put one just for debug sake. right now it's a window with a text box for a command line receiving.
I did so
QWidget *viewfinderPage; viewfinderPage = new QWidget(); v_finder = new QCameraViewfinder(viewfinderPage);
and I get the same exception on
viewfinderPage = new QWidget(); -
@jsulm said in A camera problem.:
@jenya7 Do you have any other UI/widgets in your application?
well...I can put one just for debug sake. right now it's a window with a text box for a command line receiving.
I did so
QWidget *viewfinderPage; viewfinderPage = new QWidget(); v_finder = new QCameraViewfinder(viewfinderPage);
and I get the same exception on
viewfinderPage = new QWidget();@jenya7 said in A camera problem.:
and I get the same exception on
viewfinderPage = new QWidget();You get same crash if you instanciate a QWidget?
Then something is really broken in your setup.
Can you build and execute a simple Qt widget application? -
@jenya7 said in A camera problem.:
and I get the same exception on
viewfinderPage = new QWidget();You get same crash if you instanciate a QWidget?
Then something is really broken in your setup.
Can you build and execute a simple Qt widget application?@jsulm said in A camera problem.:
@jenya7 said in A camera problem.:
and I get the same exception on
viewfinderPage = new QWidget();You get same crash if you instanciate a QWidget?
Then something is really broken in your setup.
Can you build and execute a simple Qt widget application?actually viewfinderPage is null pointed. I have to create it. I'll try.
-
well...I added in a main window
QCameraViewfinder *m_viewfinder = new QCameraViewfinder(this);
and then in camera class
camera->setViewfinder(m_viewfinder );
But still get the message - "Image Capture Error: Camera not ready"
I get it on
m_imageCapture->capture();
When I try to go into capture() - I can't - the source unavailable, can not debug it to see why m_imageCapture decides the camera isn't ready. -
According to https://doc.qt.io/qt-5/qcamera.html#State-enum :
In the active state as soon as camera is started the viewfinder displays video frames and the camera is ready for capture.
So capture should not be called right after start.
After calling start, you should asynchronously wait until the state turns to Active before performing any capturing. -
According to https://doc.qt.io/qt-5/qcamera.html#State-enum :
In the active state as soon as camera is started the viewfinder displays video frames and the camera is ready for capture.
So capture should not be called right after start.
After calling start, you should asynchronously wait until the state turns to Active before performing any capturing.@Bonnie said in A camera problem.:
According to https://doc.qt.io/qt-5/qcamera.html#State-enum :
In the active state as soon as camera is started the viewfinder displays video frames and the camera is ready for capture.
So capture should not be called right after start.
After calling start, you should asynchronously wait until the state turns to Active before performing any capturing.so I did
void Camera::takeImage() { m_camera->start(); m_camera->searchAndLock(); while (m_imageCapture->isReadyForCapture() == false) ; m_isCapturingImage = true; m_imageCapture->capture(); m_camera->unlock(); }
it's never ready. never gets out of while.
-
Hi,
Your tight loop does not allow Qt's event loop to run. You should either use an event loop to "block" the execution or properly implement this through signals and slots.
-
Hi,
Your tight loop does not allow Qt's event loop to run. You should either use an event loop to "block" the execution or properly implement this through signals and slots.
@SGaist said in A camera problem.:
Hi,
Your tight loop does not allow Qt's event loop to run. You should either use an event loop to "block" the execution or properly implement this through signals and slots.
OK. Did so
connect(m_imageCapture.data(), &QCameraImageCapture::isReadyForCapture, this, &Camera::IsReadyForCapture); void Camera::takeImage() { m_camera->start(); m_camera->searchAndLock(); // while (m_imageCapture->isReadyForCapture() == false) ; //m_isCapturingImage = true; //m_imageCapture->capture(); //m_camera->unlock(); } void Camera::IsReadyForCapture() { m_isCapturingImage = true; m_imageCapture->capture(); m_camera->unlock(); }
It never happens.
-
@SGaist said in A camera problem.:
Hi,
Your tight loop does not allow Qt's event loop to run. You should either use an event loop to "block" the execution or properly implement this through signals and slots.
OK. Did so
connect(m_imageCapture.data(), &QCameraImageCapture::isReadyForCapture, this, &Camera::IsReadyForCapture); void Camera::takeImage() { m_camera->start(); m_camera->searchAndLock(); // while (m_imageCapture->isReadyForCapture() == false) ; //m_isCapturingImage = true; //m_imageCapture->capture(); //m_camera->unlock(); } void Camera::IsReadyForCapture() { m_isCapturingImage = true; m_imageCapture->capture(); m_camera->unlock(); }
It never happens.
@jenya7 said in A camera problem.:
connect(m_imageCapture.data(), &QCameraImageCapture::isReadyForCapture, this, &Camera::IsReadyForCapture);
Did this go through without complaint? I am "surprised", as
QCameraImageCapture::isReadyForCapture()
is not a signal, would have thoughtconnect()
would barf on that.... Try using void QCameraImageCapture::readyForCaptureChanged(bool ready) signal? -
@jenya7 said in A camera problem.:
connect(m_imageCapture.data(), &QCameraImageCapture::isReadyForCapture, this, &Camera::IsReadyForCapture);
Did this go through without complaint? I am "surprised", as
QCameraImageCapture::isReadyForCapture()
is not a signal, would have thoughtconnect()
would barf on that.... Try using void QCameraImageCapture::readyForCaptureChanged(bool ready) signal?@JonB said in A camera problem.:
@jenya7 said in A camera problem.:
connect(m_imageCapture.data(), &QCameraImageCapture::isReadyForCapture, this, &Camera::IsReadyForCapture);
Did this go through without complaint? I am "surprised", as
QCameraImageCapture::isReadyForCapture()
is not a signal, would have thoughtconnect()
would barf on that.... Try using void QCameraImageCapture::readyForCaptureChanged(bool ready) signal?did so
connect(m_imageCapture.data(), &QCameraImageCapture::readyForCaptureChanged, this, &Camera::ReadyForCaptureChanged); void Camera::takeImage() { m_camera->start(); m_camera->searchAndLock(); } void Camera::ReadyForCaptureChanged(bool ready) { m_isCapturingImage = true; m_imageCapture->capture(); m_camera->unlock(); }
never get into ReadyForCaptureChanged
-
@JonB said in A camera problem.:
@jenya7 said in A camera problem.:
connect(m_imageCapture.data(), &QCameraImageCapture::isReadyForCapture, this, &Camera::IsReadyForCapture);
Did this go through without complaint? I am "surprised", as
QCameraImageCapture::isReadyForCapture()
is not a signal, would have thoughtconnect()
would barf on that.... Try using void QCameraImageCapture::readyForCaptureChanged(bool ready) signal?did so
connect(m_imageCapture.data(), &QCameraImageCapture::readyForCaptureChanged, this, &Camera::ReadyForCaptureChanged); void Camera::takeImage() { m_camera->start(); m_camera->searchAndLock(); } void Camera::ReadyForCaptureChanged(bool ready) { m_isCapturingImage = true; m_imageCapture->capture(); m_camera->unlock(); }
never get into ReadyForCaptureChanged
@jenya7 said in A camera problem.:
never get into ReadyForCaptureChanged
Sure? How did you verify that?
-
@jenya7 said in A camera problem.:
never get into ReadyForCaptureChanged
Sure? How did you verify that?
@jsulm said in A camera problem.:
@jenya7 said in A camera problem.:
never get into ReadyForCaptureChanged
Sure? How did you verify that?
I set a break point inside. I see it goes into takeImage but never gets to ReadyForCaptureChanged
Now I don't get any errors but it prints
Starting camera without viewfinder available
Is it OK? -
@jsulm said in A camera problem.:
@jenya7 said in A camera problem.:
never get into ReadyForCaptureChanged
Sure? How did you verify that?
I set a break point inside. I see it goes into takeImage but never gets to ReadyForCaptureChanged
Now I don't get any errors but it prints
Starting camera without viewfinder available
Is it OK? -
@jsulm said in A camera problem.:
@jenya7 said in A camera problem.:
never get into ReadyForCaptureChanged
Sure? How did you verify that?
I set a break point inside. I see it goes into takeImage but never gets to ReadyForCaptureChanged
Now I don't get any errors but it prints
Starting camera without viewfinder available
Is it OK? -
@jenya7
maybe its a typical object lifetime problem.where does your
Camera
instance exist/live ? -
@J-Hilk said in A camera problem.:
@jenya7
maybe its a typical object lifetime problem.where does your
Camera
instance exist/live ?It's a global object. I call it's methods from a command line parser object.
-
@jenya7
Just to make sure, what happens in your code after you call yourtakeImage()
? Do you allow the main event loop to run, or do you have other code which does not?@JonB said in A camera problem.:
@jenya7
Just to make sure, what happens in your code after you call yourtakeImage()
? Do you allow the main event loop to run, or do you have other code which does not?well..I guess it's running, cause my command lines parser reacts and process my commands.