Qt学习06:QPainter绘画

news2025/2/13 10:04:45

文章首发于我的个人博客:欢迎大佬们来逛逛

Qt学习06:QPainter绘画

Qt绘图

Paint System

Qt的绘制系统支持在屏幕和打印设备上使用相同的API进行绘制,主要基于QPainter、QPaintDevice和QPaintEngine类。

QPainter用于执行绘图操作,QPaintDevice是二维空间的抽象,可以使用QPainter在其上绘图,而QPaintEngine提供了绘图器用于在不同类型的设备上绘图的接口。QPaintEngine类在内部由QPainter和QPaintDevice使用,并且对应用程序程序员隐藏,除非他们创建自己的设备类型。

这种方法的主要好处是,所有的绘制都遵循相同的绘制管道,从而很容易添加对新特性的支持,并为不支持的特性提供默认实现。

基本绘制和填充

QPainter中提供了一些便捷函数来绘制常用的图形,还可以设置线条、边框的画笔以及进行填充的画刷

所有对控件的绘图操作都要放进函数 paintEvent() 中,否则绘图无法显示。

绘制图形

在paintEvent中写如下代码哟~

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawLine(0,0,20,200);

    QPoint p[4] = {{0,0},{50,50},{0,100},{ width(),height()}};
    //把多个点一对一对的连接起来,不是每两个点相连
    painter.drawLines(p,2); //第二个参数是一对点的数量(简单说就是要绘制几条线)
}

这里先创建了一个QPainter对象,使用了QPainter: :QPainter ( QPaintDevice *device )构造函数,并指定了this为绘图设备,即表明在 Widget部件上进行绘制。**使用这个构造函数创建的对象会立即开始在设备上进行绘制,自动调用begin()函数,然后在QPainter的析构函数中调用end()函数结束绘制。**如果构建QPainter对象时不想指定绘制设备,那么可以使用不带参数的构造函数,然后使用QPainter: : begin(QPaintDevice * device)在开始绘制时指定绘制设备,等绘制完成后再调用end()函数结束绘制。

上面函数中的代码等价于:

QPainter painter;
painter.begin(this);
/*绘图...*/
painter.end();

这两种方式都可以完成绘制,无论使用哪种方式,都要指定绘图设备,否则无法进行绘制。

这里简单的绘制了几根线条,除了绘制简单的线条以外,QPainter还提供了一些绘制其他常用图形的函数,其中最常用的几个如下标所示。

函数功能函数功能
drawArc绘制圆弧drawPoint绘制点
drawChord绘制弦drawPolygon绘制多边形
drawConvexPolygon绘制凸多边形drawPolyline绘制折线
drawElipse绘制椭圆drawRect绘制矩形
drawLine绘制线条drawRoundedRect绘制圆角矩形
drawPie绘制扇形fillRect绘制填充矩形

使用画笔(QPen)

如果需要对绘制的线条设置不同的颜色,那么我们就需要给painter设置一个画笔QPen。

Pen有样式(style),宽度(width), 颜色(brush), 笔帽样式(capStyle)和(连接样式)joinStyle。

  • style使用Qt::PenStyle定义线条类型。默认是Qt::PenStyle::SolidLine
  • brush用于填充画笔笔生成的笔触。 使用QBrush类来指定画笔的颜色。
  • capStyle帽样式决定了可以使用QPainter绘制的线结束帽,
  • joinStyle连接样式描述了如何绘制两条线之间的连接。

通过使用相应的setStyle(), settwidth (), setBrush(), setCapStyle()和setJoinStyle()函数,可以很容易地修改各种设置(注意,当改变画笔的属性时,画家的画笔必须重置)。

void setPen(const QPen &pen)
void setPen(const QColor &color)
void setPen(Qt::PenStyle style)

线条样式

style使用Qt::PenStyle定义线条类型,默认是Qt::PenStyle::SolidLine。

