OpenCV与QT图片格式转换实用函数集

需积分: 35 2 下载量 191 浏览量 更新于2024-10-28 收藏 2KB ZIP 举报
资源摘要信息:"OpenCV与QT开发时一些转换函数.zip" OpenCV与QT是两个强大的库,在图像处理与图形用户界面(GUI)开发领域中具有广泛的应用。在使用OpenCV进行图像处理和使用QT构建用户界面时,经常需要在两者之间进行图像数据类型的转换。以下将详细解释在标题中提到的转换函数,并解释它们的实现和使用场景。 (1) 将QImage图片转为OpenCV的IplImage格式 在OpenCV中,图像通常以IplImage指针的形式来处理。要将QT中的QImage对象转换为IplImage格式,可以创建一个对应的函数。函数基本的实现方式如下: ```cpp IplImage* Widget::QImage_to_IplImage(const QImage * qImage) { uchar *data = qImage->bits(); int depth = qImage->depth() == 32 ? 24 : qImage->depth(); int channels = depth / 8; IplImage *ipl = cvCreateImage(cvSize(qImage->width(), qImage->height()), IPL_DEPTH_8U, channels); memcpy(ipl->imageData, data, qImage->byteCount()); return ipl; } ``` 此函数将QImage数据复制到一个新创建的IplImage对象中,以便在OpenCV函数中使用。 (2) 将OpenCV的图片转为QImage格式 与转换过程相反,可以将OpenCV的IplImage格式转换为QImage格式,以便在QT界面中显示。函数实现如下: ```cpp QImage *Widget::IplImage_to_QImage(IplImage *img) { int depth = img->nChannels * 8; QImage qimg(img->width, img->height, QImage::Format_ARGB32); uchar *src = (uchar*)img->imageData; uchar *dst = (uchar*)qimg.bits(); int step = img->widthStep; for (int y = 0; y < img->height; y++, src += step, dst += qimg.bytesPerLine()) { for (int x = 0; x < img->width * img->nChannels; x++) { dst[x * 4] = src[x]; // OpenCV uses BGR and Qt uses RGB dst[x * 4 + 1] = src[x + 1]; dst[x * 4 + 2] = src[x + 2]; dst[x * 4 + 3] = 255; // Opaque } } return new QImage(qimg); } ``` 这里需要注意的是OpenCV默认采用BGR格式,而QT使用RGB格式,因此在转换过程中需要将BGR转换为RGB。 (3) 将QImage图片转为Mat格式 对于图像处理操作,更推荐将QImage转换为OpenCV的Mat格式,因为它提供了更丰富的图像处理功能。实现转换的函数可能如下: ```cpp Mat Widget::QImage_to_cvMat(QImage image) { Mat mat(image.height(), image.width(), CV_8UC3, image.bits(), image.bytesPerLine()); return mat.clone(); // 返回clone以避免在QImage析构时失效 } ``` (4) 将Mat图片转为QImage格式 处理完图像后,可能需要将Mat格式的图像转换回QImage格式以在QT界面中显示。实现如下: ```cpp QImage Widget::Mat_to_QImage(const Mat& InputMat) { if (InputMat.empty()) { return QImage(); } if (InputMat.type() != CV_8UC3 && InputMat.type() != CV_8UC1) { return QImage(); } QImage qimage; if (InputMat.type() == CV_8UC3) { qimage = QImage(InputMat.data, InputMat.cols, InputMat.rows, InputMat.step, QImage::Format_RGB888).rgbSwapped(); } else { qimage = QImage(InputMat.data, InputMat.cols, InputMat.rows, InputMat.step, QImage::Format_Grayscale8); } return qimage.copy(); } ``` 注意,同样需要处理BGR到RGB的颜色转换以及确保图像的深度。 (5) QLabel显示函数 为了在QT应用程序中的QLabel组件上显示图像,可以编写一个辅助函数: ```cpp void Widget::show_face(IplImage* img) { QImage *qimg = IplImage_to_QImage(img); QLabel *label = new QLabel; QPixmap pixmap = QPixmap::fromImage(*qimg); label->setPixmap(pixmap.scaled(label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); delete qimg; // 注意不要忘记释放分配的QImage资源 } ``` 在这里,IplImage转为QImage之后,通过QPixmap对象来在QLabel上显示。 通过这些转换函数,开发者可以方便地在OpenCV和QT之间进行图像数据的传递和处理,使得在进行复杂的图像处理任务时,能够利用QT的友好界面为用户提供实时的可视化反馈。