PySide(PyQt)与OpenCV图像格式的相互转换

发布于:2024-07-04 ⋅ 阅读:(19) ⋅ 点赞:(0)

PySide和OpenCV在图像格式上的区别:

主要表现在图像数据的存储方式和使用场景上。以下是一些关键区别:

1. 数据结构

PySide:

  • QImage 和 QPixmap 是 PySide 中常用的图像表示形式。
    • QImage:用于直接访问图像的像素数据,适合需要进行图像处理或分析的场景。
    • QPixmap:专为高效地在屏幕上显示图像设计,通常用于绘制操作。

OpenCV:

  • 使用 cv::Mat 作为主要的数据结构来表示图像。
    • cv::Mat:一个多维矩阵,专门为图像处理和计算机视觉设计,能够高效地进行像素操作和矩阵运算。

2. 数据存储方式

QImage:

  • 支持多种图像格式(例如 Format_RGB32Format_ARGB32Format_Grayscale8 等)。
  • 内部数据通常以线性内存存储,可以通过 bits() 方法访问底层的像素数据。

cv::Mat:

  • 数据以连续内存块存储,常见格式包括 CV_8UC3(三通道8位无符号整型,即RGB图像)、CV_8UC1(单通道8位无符号整型,即灰度图像)等。
  • 直接访问和操作矩阵数据十分方便,适用于大量图像处理算法。

3. 使用场景

QImage/QPixmap:

  • 主要用于GUI应用程序中图像的显示和简单处理。
  • 与Qt框架紧密集成,适合构建图形界面和进行基本的图像操作。

cv::Mat:

  • 主要用于图像处理、计算机视觉和机器学习等领域。
  • 提供丰富的图像处理函数库,适合复杂的图像分析和处理任务。

4. 颜色空间

QImage:

  • 可以使用多种颜色空间,如 Format_RGB32 表示每个像素包含32位数据(RGB + Alpha)。
  • 在不同平台上的颜色格式和排列可能有所不同。

cv::Mat:

  • 通常使用BGR颜色空间(而不是常见的RGB),这是OpenCV的默认颜色格式。
  • 颜色空间转换非常灵活,通过 cv2.cvtColor 函数可以方便地进行颜色空间转换。

格式转换 

1. OpenCV转PySide:

def CV2QT(CV_image):
    """转换 OpenCV cv::Mat 到 QImage"""
    img_rgb = cv2.cvtColor(CV_image, cv2.COLOR_BGR2RGB)  # 转换 BGR 到 RGB
    # 转换图像到QT的QImage格式
    img_height, img_width, channels = img_rgb.shape  # 获取形状
    bytes_per_line = channels * img_width  # 每行字节数
    q_img = QImage(img_rgb.data, img_width, img_height, bytes_per_line, QImage.Format_RGB888)  # 转换成QImage格式

    pixmap = QPixmap.fromImage(q_img)  # 转换成QPixmap格式
    return pixmap

2. PySide转OpenCV:

def QT2CV(QT_image):
    """转换 QImage 到 OpenCV cv::Mat"""
    QT_image = QT_image.convertToFormat(QImage.Format.Format_RGB32)
    width = QT_image.width()
    height = QT_image.height()

    ptr = QT_image.bits()
    arr = np.array(ptr).reshape(height, width, 4)  # 复制数据

    # 转换 RGB32 到 RGB
    return cv2.cvtColor(arr, cv2.COLOR_BGRA2BGR)