void penStyle()
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::RenderHint::Antialiasing); //抗锯齿

    for (int i = 0; i < 6; i++)
    {
        painter.setPen(QPen(Qt::red, 5, Qt::PenStyle(i)));
        painter.drawLine(i * 50, 0, i * 50 + 100, 200);
    }
}

笔帽样式

capStyle帽样式决定了可以使用QPainter绘制的线结束帽。

void capStyle()
{
        QPainter painter(this);
        painter.setRenderHint(QPainter::RenderHint::Antialiasing);

        painter.setPen(QPen(QBrush(Qt::red), 5, Qt::PenStyle::DotLine, Qt::PenCapStyle::FlatCap));
        painter.drawLine(0, 0, 100, 200);

        painter.setPen(QPen(QBrush(Qt::red), 5, Qt::PenStyle::DotLine, Qt::PenCapStyle::MPenCapStyle));
        painter.drawLine(100, 0, 100 + 100, 200);

        painter.setPen(QPen(QBrush(Qt::red), 5, Qt::PenStyle::DotLine, Qt::PenCapStyle::RoundCap));
        painter.drawLine(200, 0, 100 + 200, 200);

        painter.setPen(QPen(QBrush(Qt::red), 5, Qt::PenStyle::DotLine, Qt::PenCapStyle::SquareCap));
        painter.drawLine(300, 0, 100 + 300, 200);
}

连接样式

joinStyle连接样式描述了如何绘制两条线之间的连接。

void joinSytle()
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::RenderHint::Antialiasing);

    int s[] = { Qt::MiterJoin, Qt::BevelJoin, Qt::RoundJoin , Qt::SvgMiterJoin, Qt::MPenJoinStyle};
    for (int i = 0; i < 5; i++)
    {
        painter.setPen(QPen(QBrush(Qt::red), 5, Qt::SolidLine, Qt::PenCapStyle::SquareCap, Qt::PenJoinStyle(s[i])));
        QPoint points[] = { {20 + i * 100,30},{50 + i * 100,60},{100 + i * 100,10} };
        painter.drawPolygon(points, 3);
    }
}

使用画刷(QBrush)

QBrush类提供了画刷来对图形进行填充,一个画刷使用它的颜色和风格(比如它的填充模式)来定义。

Brush有样式(style)、颜色(color)、渐变gradient和纹理(texture)。

  • style使用Qt::BrushStyle定义填充模式。 默认的笔刷样式是Qt::NoBrush
  • color定义填充图形的颜色
  • gradient()定义当前样式为Qt::LinearGradientPattern, Qt::RadialGradientPattern或Qt::ConicalGradientPattern时使用的渐变填充。 当创建QBrush时,通过给QGradient作为构造函数参数来创建渐变笔刷。 Qt提供三个不同的梯度:QLinearGradient, QConicalGradient,和QRadialGradient -所有继承QGradient。
void setBrush(const QBrush &brush)
void setBrush(Qt::BrushStyle style)

填充样式

void brushStyle()
{
    QPainter painter(this);
    painter.setBrush(Qt::red);

    int w = 150;
    int h = 150;
    for (int r = 0; r < 3; r++)
    {
        for (int c = 0; c < 5; c++)
        {
             painter.setBrush(Qt::BrushStyle(r * 5 + c));
             painter.drawRect(c * w, r * h, w, h);
        }
    }
}

颜色填充

void brushStyle()
    {
        QPainter painter(this);
        painter.setBrush(Qt::red);

        int w = 150;
        int h = 150;
        for (int r = 0; r < 3; r++)
        {
            for (int c = 0; c < 5; c++)
            {
                painter.setBrush(QBrush(QColor(58, 118, 198), Qt::BrushStyle(r * 5 + c)));
                painter.drawRect(c * w, r * h, w, h);
            }
        }
    }

纹理填充

void brushStyle()
{
    QPainter painter(this);
    painter.setBrush(Qt::red);
    painter.setBrush(QBrush(QColor(58, 118, 198), QPixmap(PIXMAP_PATH)));
    int w = 150;
    int h = 150;
    for (int r = 0; r < 3; r++)
    {
        for (int c = 0; c < 5; c++)
        {
            painter.drawRect(c * (w + 10), r * h, w, h);
        }
    }
}

