IplImage与Qimage之间转换
来源:互联网 发布:张孝祥java百度网盘 编辑:程序博客网 时间:2024/05/23 02:00
IplImageToQImage.h
//IplImageToQImage.h#ifndef QTIPL_H#define QTIPL_H#include <iostream>#include <cstring>#include <qimage.h>#include "cv.h"#include <QVector>using std::string;using std::iostream;//const int QImage_IgnoreEndian = 2;void IplImageToQImage(const IplImage * iplImage,QImage *qimage,uchar *qImageBuffer,double mini=0.0, double maxi=0.0);void QImageToIplImage(const QImage * qImage,IplImage *charIplImageBuffer);#endif/////////////////////////IplImageToQImage.cpp
//-------------------------------------------------------------------------//C++/*IplImageToQImage.cpp** Creation : 23th april 2003* last modified : 2017.07.12* Author(s) : chen** Contents: -Interface between qt Images and openCV Images**///#include <stdint>#include "IplImageToQImage.h"inline int align(int size, int align){ return (size + align - 1) & -align;}void QImageToIplImage(const QImage * qImage,IplImage *charIplImageBuffer){ int width = qImage->width(); int height = qImage->height(); for (int y = 0; y < height; ++y) { unsigned char* charTemp=(unsigned char*)(charIplImageBuffer->imageData+y*charIplImageBuffer->widthStep); for (int x = 0; x < width; ++x) { charTemp[3*x+0] = (unsigned char) qBlue(qImage->pixel(x, y));//取B通道数据 charTemp[3*x+1] = (unsigned char) qGreen(qImage->pixel(x, y));//取G通道数据 charTemp[3*x+2] = (unsigned char) qRed(qImage->pixel(x, y));//取R通道数据 } }}void IplImageToQImage(const IplImage * iplImage,QImage *qimage,uchar *qImageBuffer,double mini, double maxi){// uchar *qImageBuffer = NULL; int width = iplImage->width;/* Note here that OpenCV image is stored so that each lined is32-bits aligned thus* explaining the necessity to "skip" the few last bytes of eachline of OpenCV image buffer.*/ int widthStep = iplImage->widthStep; int height = iplImage->height; switch (iplImage->depth) { case IPL_DEPTH_8U: if (iplImage->nChannels == 1) { /* OpenCV image is stored with one byte grey pixel. We convert it to an 8 bit depth QImage. */ uchar *QImagePtr = qImageBuffer; const uchar *iplImagePtr = (const uchar *) iplImage->imageData; for (int y = 0; y < height; y++) { // Copy line by line memcpy(QImagePtr, iplImagePtr, width); QImagePtr += width; iplImagePtr += widthStep; } } else if (iplImage->nChannels == 3) { /* OpenCV image is stored with 3 byte color pixels (3 channels). We convert it to a 32 bit depth QImage. */ uchar *QImagePtr = qImageBuffer; const uchar *iplImagePtr = (const uchar *) iplImage->imageData; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // We cannot help but copy manually. QImagePtr[0] = iplImagePtr[0]; QImagePtr[1] = iplImagePtr[1]; QImagePtr[2] = iplImagePtr[2]; QImagePtr[3] = 0; QImagePtr += 4; iplImagePtr += 3; } iplImagePtr += widthStep-3*width; } } else { qDebug("IplImageToQImage: image format is not supported : depth=8U and %d channels\n", iplImage->nChannels); } break; case IPL_DEPTH_16U: if (iplImage->nChannels == 1) { /* OpenCV image is stored with 2 bytes grey pixel. We convert it to an 8 bit depth QImage. */ uchar *QImagePtr = qImageBuffer; const unsigned int *iplImagePtr = (const unsigned int *)iplImage->imageData; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // We take only the highest part of the 16 bit value. It is //similar to dividing by 256. *QImagePtr++ = ((*iplImagePtr++) >> 8); } iplImagePtr += widthStep/sizeof(unsigned int)-width; } } else { qDebug("IplImageToQImage: image format is not supported : depth=16U and %d channels\n", iplImage->nChannels); } break; case IPL_DEPTH_32F: if (iplImage->nChannels == 1) { /* OpenCV image is stored with float (4 bytes) grey pixel. We convert it to an 8 bit depth QImage. */ uchar *QImagePtr = qImageBuffer; const float *iplImagePtr = (const float *) iplImage->imageData; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uchar p; float pf = 255 * ((*iplImagePtr++) - mini) / (maxi - mini); if (pf < 0) p = 0; else if (pf > 255) p = 255; else p = (uchar) pf; *QImagePtr++ = p; } iplImagePtr += widthStep/sizeof(float)-width; } } else { qDebug("IplImageToQImage: image format is not supported : depth=32F and %d channels\n", iplImage->nChannels); } break; case IPL_DEPTH_64F: if (iplImage->nChannels == 1) { /* OpenCV image is stored with double (8 bytes) grey pixel. We convert it to an 8 bit depth QImage. */ uchar *QImagePtr = qImageBuffer; const double *iplImagePtr = (const double *) iplImage->imageData; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uchar p; double pf = 255 * ((*iplImagePtr++) - mini) / (maxi - mini); if (pf < 0) p = 0; else if (pf > 255) p = 255; else p = (uchar) pf; *QImagePtr++ = p; } iplImagePtr += widthStep/sizeof(double)-width; } } else { qDebug("IplImageToQImage: image format is not supported : depth=64F and %d channels\n", iplImage->nChannels); } break; default: qDebug("IplImageToQImage: image format is not supported : depth=%d and %d channels\n", iplImage->depth, iplImage->nChannels); }//end of switch QImage *qImage; qImage=qimage; QVector<QRgb> vcolorTable; if (iplImage->nChannels == 1) { // We should check who is going to destroy this allocation. QRgb *colorTable = new QRgb[256]; for (int i = 0; i < 256; i++) { colorTable[i] = qRgb(i, i, i); vcolorTable[i] = colorTable[i]; } delete colorTable; qImage->setColorTable(vcolorTable); } else { }}
阅读全文
0 0
- IplImage与Qimage之间转换
- QImage与IplImage之间的转换
- QImage与IplImage之间转换的实现
- QImage和IplImage之间转换
- IplImage与QImage之间相互转换的问题
- QImage 和 IplImage 之间转换问题
- QImage 和 IplImage 之间转换问题
- QImage 和 IplImage 之间转换问题 .
- QImage 和 IplImage 之间转换问题
- IplImage *,Mat,QImage之间的转换
- CvMat IplImage QImage 转换
- 关于QImage和IplImage之间转换的实现
- OpenCv:IplImage,Mat和Qt:QImage之间的快速转换
- 关于QImage和IplImage之间转换的实现 .
- 关于QImage和IplImage之间转换的实现
- 关于QImage和IplImage之间转换的实现
- 关于QImage和IplImage之间转换的实现
- 关于QImage和IplImage之间转换的实现
- 有return的情况下try catch finally的执行顺序
- 词向量源码解析:(5.12)ngram2vec源码解析小结
- oracle创建用户并赋权
- hive udf&udaf开发
- Spark map-side-join 关联优化
- IplImage与Qimage之间转换
- JDBC知识(一)
- C++复习Pointers
- Datalab-handout数据表示实验
- 关于网站改版注意的网站优化问题
- codeforces 582A GCD Table
- [Linux] Linux之TCPIP内核参数优化
- Adb
- 定点数、浮点数类型运算的说明