After convertion QVideoFrame to QImage, the QImage is zoomed and streched
-
Hi all,
I am using Raspberry pi 4 with Raspbian Buster and qt15.12.7.
Now I am using a usb webcam. I use Camera and VideoOutput with a filter.
In the filter I am converting the QVideoFrame to a QImage.
For checking I save the QImage.
The image has 640x480 as expected, but it shows only a cutout (top left corner) of the image.
The image looks like it is zoomed and streched.
The preview of the camera stream in GUI looks good.Any ideas what could be the problem here?
-
Rectangle { id: videoOutput z:99 color: Style.buttonBackground VideoOutput { id: vid source: camera filters: [ camera.filt ] visible: true anchors.fill: parent } } Camera { id: camera deviceId: "/dev/video0" viewfinder.resolution: "640x480" viewfinder.maximumFrameRate: 10 viewfinder.minimumFrameRate: 10 exposure.exposureMode: Camera.ExposureManual exposure.manualAperture: 16 exposure.manualShutterSpeed: 1/100 exposure.manualIso: -1 } MyVideoFilter { id: myFilter }
This is the live stream in the GUI:
And this is the saved image after convertion:
I have to mention that everything has worked fine on the Raspberry pi 3 with Raspbian Stretch.
-
The important part of your code is the
QVideoFrame
toQImage
conversion. -
QByteArray data; QSize size; QVideoFrame::PixelFormat pixelFormat; int bytesPerLine; void copyData(QVideoFrame & frame) { frame.map(QAbstractVideoBuffer::ReadOnly); if(data.size() != frame.mappedBytes()) { data.resize(frame.mappedBytes()); } memcpy(data.data(), frame.bits(), frame.mappedBytes()); size = frame.size(); pixelFormat = frame.pixelFormat(); bytesPerLine = frame.bytesPerLine(); frame.unmap(); } QVideoFrame MyVideoFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags) { Q_UNUSED(surfaceFormat); Q_UNUSED(flags); if(!input || !input->isValid()) return *input; m_filter->m_frame.copyData(*input); m_filter->m_processThread = QtConcurrent::run(this, &MyVideoFilterRunnable::processVideoFrame, m_filter->m_frame); return * input; } void MyVideoFilterRunnable::processVideoFrame(MyVideoFrame &videoFrame) { QImage img((const uchar*)(videoFrame.data.data()), videoFrame.size.width(), videoFrame.size.height(), videoFrame.bytesPerLine, QImage::Format_Indexed8); img.save("/path/img.png"); ... }
-
Since you are copying raw data from the QVideoFrame to the QImage, I think there is format issue.
I guess
QImage::Format_Indexed8
is the wrong format. Have you check the pixel format of the QVideoFrame? -
-
YUV is a color space as is RGB, YUYV is one of the many possible ways to store YUV data like you have RGB, BGR, etc.
-
@Melle_87 said in After convertion QVideoFrame to QImage, the QImage is zoomed and streched:
@SGaist: But what could be the explanation that everything was fine on Raspberry Pi 3 with Raspbian Stretch and now I have problems on Raspberry Pi 4 with Raspbian Buster?
My guess is that the Pi 3 was providing frames in a different format.
-
@Melle_87 said in After convertion QVideoFrame to QImage, the QImage is zoomed and streched:
@SGaist: I want to detect barcodes. Therefore I use ZBar and QZXing.
For both I need a data of a QImage. That is the reason why I have to convert the QVideoFrame to QImage.QZXing is supposed to handle YUYV fine in its video filters : https://github.com/ftylitak/qzxing/blob/master/src/QZXingFilter.cpp#L325
-
@GrecKo: Thank for the link. I tried to register QZXingFilter in main.cpp:
qmlRegisterType<QZXingFilter>("MY.QZXingFilter", 1, 0, "MyQZXingFilter");
Then I importet it in my qml file, instatiated it and assigned to my VideoOutput:
import MY.QZXingFilter 1.0 MyQZXingFilter { id: myBarcodeFilter } My_Camera { id: camera } VideoOutput { id: vid source: camera filters: [ myBarcodeFilter ] }
But now I get some errors.
/opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o: in function `int qmlRegisterType<QZXingFilter>(char const*, int, int, char const*)': /home/m/Builds/build_PY-Raspi_Buster-Debug/../../../x/workspace/gateway-setup/qt-for-raspi4-root-buster-pi3-vc4-tc5/qt5pi/include/QtQml/qqml.h:311: undefined reference to `QZXingFilter::staticMetaObject' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o: in function `QQmlPrivate::QQmlElement<QZXingFilter>::QQmlElement()': /home/m/Builds/build_PY-Raspi_Buster-Debug/../../../x/workspace/gateway-setup/qt-for-raspi4-root-buster-pi3-vc4-tc5/qt5pi/include/QtQml/qqmlprivate.h:103: undefined reference to `QZXingFilter::QZXingFilter(QObject*)' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o: in function `QtPrivate::MetaObjectForType<QZXingFilter*, void>::value()': /home/m/Builds/build_PY-Raspi_Buster-Debug/../../../x/workspace/gateway-setup/qt-for-raspi4-root-buster-pi3-vc4-tc5/qt5pi/include/QtCore/qmetatype.h:1476: undefined reference to `QZXingFilter::staticMetaObject' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o: in function `QMetaTypeIdQObject<QZXingFilter*, 8>::qt_metatype_id()': /home/m/Builds/build_PY-Raspi_Buster-Debug/../../../x/workspace/gateway-setup/qt-for-raspi4-root-buster-pi3-vc4-tc5/qt5pi/include/QtCore/qmetatype.h:1841: undefined reference to `QZXingFilter::staticMetaObject' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o:(.data.rel.ro._ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE[_ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE]+0x8): undefined reference to `QZXingFilter::metaObject() const' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o:(.data.rel.ro._ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE[_ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE]+0xc): undefined reference to `QZXingFilter::qt_metacast(char const*)' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o:(.data.rel.ro._ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE[_ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE]+0x10): undefined reference to `QZXingFilter::qt_metacall(QMetaObject::Call, int, void**)' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o:(.data.rel.ro._ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE[_ZTVN11QQmlPrivate11QQmlElementI12QZXingFilterEE]+0x38): undefined reference to `QZXingFilter::createFilterRunnable()' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o:(.data.rel.ro._ZTIN11QQmlPrivate11QQmlElementI12QZXingFilterEE[_ZTIN11QQmlPrivate11QQmlElementI12QZXingFilterEE]+0x8): undefined reference to `typeinfo for QZXingFilter' /opt/raspi-tools-8.3.0/lib/gcc/arm-linux-gnueabihf/8.3.0/../../../../arm-linux-gnueabihf/bin/ld: main.o: in function `QQmlPrivate::QQmlElement<QZXingFilter>::~QQmlElement()': /home/m/Builds/build_PY-Raspi_Buster-Debug/../../../x/workspace/gateway-setup/qt-for-raspi4-root-buster-pi3-vc4-tc5/qt5pi/include/QtQml/qqmlprivate.h:108: undefined reference to `QZXingFilter::~QZXingFilter()'
Do you know what I am doing wrong?
-
@Melle_87 said in After convertion QVideoFrame to QImage, the QImage is zoomed and streched:
MyQZXingFilter
Is it derived from QObject?