渐变填充

Qt目前支持三种类型的渐变填充:

  • **线性渐变(QLinearGradient)**在开始点和结束点之间插入颜色。
  • **径向渐变(QRadialGradient)**在围绕它的圆上的焦点和端点之间插入颜色。
  • **锥形渐变(QConicalGradient)**在中心点周围插值颜色。

可以使用type()函数检索渐变的类型。 每一种类型都由QGradient的一个子类表示。

线性渐变(QLinearGradient)

QLinearGradient 显示从起点到终点的渐变。

在这里插入图片描述

void Widget::linearGradient()
{
    //指定在那两个点之间线性渐变(开始坐标和结束坐标)
    QLinearGradient lgra(0, 0, 100, 100);
    //也可以在构造对象后通过函数,设置开始点和结束点
    //lgra.setStart(0, 0);
    //lgra.setFinalStop(100, 100);

    //用给定的位置(比例:0~1)和颜色设置过度点,在哪里切换颜色
    lgra.setColorAt(0, qRgb(82, 113 ,196));
    lgra.setColorAt(0.48, qRgb(177, 159, 255));
    lgra.setColorAt(1, qRgb(236, 161 ,254));

    //指定如何填充渐变区域之外的区域。
    lgra.setSpread(QGradient::RepeatSpread);

    QPainter painter(this);
    //把渐变色设置给画刷
    painter.setBrush(lgra);
    //绘制矩形,观察渐变区域之外的区域的填充
    painter.drawRect(50, 50, 500, 500);
    //绘制圆形(这里一般和开始点和结束点的坐标对应)
    painter.drawEllipse(0, 0, 100, 100);
}

QLinearGradient 构造函数的第一个参数指定起点,第二个参数指定终点,然后显示渐变。函数setColorAt() 用于设置起点和终点之间要显示的颜色,setSpread() 可以设置起点和终点区域之外的显示模式。

径向渐变(QRadialGradient)

QRadialGradient 类以圆心为中心显示渐变。(cx, cy) 是中点,半径(radius)是以中点为圆心的圆的半径,(fx, fy) 是渐变的起点。

在这里插入图片描述

void radialGradient()
{
    //指定以圆心和半径,以圆心为中心渐变
    QRadialGradient rgra(50,50,50);
    //也可以在构造对象后通过函数,设置开始点和结束点
    //rgra.setCenter(50, 50);
    //下面两个设置半径的功能一样
    //rgra.setRadius(50);
    //rgra.setCenterRadius(50);

    //用给定的位置(比例:0~1)和颜色设置过度点,在哪里切换颜色
    rgra.setColorAt(0, qRgb(82, 113, 196));
    rgra.setColorAt(0.48, qRgb(177, 159, 255));
    rgra.setColorAt(1, qRgb(236, 161, 254));

    //指定如何填充渐变区域之外的区域。
    rgra.setSpread(QGradient::ReflectSpread);

    QPainter painter(this);
    //把渐变色设置给画刷
    painter.setBrush(rgra);
    //绘制矩形,观察渐变区域之外的区域的填充
    painter.drawRect(50, 50, 250, 250);
    //绘制圆形(这里一般和开始指定的渐变坐标一样)
    painter.drawEllipse(0, 0, 100, 100);
}

QRadialGradient 构造函数的第一个参数和第二个参数是 (cx, cy) 坐标,第三个参数是半径,第四个和第五个参数是 (fx, fy) 坐标。

Qt支持简单的和扩展的径向渐变。

简单的径向渐变在围绕它的圆的焦点和端点之间插入颜色。扩展径向梯度在焦点圆和中心圆之间插入颜色。两个圆定义的圆锥体外的点将是透明的。对于简单的径向渐变,焦点被调整到位于中心圆内,而焦点可以在扩展的径向渐变中的任何位置。

