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.cpp
cvmatandqimage.h
andopencv.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)
orCV_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.