es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

QT6 Utilizando QVideoSink con QCamera para procesar cada cuadro

Estoy revisando el archivo camera.pro de ejemplo qt6 6.2.2 y encontré el siguiente código en la línea siguiente:

m_captureSession.setVideoOutput(ui->viewfinder);

Esta es la forma de enviar los fotogramas al UI.

Sé que se utiliza QVideoSink para capturar cada fotograma y procesarlo.

He reemplazado esta línea con m_captureSession.setVideoSink(&videoSink);

donde videoSink está definido como mi clase:

class MyVideoSink : public QVideoSink
{
    Q_OBJECT
public:
    bool videoframeReady=false;
    MyVideoSink()
    {
        connect(this, &QVideoSink::videoFrameChanged, this, &MyVideoSink::hvideoFrameChanged);
    }
public Q_SLOTS:

void hvideoFrameChanged(const QVideoFrame &frame)
{
    videoframeReady=true;
}

};

hvideoFrameChanged se activa en cada fotograma en la construcción de Windows, pero solo una vez en la aplicación de Android.

¿Qué está mal aquí? ¿Cómo puedo capturar y procesar los fotogramas de QCamera en QT6? No quiero mostrar los fotogramas con ui->viewfinder. Necesito procesar los fotogramas por mí mismo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que la implementación de QVideoSink para Android no admite la recuperación continua de fotogramas. En cambio, solo recupera el primer fotograma y lo pasa al método hvideoFrameChanged.

    Para obtener y procesar fotogramas de QCamera en QT6, puedes utilizar la clase QCameraImageCapture en su lugar. Esta clase te permite capturar fotogramas como imágenes, que luego pueden procesarse según sea necesario.

    Aquí tienes un ejemplo de uso:

    QCamera *camera = new QCamera();
    QCameraImageCapture *imageCapture = new QCameraImageCapture(camera);
    
    // Conecta la señal imageReady a una ranura donde puedas procesar la imagen
    connect(imageCapture, &QCameraImageCapture::imageCaptured, this, &MyClass::processImage);
    
    // Establece el destino de captura en un búfer
    imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
    
    // Inicia la cámara
    camera->start();
    
    // Captura un fotograma
    imageCapture->capture();
    

    En la ranura processImage, puedes acceder a los datos de la imagen capturada y procesarlos según sea necesario.

    void MyClass::processImage(int id, QImage image)
    {
        // Haz algo con la imagen capturada
    }
    

    Ten en cuenta que para utilizar QCameraImageCapture, necesitas incluir el módulo QtMultimediaWidgets en tu proyecto.

Comments are closed.