在这里插入图片描述

锥形渐变(QConicalGradient)

QConicalGradient圆锥渐变在一个中心点周围逆时针插入颜色, 在 (cx, cy) 坐标上以角度 (angle) 为中心显示渐变。

角度必须在0到360度之间指定。

void conicalGradient()
{
    //指定以圆心和角度进行渐变
    QConicalGradient cgra(50, 50, 0);
    //也可以在构造对象后通过函数,设置圆心和角度
    //cgra.setAngle(0);
    //cgra.setCenter(50, 50);

    //用给定的位置(比例:0~1)和颜色设置过度点,在哪里切换颜色
    cgra.setColorAt(0, qRgb(82, 113, 196));
    cgra.setColorAt(0.48, qRgb(177, 159, 255));
    cgra.setColorAt(1, qRgb(236, 161, 254));

    QPainter painter(this);
    //把渐变色设置给画刷
    painter.setBrush(cgra);
    //绘制矩形,观察渐变区域之外的区域的填充
    painter.drawRect(50, 50, 250, 250);
    //绘制圆形(这里一般和开始指定的渐变坐标一样)
    painter.drawEllipse(0, 0, 100, 100);
}

渐变坐标模式

通过setCoordinateMode()可以设置渐变坐标模式化,此枚举指定渐变坐标如何映射到使用渐变的绘制设备。

QGradient::LogicalMode

这是默认模式。渐变坐标和对象坐标一样是指定的逻辑空间。

void coordinateMode()
{
    QLinearGradient lgra(0, 0, 100, 100);

    //用给定的位置(比例:0~1)和颜色设置过度点,在哪里切换颜色
    lgra.setColorAt(0, qRgb(82, 113, 196));
    lgra.setColorAt(0.48, qRgb(177, 159, 255));
    lgra.setColorAt(1, qRgb(236, 161, 254));

    QPainter painter(this);
    painter.setBrush(lgra);

    painter.drawEllipse(0, 0, 100, 100);
    painter.drawEllipse(100, 0, 100, 100);
    painter.drawEllipse(200, 0, 100, 100);
}

QGradient::ObjectMode

在这种模式下,渐变坐标相对于被绘制对象的边界矩形,(0,0)在左上角,(1,1)在对象的边界矩形的右下角。

void linearGradient()
{
    //这里要改成对象的相对位置
    QLinearGradient lgra(0, 0, 1, 1);
    //设置对象模式
    lgra.setCoordinateMode(QGradient::CoordinateMode::ObjectMode);  ...
}

QGradient::StretchToDeviceMode

在这种模式下,渐变坐标相对于油漆设备的边界矩形,(0,0)在左上角,(1,1)在油漆设备的右下角。

    void linearGradient()
    {
        //这里要改成对象的相对位置
        QLinearGradient lgra(0, 0, 1, 1);
        //设置对象模式
        lgra.setCoordinateMode(QGradient::CoordinateMode::StretchToDeviceMode);

        //用给定的位置(比例:0~1)和颜色设置过度点,在哪里切换颜色
        lgra.setColorAt(0, qRgb(82, 113, 196));
        lgra.setColorAt(0.48, qRgb(177, 159, 255));
        lgra.setColorAt(1, qRgb(236, 161, 254));

        QPainter painter(this);
        painter.setBrush(lgra);
        //测试整个窗口的渐变
        painter.drawRect(0, 0, width(), height());
        painter.drawEllipse(0, 0, 100, 100);
        painter.drawEllipse(100, 0, 100, 100);
        painter.drawEllipse(200, 0, 100, 100);
    }

坐标变换

QTransform 用于指定坐标系的 2D 转换 - 平移、缩放、扭曲(剪切)、旋转或投影坐标系。通常在渲染现图形时使用。

可以使用setMatrix()、scale()、rotate()、translate()和shear()函数来构建QTransform对象。或者,也可以通过应用基本的矩阵操作来构建它。矩阵也可以在构造时定义,并且可以使用reset()函数将其重置为单位矩阵(默认值)。

