python pyqt5 把qlabel里的图像用CV2处理
时间: 2023-07-27 19:17:41 浏览: 163
在 PyQt5 中,可以使用 QLabel 显示图像,同时使用 OpenCV (cv2) 对图像进行处理。具体步骤如下:
1. 将 QLabel 中的图像转换成 OpenCV 中的图像格式:
```python
from PyQt5.QtGui import QPixmap
import numpy as np
# 获取 QLabel 中的图像
pixmap = label.pixmap()
qImg = pixmap.toImage()
# 将 QImage 转换成 numpy 数组
height, width, channel = qImg.height(), qImg.width(), qImg.bytesPerLine()
qImg = qImg.convertToFormat(QImage.Format_RGB888)
ptr = qImg.constBits()
arr = np.array(ptr).reshape(height, width, 3) # 转换成 3 通道的 numpy 数组
img = cv2.cvtColor(arr, cv2.COLOR_RGB2BGR) # 转换成 BGR 格式的图像
```
2. 对图像进行 OpenCV 处理:
```python
# 进行处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
```
3. 将处理后的图像转换成 QPixmap 格式,显示在 QLabel 中:
```python
# 将处理后的图像转换成 QImage 格式
qImg = QImage(blur.data, blur.shape[1], blur.shape[0], QImage.Format_Grayscale8)
# 将 QImage 转换成 QPixmap 格式
pixmap = QPixmap.fromImage(qImg)
# 显示在 QLabel 中
label.setPixmap(pixmap)
```
完整代码如下:
```python
import cv2
import numpy as np
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QLabel
# 获取 QLabel 中的图像
pixmap = label.pixmap()
qImg = pixmap.toImage()
# 将 QImage 转换成 numpy 数组
height, width, channel = qImg.height(), qImg.width(), qImg.bytesPerLine()
qImg = qImg.convertToFormat(QImage.Format_RGB888)
ptr = qImg.constBits()
arr = np.array(ptr).reshape(height, width, 3) # 转换成 3 通道的 numpy 数组
img = cv2.cvtColor(arr, cv2.COLOR_RGB2BGR) # 转换成 BGR 格式的图像
# 进行处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 将处理后的图像转换成 QImage 格式
qImg = QImage(blur.data, blur.shape[1], blur.shape[0], QImage.Format_Grayscale8)
# 将 QImage 转换成 QPixmap 格式
pixmap = QPixmap.fromImage(qImg)
# 显示在 QLabel 中
label.setPixmap(pixmap)
```
注意,由于 OpenCV 和 PyQT5 都使用了 BGR 格式,因此在将图像从 QLabel 转换成 numpy 数组时,需要先将 RGB 格式的 QImage 转换成 BGR 格式的图像。另外,在将处理后的图像转换成 QImage 格式时,需要使用 `QImage.Format_Grayscale8` 格式,否则会出现图像颜色异常的问题。
阅读全文