0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用图像处理库OpenCV从摄像头获取数据并在PyQt5上显示出来

全志在线 来源:全志在线 2024-01-05 17:32 次阅读

OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据,在某些情况下,尽管OpenCV可以显示窗口,但PyQt5可能更适合用于创建复杂的交互式应用程序,而自带GPU的H618就成为了这些图像显示的最佳载体。

本文将实现的功能是使用图像处理库OpenCV从摄像头获取数据,缩放后从PyQt5的窗口中显示出来。

78f0162e-abac-11ee-8b88-92fbcf53809c.png

创建pyqt5窗口

这里在电脑上使用designer软件,创建一个Main Window类型窗体。从左边组件栏中拖出一个label放到窗口中间。

点一下放在窗口中的label,在软件右下角的属性编辑器里可以设置很多东西,这里就不细介绍了。这里我是设置了QFrame启用了边框,QLabel中的texte属性控制显示的文本,QLabel中的alignment属性控制文本对齐方式。

然后保存为.ui结尾的文件:

7915584e-abac-11ee-8b88-92fbcf53809c.png

随后将designer绘制的ui文件转化为py文件

python3 -m PyQt5.uic.pyuic ui_main.ui -o ui_main.py

接下来编写main.py程序,调用刚刚画的窗口进行显示,先把刚刚的ui_main.py以及一些qt库给import进来:

from ui_main import Ui_MainWindow


import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *


# 修正qt的plugin路径,因为某些程序(cv2)会将其改到其他路径
import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = os.path.dirname(PyQt5.__file__)

放入一点辅助代码,一个是为了实现从远程命令行运行qt程序显示到桌面上,一个是为了在命令行下可以按ctrl+c快捷键来强制退出qt程序

#【可选代码】允许远程运行
import os
os.environ["DISPLAY"] = ":0.0"


#【建议代码】允许终端通过ctrl+c中断窗口,方便调试
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
timer = QtCore.QTimer()
timer.start(100) # You may change this if you wish.
timer.timeout.connect(lambda: None) # Let the interpreter run each 100 ms

加上调用函数进行显示的部分,这个显示pyqt5窗口的基本程序就完成了

# 初始化窗口
import sys
app = QtWidgets.QApplication(sys.argv)
window = WINDOW()
ui = Ui_MainWindow()
ui.setupUi(window)
window.showFullScreen() #全屏显示
# window.show() #按绘制时的尺寸显示
sys.exit(app.exec_())
791f54c0-abac-11ee-8b88-92fbcf53809c.png

在核桃派lcd屏上的效果展示

OpenCV图像读取及显示

调用头文件,opencv的头文件只需要这一个

import cv2

打开摄像头,其中传入的参数1是摄像头编号,一般是从0开始往后排

cap = cv2.VideoCapture(1)

从摄像头读取一帧图像,ret是读取状态,frame是图像数据

ret, frame = cap.read()

cap.read函数读到的是bgr格式的,为了把opencv的图像数据显示到qt的label,需要先转为rgb格式,并将图像转为Qt中用来表示图像的QImage。

rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)


h, w, ch = rgbImage.shape
qtImage = QImage(rgbImage.data, h, w, ch*w, QtGui.QImage.Format_RGB888)

label的setPixmap方法可以图像数据覆盖label

label.setPixmap(QPixmap.fromImage(qtImage))
79568e4a-abac-11ee-8b88-92fbcf53809c.png

显示效果

线程,信号与槽

原代码为了简单,没有使用信号槽机制,不够线程安全,我们这里使用qt自带的多线程功能,他的使用很简单,只需要创建一个类并继承自QThread, 然后将要运行的东西写到类里的run方法下面。实例化一个对象后,调用start方法即可创建新线程

class Work(QThread):
  def run(self):
    pass
work = Work()
work.start()

直接在线程内调用函数去修改qt窗口的内容,不能满足线程安全。

我们需要创建一个信号,把修改qt窗口的语句写到一个槽内,连接他们,在想修改窗口时发出信号,让qt内部去调度,防止跟其他qt内部的线程发生冲突。

78f0162e-abac-11ee-8b88-92fbcf53809c.png

因为我们这个线程类继承自QThread,所以可以在类内定义信号。只需要实例化一个pyqtSignal对象即可,调用时括号内的参数决定了槽函数必须有什么类型的参数,以及发送信号时需要传入什么参数。

 signal_update_label = pyqtSignal( QPixmap)

槽函数就是随便定义一个函数,只要函数参数跟信号一样就行。

 label:QLabel
  def sloat_update_label( self, pixmap:QPixmap):
    self.label.setPixmap(pixmap)

使用emit方法即可发送信号,qt内部会进行调度,将所有连接到本信号的函数都调出来运行,并将参数传给他们。这是qt实现线程安全的重要机制。

self.signal_update_label.emit(QPixmap.fromImage(qtImage))

