前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PySide6 GUI 编程(42):QPainter 的使用

PySide6 GUI 编程(42):QPainter 的使用

原创
作者头像
密码学人CipherHUB
修改于 2024-09-15 01:50:53
修改于 2024-09-15 01:50:53
65400
代码可运行
举报
文章被收录于专栏:编码视界编码视界
运行总次数:0
代码可运行

QPainter的作用

QPainter 是 PySide6 中用于在小部件和其他绘图设备上进行低级绘图的类。

它提供了一系列的绘图函数,可以绘制从简单线条到复杂形状(如饼图和和弦图)的各种图形。

QPainter 还可以绘制对齐文本和图片。

通常,它使用“自然”坐标系进行绘图,但也支持视图和世界坐标转换。

QPainter 的基础使用范式

绘制线条的示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import sys
from datetime import datetime

from PySide6.QtCore import QLine, QPoint, Qt
from PySide6.QtGui import QPainter, QPixmap
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow


def get_time_str() -> str:
    return datetime.now().isoformat(sep = ' ')


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布大小
        self.pixmap = QPixmap(400, 300)
        self.pixmap.fill(Qt.GlobalColor.black)

        # 在画布上绘制图线
        self.painter = QPainter(self.pixmap)
        self.painter.setPen(Qt.GlobalColor.red)
        # 使用坐标画线
        self.painter.drawLine(0, 0, 400, 300)
        self.painter.drawLine(400, 0, 0, 300)
        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,可能会导致程序崩溃或者运行效率降低
        """
        self.painter.end()

        # 使用 QLine 画线
        self.painter = QPainter(self.pixmap)
        self.painter.setPen(Qt.GlobalColor.blue)
        self.painter.drawLine(QLine(0, 150, 400, 150))
        self.painter.end()

        # 使用 QPoint 画线
        self.painter = QPainter(self.pixmap)
        self.painter.setPen(Qt.GlobalColor.cyan)
        self.painter.drawLine(QPoint(0, 100), QPoint(400, 100))
        self.painter.end()

        self.label = QLabel()
        self.label.setPixmap(self.pixmap)
        self.setCentralWidget(self.label)

        self.update()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

通常来说,使用 QPainter 画图的步骤为:

  1. 设置画布大小 self.pixmap = QPixmap(400, 300)
  2. 初始化QPainter self.painter = QPainter(self.pixmap)
  3. 设置画笔 self.painter.setPen(Qt.GlobalColor.red)
  4. 画图 self.painter.drawxxxx
  5. 释放 painter 实例 self.painter.end()
  6. 刷新图形到画布 self.label.setPixmap(self.pixmap)
  7. 刷新所有视图 self.update()

运行效果

使用 QPainter 画线
使用 QPainter 画线

QPainter常用的基础图形

绘制坐标点

示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import sys
from random import choice, randint

from PySide6.QtCore import QPoint, Qt
from PySide6.QtGui import QPainter, QPen, QPixmap
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布大小
        self.pixmap = QPixmap(400, 300)
        self.pixmap.fill(Qt.GlobalColor.black)

        # 在画布上绘制图线
        self.painter = QPainter(self.pixmap)
        self.pen = QPen()
        self.pen.setWidth(3)
        self.pen.setColor(Qt.GlobalColor.red)
        self.painter.setPen(self.pen)
        colors = [x for x in Qt.GlobalColor]
        # 使用坐标画线
        for i in range(1, 10000):
            self.pen.setColor(choice(colors))
            # 这里需要每次都重新设置 pen,否则颜色不生效
            # There can only ever be one  QPen active on a QPainter
            # -- the current pen.
            self.painter.setPen(self.pen)
            self.painter.drawPoint(QPoint(200 + randint(-100, 100), 150 + randint(-100, 100)))
        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,会导致程序崩溃或者运行效率降低
        """
        self.painter.end()

        self.label = QLabel()
        self.label.setPixmap(self.pixmap)
        self.setCentralWidget(self.label)

        self.update()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

运行效果

随机彩色矩形点阵
随机彩色矩形点阵

绘制矩形

示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import sys

