CvxQtWrap.h
#ifndef OPENCV_CVX_QT_WRAP_2008_05_18_H
#define OPENCV_CVX_QT_WRAP_2008_05_18_H
#include
#include
/**
\file CvxQtWrap.h
\brief Qt和OpenCV接口
\author 柴树杉(chaishushan@gmail.com)
提供了QImage和IplImage之间的转换支持.
*/
/**
\brief QImage复制到IplImage
将qImage复制到pIplImage. 如果pIplImage为NULL的话, 则创建和qImage
大小一致的3通道IPL_DEPTH_8U类型的IplImage图像, 然后复制.
测试代码:
\code
QImage qImage;
if(qImage.load("lena.jpg"))
{
IplImage *image = cvxCopyQImage(qImage);
cvSaveImage("cvxCopyQImage.bmp", image);
}
\endcode
\param qImage 输入图像
\param pIplImage 输出图像
\return 返回输出的IplImage格式图像
*/
IplImage* cvxCopyQImage(const QImage &qImage, IplImage *pIplImage=0);
/**
\brief IplImage复制到QImage
将pIplImage复制到qImage. 如果qImage为空的话, 则调整qImage和
pIplImage大小一致, 然后复制.
测试代码:
\code
IplImage *image = cvLoadImage("lena.jpg", 1);
if(image)
{
QImage qImage;
cvxCopyIplImage(image, qImage);
qImage.save("cvxCopyIplImage.bmp");
}
\endcode
\param pIplImage 输入图像
\param qImage 输出图像
\return 返回输出的QImage图像
*/
QImage& cvxCopyIplImage(const IplImage *pIplImage, QImage &qImage);
#endif // OPENCV_CVX_QT_WRAP_2008_05_18_H
CvxQtWrap.cpp
#include "CvxQtWrap.h"
IplImage *cvxCopyQImage(const QImage &qImage, IplImage *pIplImage)
{
if(qImage.isNull()) return pIplImage;
// 创建IplImage
if(!pIplImage)
{
int w = qImage.width();
int h = qImage.height();
pIplImage = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 3);
if(!pIplImage) return NULL;
}
// 复制像素
int x, y;
for(x = 0; x < pIplImage->width; ++x)
{
for(y = 0; y < pIplImage->height; ++y)
{
QRgb rgb = qImage.pixel(x, y);
cvSet2D(pIplImage, y, x, CV_RGB(qRed(rgb), qGreen(rgb), qBlue(rgb)));
}
}
return pIplImage;
}
QImage& cvxCopyIplImage(const IplImage *pIplImage, QImage &qImage)
{
if(!pIplImage) return qImage;
// 调整qImage的大小
if(qImage.isNull())
{
int w = pIplImage->width;
int h = pIplImage->height;
qImage = QImage(w, h, QImage::Format_RGB32);
}
// 复制像素
int x, y;
for(x = 0; x < pIplImage->width; ++x)
{
for(y = 0; y < pIplImage->height; ++y)
{
CvScalar color = cvGet2D(pIplImage, y, x);
int r = color.val[2];
int g = color.val[1];
int b = color.val[0];
qImage.setPixel(x, y, qRgb(r,g,b));
}
}
return qImage;
}
QImage增加Format_RGB888格式, 每个像素占24bit
http://trolltech.com/developer/resource ... ges-4.4.0/
这个对于IplImage向QImage转换是一个非常重要的功能!
因为我们可以用下面的语句直接从IplImage构造QImage, 避免重复复制数据.
IplImage *img = cvLoadImage("lena.jpg", 1);
QImage qImage(img->imageData, img->width, img->height, img->widthStep, QImage::Format_RGB888);