本文转载自:https://forum.walnutpi.com/t/topic/84







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RGB
    RGB
    +关注

    关注

    4

    文章

    798

    浏览量

    58376
  • OpenCV
    +关注

    关注

    29

    文章

    626

    浏览量

    41247
  • pyqt5
    +关注

    关注

    0

    文章

    25

    浏览量

    3394

原文标题:可视可交互!H618上用OpenCV读取图像显示到PyQt5窗口上

文章出处:【微信号:gh_79acfa3aa3e3,微信公众号:全志在线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    可视可交互!H618OpenCV读取图像显示PyQt5窗口上

    这里分享一个代码,功能是使用图像处理opencv摄像头
    发表于 01-10 09:55

    摄像头采集图像处理

    就可以做到实际中图像处理并且做到无线传输。这样的图像采集处理功能在监控系统和在线检测都有很大的前景。 本作品是基于安芯一号SLH89F5162单片机,驱动并控制带FIFO的OV7670
    发表于 11-05 22:35

    OpenWRT + OpenCV 无线摄像头监控和图像处理

    知道视频流是jpeg类型,因此“伪造”了一个jpeg文件名下图是修改OpenCV官网的一个demo,亲测在路由获取图像可行(分别从笔记本摄像头
    发表于 02-09 22:15

    【OK210试用体验】之(五)——在Ubuntu12.04安装OpenCV2.4.9并实现USB摄像头C270图像采集

    迈进。今天帖子的主要内容就是在Ubuntu12.04安装图像处理软件OpenCV,并用简单的程序实现UVC摄像头C270的
    发表于 08-02 12:21

    【Nanopi NEO试用体验】【机器学习/计算机视觉/NLP操作篇】USB摄像头的使用以及ascii显示摄像头画面

    去掉,只留下resize跟cvtcolor就是这样了!那么这个图片里是什么呢?相信大家已经猜出来了!那么问题来了,这样子做只是能够把摄像头捕捉的画面以粗暴的方式显示出来而已,而对于opencv
    发表于 10-29 15:40

    【新手求助】关于树莓派+opencv+摄像头图像处理的问题?

    使用树莓派3B,原装摄像头800W像素,c++和opencv。对亮斑进行拍摄,并求取光斑重心。怎么能有效提高精度和速度?流程是这样的:opencv控制摄像头拍照;提取单通道像素值;
    发表于 11-09 08:57

    基于STM32单片机的摄像头图像采集的处理系统

    处理显示系统,完成了图像的快速采集、存储、数据处理图像显示。首先
    发表于 09-06 16:21

    如何摄像头获取图像并保存和实时显示

    开发环境,包括相关源的更新,的安装,按照上次blog中的介绍,安装好Python-opencv和导入cv2后,就可以进行接下来我们今天的学习了,今天将叫大家进一步实现如何
    发表于 09-25 15:15

    ov5640摄像头采集的图像显示出来是错误的

    `STM32板子ov5640摄像头采集的JPEG数据图像显示出来是错误的。这样的问题因为什么?该如何修改呢?`
    发表于 04-16 21:12

    【大联大友尚安森美半导体感光芯片USB双目摄像头模组试用体验】使用opencv打开摄像头

    。因为光照的不同会对识别的效果产生质的影响。因为目前的视觉系统只是认为识别到的是一个多通道的平面图像,而再此基础做出了图像处理(滤波,灰度等)
    发表于 09-26 21:54

    如何去实现一种基于opencv与flask的摄像头图像传输呢

    硬件:eaidk610(fedaro28)、普通带usb接口摄像头软件环境: python3.9、opencv4.6、Flask2.2主要实现了板子的连接的摄像头收集
    发表于 10-18 14:25

    如何在OKMX6UL-C利用摄像头图像采集呢

    要求在OKMX6UL-C(emmc版本)利用摄像头图像采集、视频采集,需要在LCD屏幕上将图像或视频显示出来1. 请问该采用什么类型的
    发表于 12-02 06:49

    【EASY EAI Nano开源套件试用体验】3. OpenCV 图像处理开发测试

    功的显示出mipi摄像头采集的视频画面和文件: 四、OpenCV 开发测试OpenCV是图形图像处理常用的一个工具,它提供了非常丰富的视觉
    发表于 03-08 00:03

    PyQt5的中文教程电子书免费下载

     本教程的目的是带领你入门PyQt5。教程内所有代码都在Linux测试通过。PyQt4 教程是PyQt4的教程,PyQt4是一个Pytho
    发表于 08-06 08:00 13次下载
    <b class='flag-5'>PyQt5</b>的中文教程电子书免费下载

    在核桃派上实现USB摄像头OpenCV颜色检测

    在前几周的文章中已经介绍过如何在核桃派上用OpenCV读取图像显示pyqt5的窗口上,这里在上一篇文章的基础,给开发板加入颜色检测功能
    的头像 发表于 01-20 17:50 884次阅读
    在核桃派上实现USB<b class='flag-5'>摄像头</b>的<b class='flag-5'>OpenCV</b>颜色检测