QPainter具有平移、缩放、剪切和旋转坐标系统的功能,无需使用QTransform。

正常

先来看下正常的使用(可用void QTransform::reset() 重置所有设置)

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    painter.drawPixmap(QPoint(0,0),QPixmap("://images/zay.png"));
}

平移

translate(qreal dx, qreal dy):平移 - 对坐标系沿着 x 轴移动 dx、沿 y 轴移动 dy

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //平移
    painter.translate(120,50);

    painter.drawPixmap(QPoint(0,0),QPixmap("://images/zay.png").scaled(150,150));
}

这里,将坐标原点由 (0, 0) 变为 (120, 50)。

缩放

scale(qreal sx, qreal sy):缩放 - 通过水平的 sx 和垂直的 sy 缩放坐标系

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    painter.setRenderHint(QPainter::RenderHint::Antialiasing);
    //平移
    painter.translate(120,50);
    //缩放
    painter.scale(1.3,1.3);

    painter.drawPixmap(QPoint(0,0),QPixmap("://images/zay.png").scaled(150,150));
}

这里,使绘制的图像缩小到原来的1.3倍。

旋转

rotate(qreal angle, Qt::Axis axis = Qt::ZAxis):旋转 - 对指定的轴用给定的角度逆时针旋转坐标系统

void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);

    painter.setRenderHint(QPainter::RenderHint::Antialiasing);
    static double angle = 0;
    QTransform transform;
    //平移
    transform.translate(120, 50);
    //缩放
    transform.scale(1.3, 1.3);
    //旋转
    //transform.rotate(angle++,Qt::Axis::ZAxis);
    //transform.rotate(angle++,Qt::Axis::XAxis);
    transform.rotate(angle--,Qt::Axis::YAxis);

    //图像中心旋转 1
    //transform.translate(-75, 0);  //75为图片宽度的一半

    painter.setTransform(transform);

    painter.drawPixmap(QPoint(0, 0), QPixmap("./images/zay.png").scaled(150, 150));

    //图像中心旋转 2
    //QPixmap pixmap = QPixmap("./images/zay.png").scaled(150, 150);
    //painter.drawPixmap(QPoint(-pixmap.width()/2, 0), pixmap);
}

错切

图像错切变换也称为图像剪切、错位或错移变换。

shear(qreal sh, qreal sv):错切 - 通过水平的 sh 和垂直的 sv 扭曲坐标系,前面的参数实现横向变形,后面的参数实现纵向变形。当它们的值为 0 时,表示不扭曲。

void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);

    painter.setRenderHint(QPainter::RenderHint::Antialiasing);

    QTransform transform;
    //平移
    transform.translate(120, 50);

    transform.shear(0.5, 0);

    painter.setTransform(transform);

    painter.drawPixmap(QPoint(0,0), QPixmap("./images/zay.png").scaled(150, 150));
}

绘图函数

绘图 API

QPixmap、QImage、QBitmap和QPicture的区别

Qt提供了四种处理图像数据的类:QImage, QPixmap, QBitmap和QPicture。

QImage是为I/O和直接像素访问和操作而设计和优化的,而QPixmap是为在屏幕上显示图像而设计和优化的。 QBitmap只是一个继承了QPixmap的方便类,确保深度为1。 如果QPixmap对象是位图,则isQBitmap()函数返回true,否则返回false。 最后,QPicture类是一个记录和回放QPainter命令的绘图设备。

QPixmap

在pixmap上绘图

QPixmap pixmap(size());
//pixmap.fill();

QPainter painter(&pixmap);
painter.translate(width()/2,height()/2);
painter.setBrush(Qt::green);
painter.drawEllipse(0,0,20,20);

pixmap.save("./aa.png");

QImage

QImage image(size(),QImage::Format_RGBA64);
//pixmap.fill();

