【PyQt】QPixmap与numpy.array互转

这里给出QPixmapnumpy.ndarray的两条转换(一个是使用PIL.Image而另一个不用),
以及numpy.ndarrayQPixmap两条转换(同样也是用不用PIL.Image的区别)。



代码+运行结果:

from PyQt5.QtCore import QPoint,QRect,Qt
from PyQt5.QtWidgets import QLabel
from PyQt5.QtGui import QPixmap,QImageimport numpy as np
from cv2 import cv2
import sys
from PyQt5.QtWidgets import QApplicationdef ToArray_1(pix):#pix是RGBA四通道QPixmap。额外使用PIL.Image模块#忘了是哪里看到的,然后翻历史记录死活找不到,作罢from PIL import ImagepImg=Image.fromqpixmap(pix)arr=np.array(pImg)arr=cv2.cvtColor(arr,cv2.COLOR_RGBA2BGRA)return arrdef ToArray_2(pix):#pix是RGBA四通道QPixmap。不使用PIL.Image模块#https://deepinout.com/numpy/numpy-questions/700_numpy_qimage_to_numpy_array_using_pyside.html#ftoc-heading-3h,w=pix.height(),pix.width()buffer = QImage(pix).constBits()buffer.setsize(h*w*4)arr = np.frombuffer(buffer, dtype=np.uint8).reshape((h,w,4))return arr.copy()def ToPixmap_1(arr):#arr对应四通道图片。额外使用PIL.Image模块#https://blog.csdn.net/ielcome2016/article/details/105798279from PIL import Imagearr=cv2.cvtColor(arr,cv2.COLOR_RGBA2BGRA)return Image.fromarray(arr).toqpixmap()def ToPixmap_2(arr):#arr对应四通道图片。不使用PIL.Image模块#https://blog.csdn.net/comedate/article/details/121259033#https://blog.csdn.net/weixin_44431795/article/details/122016214arr=cv2.cvtColor(arr,cv2.COLOR_RGBA2BGRA)img=QImage(arr.data, arr.shape[1], arr.shape[0], arr.shape[1]*4, QImage.Format_RGBA8888)return QPixmap(img)def pixShow(pix,title):lb=QLabel()lb.setPixmap(pix)lb.setWindowTitle(title)lb.show()return lbif __name__=='__main__':app = QApplication(sys.argv)wid_0=QLabel("ABCDE")wid_0.setStyleSheet("font-size:150px ; background-color:#FF0000")wid_0.setWindowTitle('Source')grab=wid_0.grab()#grab抓出的图是4通道的cv2.imshow('ToArray_1',ToArray_1(grab))cv2.imshow('ToArray_2',ToArray_2(grab))wid_1=pixShow(ToPixmap_1(ToArray_1(grab)),"ToPixmap_1")wid_2=pixShow(ToPixmap_2(ToArray_1(grab)),"ToPixmap_2")wid_0.show()sys.exit(app.exec())

运行结果


补充:

  1. 上面代码中均是RGBA四通道图片的操作(因为QWidget.grab()抓出来的图是4通不是3通的),有其他应用场景的需要自己调整;
  2. 如果出现彩图变色问题可以尝试使用arr=cv2.cvtColor(arr,cv2.COLOR_RGBA2BGRA)np.array对象进行换色调整。简单查了下貌似是历史遗留问题,背锅侠是openCV

