Qimage Grayscale Format Indexed8 4,4/5 1780 votes

About QtOpenCV

  • QtOpenCV provides some helper functions to converting cv::Mat from/to QImage.

  • QtOpenCV provides a opencv.pri file which can be used to integrate OpenCV2 or newer to qmake-based project.

cv::Mat <> QImage

It was introduced when trying to make Qt display grayscale images with type Indexed8. That didn't work so I just. + QImage::Format qFormat. + bool isDepthImage = false. + // convert grayscale to rgb for display. + unsigned int idx = 0.

  • Download and copy the cvmatandqimage.cppcvmatandqimage.h and opencv.pri to your project's source tree.

  • Then take advantage of the following API to converting data between Cv::Mat and QImage.

  • In addition, two other functions are provided which works more efficient when operating on CV_8UC1, CV_8UC3(R G B)CV_8UC4(R G B A), CV_8UC4(B G R A) or CV_8UC4(A R G B).

OpenCV2 Integration

If your want to use OpenCV in your qmake based project, you can download and put the source files to any directory you wanted,then add following code to your .pro file.

or you can simply add following line to your .pro file:

As you can see, nothing else needed to do for non-windows users.

Notes for Windows User

To make opencv.pri works for your, you need to create an opencv.prf file, then move the .prf file to %QTDIR%/mkspecs/features/.

Method 1: Create and copy the opencv.prf by hand

You can use a textedit to create the .prf file. The contents of .prf file more or less looks like this:

Then you can copy it to %QTDIR%/mkspecs/features/.

Method 2: Take use of the helper script

If you have installed python, the helper script opencv_prf_generator.py can be used to generate and install the opencv.prf file.

Some thing you need to know

Channels order of OpenCV's image which used by highgui module is B G R and B G R A

The manual of OpenCV says that,

  • cv::imwrite()

Only 8-bit (or 16-bit unsigned(CV_16U) in case of PNG,JPEG2000,and TIFF) single-channel or 3-channel(with 'BGR' channel order) images can be saved using this function.

It is possible to store PNG images with an alpha channel using this function. To do this, create 8-bit (or 16-bit) 4-chanel image BGRA, where the alpha channel goes last. Ifmrte 18 for mac.

  • cv::imread()

In the case of color images, the decoded images will have the channels stored in B G R order .

Note: If you don't care opencv_highgui module, you can always use the same channels order as QImage, which will be slightly fast.

Data bytes order of QImage

  • In Little Endian System
  • Ins Big Endian System

How to swap channels?

  • In OpenCV
  • In Qt

Swap r and b channel of QImage

If the depth of the image is 32, the following function can be used too.

Common Image Data Range of OpenCV