可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上

这篇具有很好参考价值的文章主要介绍了可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

这里分享一个代码,功能是使用图像处理库opencv从摄像头获取数据,缩放后从pyqt5的窗口中显示出来。

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上,全志H616,智能硬件,交互,opencv,qt,计算机视觉,视觉检测

安装opencv

sudo pip3 install opencv-python

创建一个pyqt5窗口

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

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

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

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上,全志H616,智能硬件,交互,opencv,qt,计算机视觉,视觉检测

2. 将designer绘制的ui文件转化为py文件

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

3. 编写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

定义窗口类,重写窗口的一些触发事件。这里我修改了鼠标点击后会被自动调用的mousePressEvent和窗口绘制时会被调用的paintEvent

class WINDOW(QtWidgets.QMainWindow):

    def mousePressEvent(self, event):
        # 被左键点击后退出本程序
        if event.button() == Qt.LeftButton:
            self.close()
            exit(-1)

    def paintEvent(self,event):
        # 修改label的大小和位置
        new_width = int(window.width()/10*8)
        new_height = int(window.height()/10*8)
        lab_x = int((window.width() - new_width) / 2)
        lab_y = int((window.height() - new_height) / 2)
        ui.label.setGeometry( lab_x, lab_y, new_width, new_height)

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

# 初始化窗口
import sys
app = QtWidgets.QApplication(sys.argv)
window = WINDOW()
ui = Ui_MainWindow()
ui.setupUi(window)
window.showFullScreen() #全屏显示
# window.show() #按绘制时的尺寸显示
sys.exit(app.exec_())

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

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上,全志H616,智能硬件,交互,opencv,qt,计算机视觉,视觉检测

opencv怎么读取摄像头

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

import cv2

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

cap = cv2.VideoCapture(1)

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

ret, frame = cap.read()

怎么把opencv的图像数据显示到qt的label

cap.read函数读到的是bgr格式的,需要先转为rgb格式

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

将图像转为Qt中用来表示图像的QImage

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))

线程,信号与槽

我们这里使用qt自带的多线程功能,他的使用很简单,只需要创建一个类并继承自QThread, 然后将要运行的东西写到类里的run方法下面。实例化一个对象后,调用start方法即可创建新线程

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

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

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

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