from PySide6.QtCore import QRect, Qt
from PySide6.QtGui import QBrush, QColor, QPainter, QPen, QPixmap
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布大小
        self.pixmap = QPixmap(400, 300)
        self.pixmap.fill(Qt.GlobalColor.black)

        # 在画布上绘制图线
        self.painter = QPainter(self.pixmap)
        self.pen = QPen()
        self.pen.setWidth(3)
        self.pen.setColor(Qt.GlobalColor.red)
        self.painter.setPen(self.pen)
        # 第一个参数:x 坐标,表示矩形左上角的水平位置
        # 第二个参数:y 坐标,表示矩形左上角的垂直位置
        # 第三个参数:width,表示矩形的宽度
        # 第四个参数:height,表示矩形的高度
        self.painter.drawRect(10, 10, 200, 200)

        self.pen.setColor(Qt.GlobalColor.blue)
        self.painter.setPen(self.pen)
        self.painter.drawRects([QRect(20, 20, 20, 20),
                                QRect(20, 20, 30, 30),
                                QRect(20, 20, 40, 40),
                                QRect(20, 20, 50, 50),
                                QRect(20, 20, 60, 60)])

        self.pen.setColor(Qt.GlobalColor.green)
        self.painter.setPen(self.pen)
        self.brush = QBrush()
        self.brush.setStyle(Qt.BrushStyle.SolidPattern)
        self.brush.setColor(QColor("#FFD007"))
        self.painter.setBrush(self.brush)
        self.painter.drawRoundedRect(QRect(85, 85, 100, 100), 100, 100, Qt.SizeMode.RelativeSize)

        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,可能会导致程序崩溃或者运行效率降低
        """
        self.painter.end()

        self.label = QLabel()
        self.label.setPixmap(self.pixmap)
        self.setCentralWidget(self.label)

        self.update()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

上述示例中,使用drawRectdrawRectsdrawRoundedRect分别绘制了矩形,其中,drawRoundedRect中,当把曲率调位 100 时,矩形将会变为圆形。

drawRoundedRect函数原型
drawRoundedRect函数原型

运行效果

绘制矩形
绘制矩形

绘制椭圆形

示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import sys

from PySide6.QtCore import QPoint, Qt
from PySide6.QtGui import QBrush, QPainter, QPen, QPixmap
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布大小
        self.pixmap = QPixmap(400, 300)
        self.pixmap.fill(Qt.GlobalColor.black)

        # 在画布上绘制图线
        self.painter = QPainter(self.pixmap)
        self.pen = QPen()
        self.pen.setWidth(3)
        self.pen.setColor(Qt.GlobalColor.green)
        self.painter.setPen(self.pen)
        self.brush = QBrush()
        self.brush.setStyle(Qt.BrushStyle.SolidPattern)
        self.brush.setColor(Qt.GlobalColor.red)
        self.painter.setBrush(self.brush)
        self.painter.drawEllipse(QPoint(200, 150), 100, 50)

        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,可能会导致程序崩溃或者运行效率降低
        """
        self.painter.end()

        self.label = QLabel()
        self.label.setPixmap(self.pixmap)
        self.setCentralWidget(self.label)

        self.update()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

运行效果

绘制椭圆形
绘制椭圆形

绘制文本

示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import sys
from datetime import datetime

from PySide6.QtCore import Qt
from PySide6.QtGui import QFont, QPainter, QPen, QPixmap
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布大小
        self.pixmap = QPixmap(600, 400)
        self.pixmap.fill(Qt.GlobalColor.black)

        # 在画布上绘制图线
        self.painter = QPainter(self.pixmap)
        self.pen = QPen()
        self.pen.setWidth(5)
        self.pen.setColor(Qt.GlobalColor.darkMagenta)
        self.painter.setPen(self.pen)

        self.font = QFont('ComicShannsMono Nerd Font', 40)
        # self.font.setBold(True)
        self.painter.setFont(self.font)
        self.painter.drawText(0, 0, 600, 400, Qt.AlignmentFlag.AlignCenter,
                              'Hello, PySide6!\n你好,GUI 编程!\n{}\n{}'.format(datetime.now().isoformat(), self.font.family()))
        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,可能会导致程序崩溃或者运行效率降低
        """
        self.painter.end()

        self.label = QLabel()
        self.label.setPixmap(self.pixmap)
        self.setCentralWidget(self.label)

        self.update()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

运行效果

绘制文本
绘制文本

QPainter 的高级用法

基于鼠标坐标绘制线条

示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import sys

from PySide6.QtCore import Qt
from PySide6.QtGui import QMouseEvent, QPainter, QPen, QPixmap
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布初始状态
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.GlobalColor.white)

        # 设置布局
        self.label = QLabel()
        self.label.setPixmap(self.pixmap)
        self.button = QPushButton('清除所有')
        self.button.clicked.connect(self.clear_all)
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.label)
        self.v_layout.addWidget(self.button)
        self.container = QWidget()
        self.container.setLayout(self.v_layout)
        self.setCentralWidget(self.container)

        # 鼠标坐标
        self.last_x = None
        self.last_y = None

    def mouseMoveEvent(self, event: QMouseEvent) -> None:
        pos = event.position()
        if self.last_x is None and self.last_y is None:
            self.last_x = pos.x()
            self.last_y = pos.y()
            return

        # 在画布上绘制图线
        painter = QPainter(self.pixmap)
        pen = QPen()
        pen.setWidth(3)
        pen.setStyle(Qt.PenStyle.SolidLine)
        pen.setCosmetic(True)
        pen.setColor(Qt.GlobalColor.darkMagenta)
        painter.setPen(pen)
        painter.drawLine(self.last_x, self.last_y, int(pos.x()), int(pos.y()))
        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,可能会导致程序崩溃或者运行效率降低
        """
        painter.end()
        # 更新QLabel中显示的内容,使其显示最新的QPixmap
        self.label.setPixmap(self.pixmap)
        # 记录上一次的鼠标坐标
        self.last_x = pos.x()
        self.last_y = pos.y()
        # 显式刷新界面
        self.update()

    def mouseReleaseEvent(self, event: QMouseEvent) -> None:
        self.last_x = None
        self.last_y = None

    def clear_all(self) -> None:
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.GlobalColor.white)
        self.label.setPixmap(self.pixmap)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

