创建一个简单的程序:通过调节滑动条来设定画板颜色。我们要创建一个窗口来显示显色,还有三个滑动条来设置B,G,R的颜色。当我们滑动滚动条是窗口的颜色也会发生相应改变。默认情况下窗口的起始颜色为黑。

问题描述:

创建一个简单的程序:通过调节滑动条来设定画板颜色。我们要创建一个窗口来显示显色,还有三个滑动条来设置B,G,R的颜色。当我们滑动滚动条是窗口的颜色也会发生相应改变。默认情况下窗口的起始颜色为黑。

import cv2
import numpy as np
# 创建回调函数
def nothing(x):
    pass
# 创建一副色图像
img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)

switch = '0:OFF\n1:ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)

while (1):
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b, g, r]
cv2.destroyAllWindows()

逐行分析上述代码的逻辑结构。

img = np.zeros((300, 512, 3), np.uint8)

cv2.namedWindow('image')这里面的img和image有什么区别呢? 

问题解答:

以下是逐行分析上述代码的逻辑结构:

  1. 导入库

    import cv2
    import numpy as np
    

    导入 OpenCV 和 NumPy 库,用于图像处理和数组操作。

  2. 创建回调函数

    def nothing(x):
        pass
    

    定义一个空的回调函数 nothing,用于滑块的回调,当前不执行任何操作。

  3. 创建一副色图像

    img = np.zeros((300, 512, 3), np.uint8)
    

    创建一个 300 高、512 宽、3 通道(RGB)的全黑图像,数据类型为无符号 8 位整数。

  4. 创建窗口

    cv2.namedWindow('image')
    

    创建一个名为 'image' 的窗口,以便在其中显示图像。

  5. 创建滑块

    cv2.createTrackbar('R', 'image', 0, 255, nothing)
    cv2.createTrackbar('G', 'image', 0, 255, nothing)
    cv2.createTrackbar('B', 'image', 0, 255, nothing)
    

    创建三个滑块,分别用于调整红色(R)、绿色(G)和蓝色(B)通道的强度,范围从 0 到 255。

  6. 创建开关滑块

    switch = '0:OFF\n1:ON'
    cv2.createTrackbar(switch, 'image', 0, 1, nothing)
    

    创建一个开关滑块,用于控制图像是否显示颜色,0 为关闭,1 为开启。

  7. 显示窗口循环

    while (1):
        cv2.imshow('image', img)
        k = cv2.waitKey(1) & 0xFF
        if k == 27:
            break
    

    进入一个无限循环,不断显示图像,并检查按键。如果按下 Esc 键(ASCII 27),则退出循环。

  8. 获取滑块值

    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')
    

    从滑块获取当前 RGB 值和开关状态。

  9. 更新图像

    if s == 0:
        img[:] = 0
    else:
        img[:] = [b, g, r]
    

    根据开关状态更新图像:如果开关为关闭(0),则将图像设为黑色;如果开启(1),则根据 RGB 滑块的值更新图像的颜色。

  10. 关闭窗口

    cv2.destroyAllWindows()
    

    退出循环后,关闭所有 OpenCV 创建的窗口。

区别:

  • img 是一个 NumPy 数组,代表实际的图像数据,包含颜色信息。
  • 'image' 是窗口的名称,用于在 OpenCV 中显示 img 图像的窗口。它们之间没有直接关系,img 是数据,'image' 是展示数据的窗口的标识。

以下是使用Qt的QGraphicsView创建一个简单画板的示例代码: mainwindow.h: ``` #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class QGraphicsScene; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_actionClear_triggered(); private: Ui::MainWindow *ui; QGraphicsScene *scene; }; #endif // MAINWINDOW_H ``` mainwindow.cpp: ``` #include "mainwindow.h" #include "ui_mainwindow.h" #include <QGraphicsScene> #include <QGraphicsView> #include <QGraphicsEllipseItem> #include <QMouseEvent> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 创建场景和视图 scene = new QGraphicsScene(this); QGraphicsView *view = new QGraphicsView(scene); setCentralWidget(view); setWindowTitle(tr("Simple Paint")); // 设置视图大小 view->setFixedSize(400, 400); // 设置画笔颜色和宽度 QPen pen; pen.setColor(Qt::black); pen.setWidth(3); // 监听视图的鼠标事件 view->viewport()->installEventFilter(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_actionClear_triggered() { // 清空场景中的所有图形项 scene->clear(); } bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if (watched == ui->graphicsView->viewport() && event->type() == QEvent::MouseButtonPress) { // 获取鼠标点击的位置 QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); QPointF pos = ui->graphicsView->mapToScene(mouseEvent->pos()); // 创建一个椭圆图形项并添加到场景中 QGraphicsEllipseItem *ellipse = new QGraphicsEllipseItem(pos.x() - 10, pos.y() - 10, 20, 20); ellipse->setPen(pen); scene->addItem(ellipse); return true; } return QMainWindow::eventFilter(watched, event); } ``` 在这个示例代码中,我们创建了一个QGraphicsScene和一个QGraphicsView,用于显示绘制的图形。然后,我们设置视图的大小并监听视图的鼠标事件。当用户在视图中点击鼠标时,我们获取鼠标点击的位置,创建一个椭圆图形项并添加到场景中。最后,我们设置画笔颜色和宽度,并在清空场景时删除所有图形项。 注意:在这个示例代码中,我们使用了事件过滤器来监听视图的鼠标事件。如果你对事件过滤器不熟悉,可以先了解一下Qt中的事件系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神笔馬良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值