QPainter painter(&image);
painter.translate(width()/2,height()/2);
painter.setBrush(Qt::green);
painter.drawEllipse(0,0,20,20);

image.save("./image.png");

QPicture

QPicture picture;

QPainter painter;
painter.begin(&picture);
painter.translate(width()/2,height()/2);
painter.setBrush(Qt::green);
painter.drawEllipse(0,0,20,20);
painter.end();
picture.save("./image.pic");

重演

    QPainter painter(this);
    QPicture picture;
    picture.load("./image.pic");
    picture.play(&painter);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA基础 - SPI机制使用详解(三)

简述 SPI&#xff08;Service Provider Interface的缩写&#xff09; 意思是&#xff1a;“服务提供者的接口”&#xff0c;专门提供给服务提供者或者扩展框架功能的开发者去使用的接口。SPI 将服务接口和服务实现分离开来&#xff0c;将服务调用方和服务实现方进行解耦&#…

Rocketmq面试(四)RocketMQ 的推模式和拉模式有什么区别?

一、PUSH模式 public class Consumer {public static void main(String[] args) throws InterruptedException, MQClientException {// 初始化consumer&#xff0c;并设置consumer group nameDefaultMQPushConsumer consumer new DefaultMQPushConsumer("please_rename_…

基于STM32的重力感应售货机系统设计

一、项目介绍 随着智能物联网技术的不断发展&#xff0c;人们的生活方式和消费习惯也正在发生改变。如今越来越多的人习惯于在线购物、自助购物等新型消费模式&#xff0c;因此智能零售自助柜应运而生。 本项目设计开发一款基于STM32主控芯片的智能零售自助柜&#xff0c;通过…

哪吒汽车,莫做“普信男”

作者 | 魏启扬 来源 | 洞见新研社 今年初&#xff0c;哪吒汽车创始人方运舟和张勇联合发表新年致辞&#xff0c;文末总结说 “2023-2025年&#xff0c;必将是一场艰难的挑战&#xff0c;也是哪吒汽车的生死存亡之战。” 哪吒汽车或许过于敏感了&#xff0c;就今年以来的市场表…

Tensorflow两步安装(超简单)

一、查看python版本&#xff0c;下载对应tensorflow文件 1.Anaconda已安装&#xff0c;找到Anaconda3文件夹&#xff0c;双击打开anaconda prompt&#xff0c;输入python&#xff0c;查看python版本 可以看到我的版本是3.9的 2.进入下面的网站&#xff0c;选择你需要的cpu或g…

【appium】appium自动化入门之API(下)——两万字API长文,建议收藏

目录 Appium API 前言 1.contexts &#xff08;返回当前会话中的上下文&#xff0c;使用后可以识别 H5 页面的控件&#xff09; 2.current_context &#xff08;返回当前会话的当前上下文 &#xff09; 3. context &#xff08;返回当前会话的当前上下文&#xff09; 4.find_e…

Django-搭建sysinfo获取系统信息

文章目录 前言一、项目搭建二、主机信息监控三、Celery定时任务和异步任务 前言 本篇基于&#xff1a;https://github.com/hypersport/sysinfo#readme 使用Django&#xff0c;搭建sysinfo&#xff0c;Linux中,sysinfo是用来获取系统相关信息的结构体 一、项目搭建 &#xff0…

CV方向如何找到适合自己的研究创新点?

做CV的论文创新的一些思路与方向。分别是无事生非&#xff0c;后浪推前浪&#xff0c;推陈出新&#xff0c;出奇制胜。 无事生非 在原始的数据集上加一些噪声&#xff0c;例如随机遮挡&#xff0c;或者调整饱和度亮度什么的&#xff0c;主要是根据具体的任务来增加噪声或扰动&a…

大模型LLM-微调经验分享总结

模型越大对显卡的要求越高&#xff0c;目前主流对大模型进行微调方法有三种&#xff1a;Freeze方法、P-Tuning方法和Lora方法。笔者也通过这三种方法&#xff0c;在信息抽取任务上&#xff0c;对ChatGLM-6B大模型进行模型微调。liucongg/ChatGLM-Finetuning: 基于ChatGLM-6B模型…

I/O设备详解

目录 一. 什么是IO设备 二. IO设备分类 2.1按照使用特性分类 2.2按照传输速率分配 2.3按照信息交换的单位分类 三. IO设备的构成 3.1 IO的机械部件 3.2 IO的电子部件 3.2.1设备控制器&#xff08;IO控制器功能简介&#xff09; 3.2.2设备控制器&#xff08;IO控制器&…

【C++】红黑树的模拟实现

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树结构五、红黑树的插入操作六、红黑树的调整1.叔叔存在且为红2.叔叔不存在或者存在且为黑3.插入完整代码4.总结 七、红黑树的验证八、红黑树的删除九、红黑树与AVL树的比较十、红黑树的应用十一、红黑树…

d2l_第四章学习_Softmax Regression

x.1 Classification 分类问题 x.1.1 Classification和Regression的区别 注意&#xff0c;广义上来讲&#xff0c;Classification/Softmax Regression 和 Linear Regression 都属于线性模型。但人们口语上更习惯用Classification表示Softmax Regression&#xff0c;而用Regres…

C++特殊类的设计与类型转换

特殊类的设计与类型转换 特殊类的设计请设计一个类&#xff0c;只能在堆上创建对象请设计一个类&#xff0c;只能在栈上创建对象请设计一个类&#xff0c;只能创建一个对象(单例模式) C的类型转换 特殊类的设计 请设计一个类&#xff0c;只能在堆上创建对象 通过new创建的类就…

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行硬件触发同步(C++)

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行硬件触发同步&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和触发同步的技术背景Baumer工业相机使用BGAPISDK进行双相机主从相机触发1.引用合适的类文件2.使用BGAPISDK设置主相机硬件触发从…

C++中内存泄漏,内存溢出区别

C/C中内存泄露和内存溢出的区别 注&#xff1a;泄露为没有释放内存&#xff0c;溢出为分配空间不够&#xff0c;数据溢出了 内存溢出&#xff08;out of memory&#xff09;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用。 内存泄漏&#xff08;memory leak&…

【ROS_Driver驱动真实UR机械臂】

【ROS_Driver驱动真实UR机械臂】 1. 前言2. 安装fmauch_universal_robot和驱动3. 仿真3.1 启动gazebo3.2 启动move it规划3.3 启动rviz 4. 运行机械臂4.1 启动rviz4.2 启动示教器程序4.3 启动moveit4.4 启动rviz 5. 一些说明补充5.1 ur_calibration 提取标定信息5.2 自带程序5.…

从原理到实践:使用Mediacodec编码H265并实现解码H265码流

H265 H265&#xff0c;也称为HEVC&#xff08;High Efficiency Video Coding&#xff09;&#xff0c;是一种高效视频编码格式。它是H264&#xff08;AVC&#xff09;的后继者&#xff0c;也是ITU-T和ISO/IEC联合开发的标准。相比H264&#xff0c;H265可以在同样的视频质量下&…

【数据库原理与应用 - 第三章】数据库设计

数据库设计的步骤 需求分析阶段概念模型设计阶段 —— E-R图逻辑模型设计阶段 —— 关系模型物理结构设计阶段 数据库实施阶段数据库运行和维护阶段 目录 数据库设计的步骤 一、需求分析 1、主要任务 2、对象模型 二、数据库概念结构设计 1、概念数据模型 E-R图 1、概念…

Mybatis《学习笔记(22版尚硅谷)》

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c;iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“intern…

C语言中的for循环语句

表达式1&#xff1a;设置初始条件&#xff0c;只执行一次&#xff0c;可以为多个变量设置初始值 表达式2&#xff1a;循环条件表达式&#xff0c;判断是否集训循环 表达式3&#xff1a;执行循环体后再执行 例如&#xff0c;使用for循环打印1-10的数字首先定义整形变量a0&…