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.
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étodohvideoFrameChanged
.Para obtener y procesar fotogramas de
QCamera
en QT6, puedes utilizar la claseQCameraImageCapture
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:
En la ranura
processImage
, puedes acceder a los datos de la imagen capturada y procesarlos según sea necesario.Ten en cuenta que para utilizar
QCameraImageCapture
, necesitas incluir el móduloQtMultimediaWidgets
en tu proyecto.