新补充:

  1. 上面函数ToArray_2中,返回的arr必须copy()。别问,问就是一个多小时的黑盒debug。copy的原因是要脱离局部变量buffer的约束(不然就会重复体验到怪异的程序异常+程序崩溃,C语言访问野指针导致程序崩溃的经历已经太多了


小小声

不知道是受了什么影响,对PIL.Image并没什么好感,没记错的话是因为自己曾测试过发现这玩意儿效率很低的来着(所以才尽量绕着走


参考:

  • QPixmap转np.array(无PIL.Image):https://deepinout.com/numpy/numpy-questions/700_numpy_qimage_to_numpy_array_using_pyside.html#ftoc-heading-3
  • np.array转QPixmap:https://blog.csdn.net/ielcome2016/article/details/105798279
  • np.array转QPixmap(无PIL.Image):https://blog.csdn.net/comedate/article/details/121259033
  • np.array转QPixmap(无PIL.Image):https://blog.csdn.net/weixin_44431795/article/details/122016214
  • 为什么OpenCV使用BGR而非RGB格式:https://blog.csdn.net/sgchi/article/details/104475033
  • 为什么openCV使用BRG模式读入图像:https://www.zhihu.com/question/37253195

未经个人同意不得私自转载,本文发布于CSDN:https://blog.csdn.net/weixin_44733774/article/details/134578487

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234193.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程05

前言 前面我们说到了死锁以及线程可见性的问题 我们将线程可见性主要归结于是JVM自身的一个bug 一个线程写一个线程读 会将一直不变的变量优化到直接从寄存器中读取,而不是缓存等读取,因为这样我们就设置了使用volatile关键字使得用到这个变量的时候必须从内存中读取数据 死锁主…

vscode集成git

1、首先电脑要安装git 打开git官网地址:Git进行下载,如下图界面: 如图片中描述:一般进入官网后会识别电脑对应系统(识别出了我的电脑是Windows系统 。如果未识别到电脑系统,可在左侧选择自己电脑对应的系统…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法,可以用于检测图像中的人行道-斑马线。在目标检测领域,YOLOv5通过结合多种技术手段,包括使用Mosaic数据增强操作、自适应锚框计算与…

方差分析(F检验)用于特征选择的Python实现

方差分析(F检验)又称ANOVA,方差齐性检验,是一种用来捕捉每个特征变量与响应变量之间线性关系的过滤方法,实现路径是针对两个及两个以上分组的样本均值进行差异显著性检验,基本思想是将不同分组的样本均值之…

基于 Gin 的 HTTP 代理 Demo(2)

一周后勘误: 我这里实现的严格来说还是 HTTP 代理,只不过是通过隧道的方式传输非 HTTP 的流量,这里是 HTTPS 流量。尽管它可以传输 HTTPS 流量,它也不算是 HTTPS 代理。 上次写了 基于 Gin 的 HTTP 代理 Demo 之后,对…

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统 概述 在前述章节我们讲述了在网页端控制多个 GPIO 的案例。当程序开始变得复杂,让一些功能“自动起来”是一个好的选择。 在前面的示例中,我们需要在后端为每个前端代码的 URL 指定一个对…

Maven——使用Nexus创建私服

私服不是Maven的核心概念,它仅仅是一种衍生出来的特殊的Maven仓库。通过建立自己的私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven。 有三种专门的Maven仓库管理软件可以用来帮助大家建立…

Redis基础系列-安装Redis

Redis基础系列-安装Redis 文章目录 Redis基础系列-安装Redis1. 环境要求2. 下载redis3. 安装4. 配置5 参考与感谢 1. 环境要求 (安装C语言编译环境)redis是用C语言开发的,所以需要安装C语言编译环境,中途可能会出现询问你是否需要可以安装&a…

VS Code C++可视化调试配置Natvis,查看Qt、STL变量内容

VS Code C可视化调试配置Natvis 使用GlobalVisualizersDirectory Windows下 C:\Users\YourName\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAdapters\vsdbg\bin\Visualizers\Linux下 ~\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAd…

SS6850H16V/1A 两通道 H 桥驱动芯片(适合 12V 系统产品的电机驱动)

SS6850H 是一款 2 通道 H 桥驱动芯片。 最适合 12V 系统产品的电机驱动。芯片每个 H 桥可提供最大峰值电流 1A 和均方根电流 0.7A(在 12V 和 Ta 25C 适当散热条件下),可以驱动两台直流电 机,一台并联直流电机,也可以驱动步进电机&#xff0c…

替代升级虚拟化 | ZStack Cloud云平台助力中节能镇江公司核心业务上云

数字经济正加速推动各行各业的高质量升级发展,云计算是数字经济的核心底层基础设施。作为云基础软件企业,云轴科技ZStack 坚持自主创新,自研架构,产品矩阵可全面覆盖数据中心云基础设施,针对虚拟化资源实现纳管、替代和…

IDEA断点实用小技巧

IDEA断点实用小技巧 1. 多线程调试2. 断点修改变量值3. 断点条件设置4. 回退断点5. 中断Debug6. 计算表达式 1. 多线程调试 背景:默认情况下,IDEA断点时会阻塞所有请求,此时外部想再发送一个请求也会被阻塞,如图所示,…