Important: Please read the Qt Code of Conduct -

QImage and OpenCV Mat problem

  • Hi all.

    I'm using Windows 10 and Linux 18.04 with Qt 5.12 and OpenCV 4.0.1.
    I have a problem when loading a QImage and then converting it to an OpenCV Mat.
    It seems that QImage has more data in its array than the Mat.

    Qimage: width=1001px, height=1001px, type=QImage::Format_Grayscale, bytesPerLine=1004
    Mat: width=1001px, height=1001px, type=CV_8UC1, bytesPerLine=1001

    This problem does only occur when the image width is odd.

    Does anyone know why and how to solve it?

    The result images are confusing. The pixels are shifted.




  • Lifetime Qt Champion


    IIRC, it will depend on the image format and size. There can be padding involved.

    In any case, it's usually done the other way around: load image with OpenCV, apply processing and move then to QImage.

    What are you currently doing ?

  • Hi,

    currently I am loading a QImage from a file.
    Then I encode it to Base64-Format and insert the Base64-String into an xml-structure.

    This xml is sended through tcp/ip to a server where the server is decoding the Base64-String back to an image. And then I am processing the image with OpenCV.

    My current workaround is to save the QImage to hard disk and load again it with OpenCV. That works.


  • Lifetime Qt Champion

    That might be a silly question but why not directly encode the file content ?

  • @stvokr
    QImage uses a 32-bit alignment, I also had some issues with the bytes:

  • @SGaist
    I will try that, but I need that QImage object directly. It should be possible to display the base64 string directly in a web browser as HTML content.

    Thanks for that.

  • Lifetime Qt Champion

    There's no problem with that but you didn't gave much information about your application so it's not easy to provide recommendations.

  • @SGaist
    I figured out that the main problem is not transferring the image but loading the image with QImage. Even when I just load the image from harddisk the bytesPerLine is 1004 for an 8 bit pixel image with 1001px width. So as already mentioned from @beecksche the 32-bit alignment will prevent the correct direct conversion from QImage to cv::Mat.

  • Lifetime Qt Champion

    Afaics OpenCV::Mat also supports padding. Images are always padded so it would be better to teach OpenCV::Mat about it.

Log in to reply