运行效果

使用鼠标画图
使用鼠标画图

更改画笔颜色

示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import sys

from PySide6.QtCore import Qt
from PySide6.QtGui import QMouseEvent, QPainter, QPen, QPixmap
from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布初始状态
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.GlobalColor.white)

        # 设置布局
        self.label = QLabel()
        self.label.setPixmap(self.pixmap)

        # 颜色列表
        self.colors_v_layout = QVBoxLayout()
        colors_h_layout = QHBoxLayout()
        self.colors_map = {}
        colors_count = 0
        for x in Qt.GlobalColor:
            self.colors_map[x.name] = x
            # css中没有 darkYellow 这种颜色,需要用 #CCCC00 来表示
            # 因此为了逻辑上的方便,QPushButton 中不使用 darkYellow 来作为背景色
            # 同时像 transparent、color0、color1 这样的颜色也过滤掉
            # 由于画板的背景色已经是白色,因此这里也将 white 过滤掉
            if x.name in ('transparent', 'white', 'color0', 'color1', 'darkYellow'):
                continue
            color_button = QPushButton(x.name)
            style = """
            QPushButton { background-color: %s; color: white; }
            QPushButton:pressed { background-color: #CCCC00; }
            """ % x.name
            color_button.setStyleSheet(style)
            color_button.clicked.connect(self.color_changed)
            colors_h_layout.addWidget(color_button)
            colors_count += 1
            if colors_count % 9 == 0:
                self.colors_v_layout.addLayout(colors_h_layout)
                colors_h_layout = QHBoxLayout()
                colors_count = 0
        self.colors_v_layout.addLayout(colors_h_layout)

        # 清除按钮
        self.button = QPushButton('清除所有')
        self.button.clicked.connect(self.clear_all)

        # 布局
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.label)
        self.v_layout.addLayout(self.colors_v_layout)
        self.v_layout.addWidget(self.button)

        # 容器
        self.container = QWidget()
        self.container.setLayout(self.v_layout)

        # 组件排布
        self.setCentralWidget(self.container)

        # 鼠标坐标
        self.last_x = None
        self.last_y = None
        self.current_color = Qt.GlobalColor.darkMagenta

    def mouseMoveEvent(self, event: QMouseEvent) -> None:
        pos = event.position()
        if self.last_x is None and self.last_y is None:
            self.last_x = pos.x()
            self.last_y = pos.y()
            return

        # 在画布上绘制图线
        painter = QPainter(self.pixmap)
        pen = QPen()
        pen.setWidth(3)
        pen.setStyle(Qt.PenStyle.SolidLine)
        pen.setCosmetic(True)
        pen.setColor(self.current_color)
        painter.setPen(pen)
        painter.drawLine(self.last_x, self.last_y, int(pos.x()), int(pos.y()))
        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,可能会导致程序崩溃或者运行效率降低
        """
        painter.end()
        # 更新QLabel中显示的内容,使其显示最新的QPixmap
        self.label.setPixmap(self.pixmap)
        # 记录上一次的鼠标坐标
        self.last_x = pos.x()
        self.last_y = pos.y()
        # 显式刷新界面
        self.update()

    def mouseReleaseEvent(self, event: QMouseEvent) -> None:
        self.last_x = None
        self.last_y = None

    def clear_all(self) -> None:
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.GlobalColor.white)
        self.label.setPixmap(self.pixmap)

    def color_changed(self) -> None:
        self.current_color = self.colors_map[self.sender().text()]


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

界面静态效果

界面静态效果
界面静态效果

动态效果

更改画笔颜色
更改画笔颜色

喷雾效果

示例代码

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from __future__ import annotations

import random
import sys
from cmath import pi

from PySide6.QtCore import Qt
from PySide6.QtGui import QMouseEvent, QPainter, QPen, QPixmap
from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Hello, PySide6!')
        self.setToolTip('A PySide6 GUI Application Demo')

        # 设置画布初始状态
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.GlobalColor.white)

        # 设置布局
        self.label = QLabel()
        self.label.setPixmap(self.pixmap)

        # 颜色列表
        self.colors_v_layout = QVBoxLayout()
        colors_h_layout = QHBoxLayout()
        self.colors_map = {}
        colors_count = 0
        for x in Qt.GlobalColor:
            self.colors_map[x.name] = x
            # css中没有 darkYellow 这种颜色,需要用 #CCCC00 来表示
            # 因此为了逻辑上的方便,QPushButton 中不使用 darkYellow 来作为背景色
            # 同时像 transparent、color0、color1 这样的颜色也过滤掉
            # 由于画板的背景色已经是白色,因此这里也将 white 过滤掉
            if x.name in ('transparent', 'white', 'color0', 'color1', 'darkYellow'):
                continue
            color_button = QPushButton(x.name)
            style = """
            QPushButton { background-color: %s; color: white; }
            QPushButton:pressed { background-color: #CCCC00; }
            """ % x.name
            color_button.setStyleSheet(style)
            color_button.clicked.connect(self.color_changed)
            colors_h_layout.addWidget(color_button)
            colors_count += 1
            if colors_count % 9 == 0:
                self.colors_v_layout.addLayout(colors_h_layout)
                colors_h_layout = QHBoxLayout()
                colors_count = 0
        self.colors_v_layout.addLayout(colors_h_layout)

        # 清除按钮
        self.button = QPushButton('清除所有')
        self.button.clicked.connect(self.clear_all)

        # 布局
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.label)
        self.v_layout.addLayout(self.colors_v_layout)
        self.v_layout.addWidget(self.button)

        # 容器
        self.container = QWidget()
        self.container.setLayout(self.v_layout)

        # 组件排布
        self.setCentralWidget(self.container)

        # 鼠标坐标
        self.current_color = Qt.GlobalColor.darkMagenta

    def mousePressEvent(self, event: QMouseEvent) -> None:
        pos = event.position()
        # 在画布上绘制图线
        painter = QPainter(self.pixmap)
        pen = QPen()
        pen.setWidth(3)
        pen.setStyle(Qt.PenStyle.SolidLine)
        pen.setCosmetic(True)
        pen.setColor(self.current_color)
        painter.setPen(pen)
        radius = 15
        for _ in range(0, int(pi * (radius ** 2))):
            x_offset = random.randint(0 - radius, radius)
            y_offset = random.randint(0 - radius, radius)
            # 画出一个半径为 radius 的圆
            if int(x_offset) ** 2 + int(y_offset) ** 2 <= radius ** 2:
                painter.drawPoint(int(pos.x() + x_offset), int(pos.y() + y_offset))
        """
        如果不调用这个方法,那么这些资源可能会被锁定,导致无法被其他QPainter对象使用,
        或者在某些情况下可能会导致内存泄漏,特别是当你在一个循环中多次使用QPainter对象时,
        如果不调用end()方法,可能会导致程序崩溃或者运行效率降低
        """
        painter.end()
        # 更新QLabel中显示的内容,使其显示最新的QPixmap
        self.label.setPixmap(self.pixmap)
        # 显式刷新界面
        self.update()

    def clear_all(self) -> None:
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.GlobalColor.white)
        self.label.setPixmap(self.pixmap)

    def color_changed(self) -> None:
        self.current_color = self.colors_map[self.sender().text()]


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    app.exec()

运行效果

喷雾效果
喷雾效果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
NC:无线耳脑电图(ear EEG)监测嗜睡
摘要:神经可穿戴设备能够为飞行员和驾驶员提供监测嗜睡和健康的功能。当前的神经可穿戴设备前景广阔,但大多数需要湿电极和笨重的电子设备。本项工作展示了使用入耳式干电极耳机和紧凑硬件来监测嗜睡状态的方法。该系统集成了用于干式、通用型耳机的增材制造技术、现有的无线电子设备和离线分类算法。记录了九名受试者在进行嗜睡诱导任务时的35小时电生理数据。支持向量机分类器在评估已见过的用户时准确率为93.2%,在评估从未见过的用户时准确率为93.3%。这些结果表明,无线、干式、通用型耳机在分类嗜睡状态方面的准确率与现有最先进的湿电极入耳式和头皮系统相当。此外,这项工作还展示了在未来电生理应用中实现基于人群训练的分类的可行性。
悦影科技
2024/10/15
2300
国内多所单位联合推出的基于SSVEP可穿戴BCI开放数据集
脑机接口(BCI)的各种应用中,基于稳态视觉诱发电位(SSVEP)的BCI因其高信息传输率(ITR)、较少的培训过程和简单的操作而备受研究人员的青睐。近年来出现了基于SSVEP的BCI的开放数据集,开放数据集为研究人员在BCI高速拼写功能方面的研究提供了很大的便利,就BCI设备而言,穿戴式BCI系统在实践中更受欢迎,但对数据采集、数据分析和用户体验方面的要求也更高。而基于SSVEP的可穿戴BCI仍缺少充分的可供参考的数据集,可穿戴BCI由于直接面向用户,其使用的电极、长期用户体验和系统稳定性都是决定其性能的重要指标。近期,来自中科院国家重点实验室的研究人员为基于SSVEP的可穿戴BCI构建了一个包含大量受试者信息的开放数据集,以供实际应用。
脑机接口社区
2022/09/22
5530
国内多所单位联合推出的基于SSVEP可穿戴BCI开放数据集
纹身电极: 一种新型的可以进行脑信号测量的电极
临时纹身电极是皮肤传感器领域的最新发展。他们已被成功证明了其在监测皮肤上各种电生理信号方面的性能。这些表皮电子设备可与穿戴者保持适形且不易察觉的接触,同时可随时间推移提供高质量的记录。在临床实践中对大脑活动的评估面临多个限制,其中这种电极可以提供切合实际的技术解决方案并提高诊断效率。
脑机接口社区
2020/06/30
8080
一种用于干式脑电图的高密度256通道电极帽
高密度脑电图(HD-EEG)目前仅限于实验室环境,因为最先进的电极帽需要熟练的工作人员和大量的准备工作。我们提出并评估了一种带干式多针电极的256通道脑电图帽。本文介绍了以聚氨酯为原料,涂覆Ag/AgCl的干电极的设计。在一项有30名志愿者参与的研究中,我们将新型干式hd-脑电图帽与传统的凝胶型脑电图帽进行电极皮肤阻抗、静息状态脑电图和视觉诱发电位(VEP)的比较。我们用8个电极在真实的人体和人造皮肤上模拟帽子应用进行佩戴测试。256个干电极中的252个平均阻抗低于900 kΩ,就可以用最先进的脑电图放大器进行记录。对于干式脑电图帽,我们获得了84%的通道可靠性和减少69%的准备时间。在排除平均16%(干性)和3%(凝胶性)坏通道后,静息状态EEG、alpha活动和模式逆转VEP可以在所有比较的信号特征指标中记录到小于5%的显著差异。志愿者报告说,在EEG记录之前和之后,干帽的佩戴舒适度分别为3.6±1.5和4.0±1.8,凝胶帽的佩戴舒适度分别为2.5±1.0和3.0±1.1(1-10分)。试验表明,干电极的使用可达3200次。256通道的HD-EEG干电极帽克服了HD-EEG在制备复杂性方面的主要限制,允许未经医学培训的人员快速应用,从而实现了HD-EEG的新用例。
悦影科技
2022/07/04
7550
可穿戴的脑机接口设备将运动意念转化为行动
由佐治亚理工学院(GeorgiaInstitute of Technology) won - hong Yeo实验室领导的多个机构研究团队将无线软头皮电子和虚拟现实结合在一个BMI系统中,用户可以想象一个动作,并无线控制轮椅或机械臂。
脑机接口社区
2022/08/17
5250
可穿戴的脑机接口设备将运动意念转化为行动
fNIRS–EEG监测人脑活动和氧合作用的研究进展
在人类脑功能的研究中,多模式监测已变得相当普遍,其中,功能近红外光谱(fNIRS)和脑电图(EEG)的同步测量成为一个备受关注的研究热点。由于没有光电干扰,将这两种无创的脑活动记录程序整合起来是非常容易的。fNIRS和EEG都是头皮定位的程序。fNIRS通过光谱测量来估计脑血流动力学变化,脑电图通过无源电压评估(passive voltages evaluations)来捕捉大脑电活动的宏观时间动态。这两种技术所提供的“正交”的神经生理学信息,以及研究者对神经血管耦合现象日益增长的兴趣,进一步促进了它们的整合。本文综述了这两种技术的原理和未来发展方向,并对这种灵活、低成本的神经成像模式的主要临床和非临床应用进行了评价。fNIRS–EEG系统利用了两种技术的优势,能够在其他神经成像方式(如功能性磁共振成像、正电子发射断层扫描和脑磁图成像)所不适合的环境或实验场景中进行施测。fNIRS–EEG大脑监测已成为一种有用的多模态脑电和血流动力学研究工具。本文发表在Neurophotonics杂志。
用户1279583
2022/02/28
2.1K0
fNIRS–EEG监测人脑活动和氧合作用的研究进展
基于EEG-EMG混合控制方法的研究—生物机器人应用:现状、挑战与未来方向(二)
02 基于肌电图的混合控制方法综述 基于EEG-EMG的混合控制接口的基本思想是在控制方法中融合EEG和EMG信号,信号的融合可以以许多不同的方式进行,并且可能取决于特定应用和用户能力等因素。在这个混合接口中,结合了EEG信号和EMG信号,混合方法的应用可能有所不同,从一个简单的游戏控制应用程序,到假肢手臂控制应用程序。 这篇综述的主要目的是研究生物机器人学的应用,例如假肢和外骨骼,因此范围缩小到研究混合EEG-EMG方法在生物机器人中的应用。如前所述,有许多可能的方法将肌电图和脑电图信号结合在一种特定的控制方法内,以提高有效性。 一般来说,EEG或EMG信号可用于操作应用程序的各个部分,例如辅助设备中的部件,或者,所有这些都可以组合起来。后者将允许用户根据自己的喜好从一个控制信号平稳地切换到另一个控制信号。 有几种方法可以用来对生物机器人应用中的脑电-肌电混合控制方法进行分类,如特定的应用/设备(如假肢、外骨骼、轮椅)或输入处理方法。作为一个双输入系统,混合EEG-EMG接口可以同时处理输入信号,也可以按顺序处理输入信号。 在这篇综述文章中,我们将把生物机器人应用中的混合控制方法的每一项研究分为两类,根据输入处理方法是同时的还是顺序的,EEG-EMG方法的比较和本文讨论的不同混合方法的重要特征总结如表1所示。重要的是,无论EEG-EMG信号的融合方法是什么,与单独使用EMG或EEG信号的方法相比,混合方法能获得更高的有效性。
BCIduino脑机接口社区
2020/12/23
1.1K0
基于EEG-EMG混合控制方法的研究—生物机器人应用:现状、挑战与未来方向(二)
干货|详解EEG脑电原理及两种主流脑电设备对比
脑电图(EEG)是一种非侵入性记录脑电活动的电生理监测方法,电极沿着头皮放置,然后通过放置在头皮上的多个电极,记录大脑在一段时间内自发进行的电活动。它一方面在临床上用于诊断癫痫病、睡眠障碍、麻醉深度、昏迷、脑病和脑死亡,另一方面在实验心理学领域中提供大脑活动的一种工具,而且还是一种神经成像方法,在计算神经科学中得到了广泛应用。
脑机接口社区
2023/02/13
4.4K0
超灵敏眼压监测隐形眼镜传感器-8.29
真新,顺手一写。液态金属形成可拉伸电感和电容的LC隐形眼镜传感器,电容极板和电感线圈可以同时响应眼压变化
云深无际
2024/09/06
2010
超灵敏眼压监测隐形眼镜传感器-8.29
可穿戴生物传感器:女性荷尔蒙监测系统
个性化监测女性激素(例如雌二醇)对生育和女性健康具有重要意义。然而,现有的方法通常需要侵入性抽血和/或笨重的分析实验室设备,因此很难在家中实施。
云深无际
2024/11/04
4530
可穿戴生物传感器:女性荷尔蒙监测系统
一种灵活,坚固且无凝胶的脑电图电极,可用于无创脑机接口
脑机接口(BCI)能够在大脑和电子设备之间实现直接和近乎即时的通信。目前最大的挑战之一是开发一种有效的无创BCI,它能使记录电极避免人类皮肤上的毛发,同时又不带来使用导电凝胶的不便和隐患。在这项研究中,清华大学研究人员开发了一种低成本、易于制造、柔韧、坚固且不含凝胶的脑电图(EEG)电极【银纳米线/聚乙烯醇缩丁醛(PVB)/三聚氰胺海绵(AgPMS)】,可以解决头发问题。由于银纳米线(AgNWs)表面金属化,海绵在重量不变的情况下导电率高达917 S/m。柔软的海绵框架和自锁式AgNW结合在一起,为新电极提供了非常好的机械稳定性(电导率在10%的压缩下循环10000次后保持不变)。基于稳态视觉诱发电位(SSVEP)在无毛皮肤上的BCI应用表明,新电极的BCI精度(86%)与导电凝胶支撑的传统电极(88%)大致相同。最重要的是,AgPMS在多毛皮肤上的性能并没有明显降低,这表明新电极可以替代传统电极用于无毛和多毛皮肤BCI及其他EEG应用。
脑机接口社区
2022/08/18
5840
一种灵活,坚固且无凝胶的脑电图电极,可用于无创脑机接口
开源EEG-脑电采集硬件KS108x
目前在做一个可以采集眼动和脑电数据的硬件平台,目前的摄像头就先搞一个USB的就行,先可以处理数据就行。
云深无际
2024/08/20
2710
开源EEG-脑电采集硬件KS108x
脑机接口、开源和民主化增强意识的未来
脑机接口(BCI)工具及其收集的数据的可访问性、适应性和透明度可能会影响我们如何共同驾驭新的数字时代。本讨论回顾了BCI技术的一些多样化和跨学科应用,并对BCI工具与机器学习(ML)算法可能塑造未来的方式进行了推测性推论。BCI带有大量的道德和风险考虑,有人认为,开源原则可以帮助我们通过鼓励实验和公开开发来帮助我们克服复杂的困境,因为我们在这种新范式中建立了保障措施。将适应性和透明性的开源原则引入BCI工具有助于使技术民主化,让更多的声音为BCI驱动的未来应该是什么样子的对话做出贡献。与黑盒算法和对汇总数据的有限访问相比,开源BCI工具和对原始数据的访问是使艺术家、DIY者、研究人员和其他领域专家参与有关如何研究和增强人类意识的对话的关键方面。展望未来,增强现实和虚拟现实成为日常生活不可或缺的一部分,脑机接口可能会在为生成内容创建闭环反馈方面发挥越来越重要的作用。脑机接口的独特之处在于为人工智能(AI)算法提供必要的数据,以确定内容交付的解码和时间安排。这些算法的开源程度对于检查它们的完整性、隐含偏见和利益冲突可能至关重要。
脑机接口社区
2022/09/22
3550
脑机接口、开源和民主化增强意识的未来
中科院半导体所裴为华研究团队及其合作者在脑电电极领域取得重要研究进展
脑电图(EEG)由于其非侵入性的特点,在临床医学和脑机接口(BCI)中得到了广泛的研究。其中,用于提取脑电信号的脑电传感器是神经反馈和脑机接口的关键元件。但是,目前市面常见的商用干电极和湿电极仍然存在一定缺陷,例如干电极的高接触阻抗以及爪式形式伴随的痛感、湿电极过于复杂的准备和清洗过程,这些问题的存在极大地限制了BCI系统的推广普及。
脑机接口社区
2022/09/22
8070
中科院半导体所裴为华研究团队及其合作者在脑电电极领域取得重要研究进展
Brain.space 为我们的现代世界重塑脑电图
我们一般认为,弄清楚大脑中发生的事情是极其困难的,甚至是不可能的。难点之一在于,最好的方法是将房间大小的机器送到医院使用——但Brain.Space希望它的便携、强大、用户友好的脑电头盔可以为家庭和太空中的新应用和治疗提供动力。
脑机接口社区
2022/09/22
3060
Brain.space 为我们的现代世界重塑脑电图
通用脑-机接口研究软件介绍
g.tec提供了完整的基于MATLAB的研发系统,包括数据采集,实时和离线数据分析,数据分类以及提供神经反馈所需的所有硬件和软件组件。可以使用g.MOBIlab +,g.USBamp-RESEARCH,g.HIamp或g.Nautilus构建BCI系统。g.MOBIlab +最多可提供8个带有无线信号传输的EEG通道,并且是便携式的。g.USBamp-RESEARCH可用于16-64 EEG通道,并通过USB将数据传输到PC或笔记本电脑。g.HIamp通过USB获取64-256个通道。g.Nautilus无线EEG具有8-64个通道。下图就是g.Recorder的效果图。
脑机接口社区
2020/06/30
1.6K0
个性化脑机接口及应用
脑机接口(BCI)是一种变革传统人机交互的新型技术,用户的大脑是直接的控制信号源。在BCI转化为实际应用时,由于用户个体之间的感觉、知觉、表象与认知思维活动、脑结构与功能具有一定的差异,通用BCI难以满足不同个体的需求。为此,需要为特定用户定制个性化的BCI。迄今为止,少有文献对个性化BCI涉及的关键科学与技术问题进行阐述,本文聚焦个性化BCI,给出个性化BCI的定义,详述其设计研发以及评价方法和应用,并讨论个性化BCI面临的挑战及未来方向。期望本文对个性化BCI创新研究及实用化提供有益的思路。
脑机接口社区
2023/02/14
6690
个性化脑机接口及应用
一种基于EEG和sEMG的假手控制策略
针对残臂较短或残臂上肌电信号测量点较少的残疾人使用多自由度假手的需求, 研究人员提出一种基于脑电信号(Electroen-cephalogram, EEG) 和表面肌电信号(Surface electromyogram signal, sEMG) 协同处理的假手控制策略. 该方法仅用1 个肌电传感器和1 个脑电传感器实现多自由度假手的控制. 实验中,研究人员使用1 个脑电传感器测量人体前额部位的EEG, 从测量得到的EEG中提取出眨眼动作信息并将其用于假手动作的编码,同时使用1 个肌电传感器测量手臂上的sEMG。研究人员针对肌电信号存在个体差异和位置差异的问题, 采用自适应方法实现手部动作强度的估计,并采用振动触觉技术设计触觉编码用于将当前假手的控制指令反馈给佩戴者, 从而实现EEG 和sEMG 对多自由度假手的协同控制.研究人员通过实验验证了该控制策略的有效性。
脑机接口社区
2020/06/30
5530
一种基于EEG和sEMG的假手控制策略
澳大利亚科学家开发出可用于脑机接口的新型碳基生物传感器
澳大利亚悉尼科技大学的科学家团队开发出一种新型碳基生物传感器,该传感器由外延石墨烯制成,作为一种碳基材料,可以直接种植在硅基碳化物基板上。研究人员将石墨烯的优点(生物相容性和导电性)与硅技术的优点结合起来,这使得新开发的生物传感器具有很强的弹性和稳定性。与商用干电极相比,该传感器可以极大地减少皮肤接触电阻(即传感器和皮肤之间的电信号阻力),由此可以减少脑电信号在传导过程中的损耗。此外,该传感器优越的鲁棒性,可在高盐环境中长期重复使用。
脑机接口社区
2022/08/26
4220
澳大利亚科学家开发出可用于脑机接口的新型碳基生物传感器
MIT团队将脑机接口与机器人结合起来
将BCI和机器人系统结合,使用无线、可穿戴的BCI设备控制波士顿动力的四足机器人Spot,并探索其在个人助理场景中的使用。用户通过脑力计算回答一系列问题,每个问题有对应的Spot动作。该系统成功率为83.4%。这是首次将无线、非视觉型BCI系统与Spot在个人助理使用案例中进行集成。未来版本可能具有友好和直观的提示,类似于普通导盲犬。该项目旨在为由无线和可穿戴的BCI系统提供动力的现代个人助理机器人的未来发展铺平道路。
脑机接口社区
2024/01/07
4980
MIT团队将脑机接口与机器人结合起来
推荐阅读
相关推荐
NC:无线耳脑电图(ear EEG)监测嗜睡
更多 >
目录
  • QPainter的作用
  • QPainter 的基础使用范式
    • 绘制线条的示例代码
    • 运行效果
  • QPainter常用的基础图形
    • 绘制坐标点
      • 示例代码
      • 运行效果
    • 绘制矩形
      • 示例代码
      • 运行效果
    • 绘制椭圆形
      • 示例代码
      • 运行效果
    • 绘制文本
      • 示例代码
      • 运行效果
  • QPainter 的高级用法
    • 基于鼠标坐标绘制线条
      • 示例代码
      • 运行效果
    • 更改画笔颜色
      • 示例代码
      • 界面静态效果
      • 动态效果
    • 喷雾效果
      • 示例代码
      • 运行效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档