```

signal_update_label = pyqtSignal( QPixmap)


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

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

连接信号与槽,使用connect方法即可

self.signal_update_label.connect(self.sloat_update_label)

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

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

最终代码

import cv2
from  ui_main import Ui_MainWindow

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

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


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

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

# 线程类
class Work(QThread):
    signal_update_label = pyqtSignal(QPixmap)
    label:QLabel
    def sloat_update_label( self, pixmap:QPixmap):
        self.label.setPixmap(pixmap)

    def run(self):
        print("label.width()=", self.label.width())
        print("label.height()=", self.label.height())
        self.signal_update_label.connect(self.sloat_update_label)
        cap = cv2.VideoCapture(1)
        while True:
            ret, frame = cap.read()
            if ret:

                # 颜色转换
                rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

                # 按比例缩放
                h, w, ch = rgbImage.shape
                aspect_ratio = w / h
                new_width = self.label.width()
                new_height = int(new_width / aspect_ratio)
                if new_height > self.label.height():
                    new_height = self.label.height()
                    new_width = int(new_height * aspect_ratio)
                rgbImage = cv2.resize(rgbImage, (new_width, new_height))
                
                # 显示到label
                bytesPerLine = ch * new_width
                self.signal_update_label.emit(QPixmap.fromImage(QImage(rgbImage.data, new_width, new_height, bytesPerLine, QImage.Format_RGB888)))
            else :
                print("cap read error")
                return

class WINDOW(QMainWindow):
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.close()
    def paintEvent(self,event):
        new_width = int(window.width()/10*8)
        new_height = int(window.height()/10*8)
        lab_x = int((window.width() - new_width) / 2)
        lab_y = int((window.height() - new_height) / 2)
        ui.label.setGeometry( lab_x, lab_y, new_width, new_height)


import sys
app = QApplication(sys.argv)
window = WINDOW()
ui = Ui_MainWindow()
ui.setupUi(window)
window.showFullScreen() #全屏显示
# window.show() #按绘制时的尺寸显示

# 创建读取摄像头并显示的线程
work = Work()
work.label = ui.label
work.start()

sys.exit(app.exec_())

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上,全志H616,智能硬件,交互,opencv,qt,计算机视觉,视觉检测文章来源地址https://www.toymoban.com/news/detail-790294.html

到了这里,关于可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Orangepi Zero2 全志H616】驱动串口实现Tik Tok—VUI(语音交互)

    一、编程实现语音和开发板通信 wiringpi库源码 demo.c 二、基于前面串口的代码修改实现 uartTool.h uartTool.c uartTest.c 三、ADB adb控制指令 四、手机接入Linux热拔插相关 a. 把手机接入开发板 b. 安装adb工具,在终端输入adb安装指令: sudo apt-get install adb c. dmeg能查看到手机接入的信息,

    2024年02月21日
    浏览(32)
  • 你相信光吗?开源一个能进行虚拟光渲交互的全志D1s智能家居中控

    本文所介绍产品demo是在立创开源平台的开源作品**《全志D1s智能家居中控虚拟光渲交互(86盒)》**,项目选用RISC-V核心的全志D1s作为主控进行开发,并通过家庭WIFI内网,实现设备间MQTT通信,与其它开源单片机控制项目进行充分联动, 旨在推广类似客制化键盘概念到智能家居领

    2024年02月02日
    浏览(28)
  • 花费200元,我用全志H616和雪糕棒手搓了一台可UI交互的视觉循迹小车

    常见的视觉循迹小车都具备有路径识别、轨迹跟踪、转向避障、自主决策等基本功能,如果不采用红外避障的方案,那么想要完全满足以上这些功能,摄像头、电机、传感器这类关键部件缺一不可,由此一来小车成本也就难以控制了。 但如果,有这样一款视觉循迹小车,它可

    2024年02月21日
    浏览(32)
  • R2在全渠道业务线的落地

    随着业务的增长,系统的高频率迭代,质量保障工作迫切需要引入更加科学高效的测试方法来助力业务高质量的交付。长城项目一期测试中,全渠道质量团队引入技术平台部R2技术,极大的提升了项目交付的质量。因此,本文将重点介绍全渠道质量团队是如何利用R2来保障业务

    2024年02月14日
    浏览(22)
  • python三维建模可视化与交互,python三维建模可视化

    本篇文章给大家谈谈python三维建模可视化与交互,以及python三维建模可视化,希望对各位有所帮助,不要忘了收藏本站喔。 一、 内容介绍 人类是那么得有创造力,我们创造、发明、设计、生产了一切大自然没有直接给予我们的东西使我们的生活变得更轻松更美好。在过去,

    2024年01月23日
    浏览(36)
  • 神经网络的可视化:使用3D可视化和交互式界面来展示模型

    作者:禅与计算机程序设计艺术 作为人工智能领域的从业者,我们常常需要与其他技术人员或者领域内的专家进行交流。在这个过程中,一个关键的问题是如何让复杂的神经网络模型变得易于理解和分析。今天,我们将探讨如何使用3D可视化和交互式界面来展示神经网络模型

    2024年02月14日
    浏览(35)
  • 3d智能工厂工艺流转可视化交互展示应用优点

    传统的反应式维护存在以下缺点:售后服务响应速度慢;维护成本高;生产效率低下;停车率高;管理成本高;无法应对合格工程师不足的情况。 随着5G、云计算、物联网和大数据等技术的应用,智慧工厂已经成为产业关注的焦点,企业将持续建设“智慧工厂”。 深圳华锐视点 基于

    2024年02月02日
    浏览(31)
  • 数据分析基础-数据可视化学习笔记06-交互架构

    对视觉表⽰进⾏操作 · 视觉分析的可视化应有助于对视觉表⽰数据的操作 · ⼀系列反馈回路 · 概述 · 放⼤/缩⼩ · 选择 · 筛选 · 查找相关信息 · 促进数据空间的探索。 · 选择和操作 · 直接处理数据的视觉表⽰。 · 探索与导航 · 理解并⾛过视觉呈现的空间。 从列表中选

    2024年02月10日
    浏览(31)
  • 数据分析基础-数据可视化学习笔记05-交互模型

    理解交互中的人类认知行为 •人类信息处理模型 •生态模型 •社交互动模型 •在认知心理学中——人类被视为一个信息处理单元 •认知过程被建模为该 IP 单元上的一系列信息过程 •了解人类认知过程,例如推理、解决问题、记忆和学习 •SK Card、TP Moran 和 A. Newell:人机交

    2024年02月11日
    浏览(25)
  • OpenCV快速入门:窗口交互

    OpenCV是一种强大的计算机视觉库,广泛用于图像处理和计算机视觉应用。本文将介绍OpenCV中的窗口交互功能,重点关注鼠标和键盘的操作,以及如何添加窗口控件来实现更丰富的用户体验。 OpenCV提供了丰富的鼠标交互功能,包括但不限于: 获取鼠标的坐标位置 监听鼠标点击

    2024年02月04日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包