Qt Examples之affine工程难点、亮点汇总

开源协作知识库软件AFFINE如何本地部署并结合内网穿透实现远程访问——“cpolar内网穿透” 阅读详情

工程存放的路径在:Examples\Qt-XX.XX.XX\widgets\painting\affine

其中XX.XX.XX为Qt的版本号,如:5.14.1。

该工程有如下个人认为的难点、亮点:

对XFormView类的drawPixmapType函数解释:

void XFormView::drawPixmapType(QPainter *painter)
{
    QPointF center(m_pixmap.width() / qreal(2), m_pixmap.height() / qreal(2));

    /* 将painter移动(ctrlPoints.at(0) - center)距离,也即将HoverPoints类对象pts
       的第一个控制点移动到位图的中心位置,以便第一个控制点绘制在位图的中心*/
    painter->translate(ctrlPoints.at(0) - center);

    // 进行变换,以便位图绕着自己的中心轴旋转
    painter->translate(center);
    painter->rotate(m_rotation);
    painter->scale(m_scale, m_scale);
    painter->shear(0, m_shear);
    painter->translate(-center);

    .............................// 其它代码
}

如果被绘制对象(本例是指m_pixmap对象表示的图片)的中心点和绘图对象painter的中心点不重合,这时候旋转被绘制对象,则这个对象会围绕painter设置的中心点进行旋转,会转一个大圈。那么怎么做才能让它在任何位置的时候,都围绕自己的轴心进行旋转?解决思路如下:

1. 先保存物体在世界坐标系下的坐标,即物体在世界坐标系下的中心点坐标
2. 再将物体移动到世界坐标系的原点。
3. 在世界坐标系的原点旋转好后,再移动回原来的位置,即步骤1中的提到的坐标。

上段代码的思路就是按这样来的。

  • drawTextType函数同drawPixmapType函数,不再赘述。
  • HoverPoints分析

构造函数分析:

HoverPoints::HoverPoints(QWidget *widget, PointShape shape)
	: QObject(widget)
{
	m_widget = widget;
	widget->installEventFilter(this);
	widget->setAttribute(Qt::WA_AcceptTouchEvents);

	m_connectionType = CurveConnection;
	m_sortType = NoSort;
	m_shape = shape;
	m_pointPen = QPen(QColor(255, 255, 255, 191), 1);
	m_connectionPen = QPen(QColor(255, 255, 255, 127), 2);
	m_pointBrush = QBrush(QColor(191, 191, 191, 127));
	m_pointSize = QSize(11, 11);
	m_currentIndex = -1;
	m_editable = true;
	m_enabled = true;

	connect(this, &HoverPoints::pointsChanged,
		m_widget, QOverload<>::of(&QWidget::update));
}

构造函数初始化了一些变量,对各个变量作用解释如下:

  •  m_widget:外层传入的窗体部件对象,也即HoverPoints类附属在哪个窗体上,通过通读代码可以发现其是指外层的XFormView窗体对象。
  • 函数的第5行为外层传入的窗体部件对象安装了事件过滤器。installEventFilter函数的用法请参见《installEventFilter、eventFilter函数理解》
  • 第6行设置触屏事件,从后续代码可以看到本例支持触屏操作。
  • m_connectionType:连接类型。取值为:直线、曲线(贝塞尔曲线)和无
  • m_sortType: 点的排序类型。取值为:不排序、按点的x坐标排序、按点的y坐标排序。
  • m_shape:悬浮点的现状。取值为:圆形、矩形。
  • m_pointPen:用于画悬浮点的画笔。
  • m_connectionPen:用于画连接线的画笔。
  • m_pointBrush:用于点的画刷。
  • m_pointSize:点所在形状的外围矩形宽高。
  • m_currentIndex:当前在控制点容器m_points中的点的索引。
  • m_editable:是否可编辑。
  • m_enabled:是否可用。

     eventFilter 中的鼠标左键按下流程分析:

     如下鼠标左键按下时的流程:(图片下载到本地放大看):

说明:

  1.  本程序不仅支持鼠标还支持触摸显示屏操作。上述流程是支持鼠标且鼠标左键按下流程。
  2. 程序根据m_sortType来决定坐标排序类型,在构造函数中默认不排序。当排序类型为XSort    时,则从控制点的容器m_points中找到第1个横坐标大于鼠标按下时鼠标单击点的横坐标的点。当排序类型为YSort 时,则从控制点的容器m_points中找到第1个纵坐标大于鼠标按下时鼠标单击点的纵坐标的点,并记录该点在m_points中的索引号。这样做的效果是为了实现如下效果:

起始m_points中只有A、B两个控制点,则画出上图类似的A到B的线,当鼠标左键单击的点为C时,且C在A、B之间时,则画出如下直线:

 当C在B 的右侧时,则画出如下的:

3 .鼠标左键按下时,当步骤2完成后,将符合条件的鼠标左键单击时所在的点插入m_points、m_locks,插入的索引号为步骤2记录的索引号然后调用 firePointChange函数。

   4. firePointChange函数中根据m_sortType表示的排序规则将m_points排序。排序后再次从m_points中找到步骤2鼠标左键按下时的点在m_points中的索引m_currentIndex,然后发送pointsChanged信号。

eventFilter 中的触摸事件流程分析:

即QEvent::TouchBegin、QEvent::TouchUpdate、Qt::TouchPointReleased、QEvent::TouchEnd事件。其中最需要搞懂的是QEvent::TouchBegin、QEvent::TouchUpdate中的Qt::TouchPointPressed,实现代码如下:

// find the point, move it
const auto mappedPoints = m_fingerPointMapping.values();
QSet<int> activePoints = QSet<int>(mappedPoints.begin(), mappedPoints.end());
int activePoint = -1;
qreal distance = -1;
const int pointsCount = m_points.size();
const int activePointCount = activePoints.size();
if (pointsCount == 2 && activePointCount == 1)
{ // only two points
    activePoint = activePoints.contains(0) ? 1 : 0;
}
else 
{
    for (int i = 0; i < pointsCount; ++i) 
    {
        if (activePoints.contains(i))
            continue;

        qreal d = QLineF(touchPoint.pos(), m_points.at(i)).length();
        if ((distance < 0 && d < 12 * pointSize) || d < distance) 
        {
            distance = d;
            activePoint = i;
        }

    }
}
if (activePoint != -1) 
{
    m_fingerPointMapping.insert(touchPoint.id(), activePoint);
    movePoint(activePoint, touchPoint.pos());
}

其基本思路是:将触摸点的id和触摸点索引值作为QHash的键值对插入到类型为QHash的成员变量m_fingerPointMapping,以后移动、释放都从m_fingerPointMapping取出相应的点进行操作。

eventFilter 中的QEvent::Paint流程分析:

代码如下:

            QWidget *that_widget = m_widget;
            m_widget = nullptr;
            QCoreApplication::sendEvent(object, event);
            m_widget = that_widget;
            paintPoints();
            return true;

这里需要着重说明的是:在发送QEvent::Paint事件之前必须m_widget将先保存起来(第1句代码),然后将m_widget设置为nullptr(第2句),发送完后再将m_widget恢复为原来的。设置为nullptr是避免eventFilter 函数无限递归调用导致栈耗尽程序崩溃,恢复回来为了下次再次发送QEvent::Paint事件。

updateCtrlPoints函数分析:

void XFormView::updateCtrlPoints(const QPolygonF &points)
{
	QPointF trans = points.at(0) - ctrlPoints.at(0);

	if (qAbs(points.at(0).x() - points.at(1).x()) < 10
		&& qAbs(points.at(0).y() - points.at(1).y()) < 10)
		pts->setPoints(ctrlPoints);
	if (!trans.isNull()) {
		ctrlPoints[0] = points.at(0);
		ctrlPoints[1] += trans;
		pts->setPoints(ctrlPoints);
	}
	ctrlPoints = points;

	QLineF line(ctrlPoints.at(0), ctrlPoints.at(1));
	m_rotation = 360 - QLineF(0, 0, 1, 0).angleTo(line);
	if (trans.isNull())
		emit rotationChanged(int(m_rotation * 10));
}

第3行代码:就是计算通过信号pointsChanged发送过来的m_points第一个控制点和当前的第一个控制点的在x、y坐标上的偏移量。

第5-7行:检测m_points第1个控制点、第2个控制点x、y坐标上的偏移量都小于10,如果是,则控制点还是设置为当前控制点。

第8-11行:如果第3句代码算出的偏移量不为空,则当前第1个控制点更新为m_points中的第1个点,注意:在m_sortType为NoSort时,且鼠标左键按下时,m_points中的第1个点为鼠标左键按下时的点,而在XFormView类的paint函数绘制函数如:drawPixmapType、drawTextType经过如下代码将绘制中心移动到了被绘制对象(如:图片、文本)的中心了(参见前面对drawPixmapType的分析):

painter->translate(ctrlPoints.at(0) - center);

        所以这样造成的现象是鼠标左键在哪单击,被绘制物体的中心就移动到鼠标左键单击的点。

当前第2个控制点累加第3行产生的偏移量,并重新设置HoverPoints类的控制点容器m_points

第15-16行根据更新后的控制点ctrlPoints算出其和水平线的夹角,并设置旋转成员变量m_rotation。根据Qt的元系统属性技术( 属性通过Q_PROPERTY关键字标识),一旦m_rotation被更新,则XFormView类的setRotation函数会自动调用,从而导致被绘制的物体呈现旋转。

程序bug说明:

HoverPoints类的m_sortType 为 XSort或YSort时,会崩溃,更改如下:

movePoint函数加入如下代码:

void HoverPoints::movePoint(int index, const QPointF &point, bool emitUpdate)
{
	// 索引越界了,要判断下
	if ((index < 0) || (m_points.size() <= index) )
	{
		return;
	}

	if ( m_locks.size() <= index )
	{
		return;
	}


   // 其它代码
}

firePointChange()函数加入如下代码:

void HoverPoints::firePointChange()
{
	//    printf("HoverPoints::firePointChange(), current=%d\n", m_currentIndex);

	if (m_sortType != NoSort) {

		QPointF oldCurrent;
		/*if (m_currentIndex != -1) {*/

		// 这里有崩溃,索引越界了,要判断下
		if ((0 <= m_currentIndex) && (m_currentIndex < m_points.size()))
		{
			 
			oldCurrent = m_points[m_currentIndex];
		}

// 其它代码

}

 XFormView类的updateCtrlPoints函数加入如下判断:

void XFormView::updateCtrlPoints(const QPolygonF &points)
{
	// 右键在控制点单击时,这里有崩溃,索引越界了,要判断下
	if (points.size() < 2)
	{
		return;
	}


     ..................
}

未完,待续!

深入解析AGG:高性能2D图形渲染库的核心架构与应用实践 在计算机图形学领域,2D图形渲染是构建用户界面、数据可视化和嵌入式显示系统的核心技术。其基本原理是将矢量几何图元通过坐标变换、路径生成、光栅化等流程转换为像素图像,最终呈现到显示设备。这一技术对于需要高质量图形输出和跨平台兼容性的应用场景具有重要价值,尤其在资源受限的嵌入式环境或需要软件渲染的特定系统中。AGG(Anti-Grain Geometry)作为一个开源的高性能2D图形渲染库,通过模块化的流水线设计和模板元编程技术,实现了对渲染过程的极致控制与优化。它不依赖特定图形API,完全基于CPU进行高质量 阅读详情

相关推荐

使用现代C++开发GBA游戏:Butano引擎入门与实践指南

在嵌入式游戏开发领域,GBA(Game Boy Advance)因其经典的硬件架构和有限的性能资源,成为学习底层图形编程和性能优化的绝佳平台。其核心原理涉及ARM7TDMI处理器、基于图块(Tile)和精灵(Sprite)的图形系统,以及严格的内存与CPU周期管理。掌握这些技术不仅能深入理解计算机图形学基础,更能锤炼极致的代码优化能力。现代C++标准(如C++17/20)的引入,通过智能指针、RAII等特性,显著提升了资源管理的安全性与开发效率。Butano引擎正是这一技术价值的体现,它将现代C++与GBA

weixin_34242331的博客 455

利用QPainter的成员函数translate+rotate实现图片旋转

QPainter 在 paintEvent()函数调用translate + rotate + drawImage 实现CD旋转

EZ1333_F的博客 6308

Halcon印刷检测例程实战解析:从模板匹配到缺陷识别的工业视觉应用

在工业自动化领域,机器视觉是实现产品质量自动化检测的核心技术,其原理是通过图像采集、处理与分析,替代人眼进行测量与判断。基于图像处理与模式识别的传统视觉方案,因其高可控性、强可解释性及对样本依赖低的特点,在工业场景中具有重要技术价值,广泛应用于定位、测量、识别与检测等任务。其中,印刷品质量检测是一个典型应用场景,涉及字符、图案的完整性、位置及外观检查。本文将以Halcon视觉软件中的经典印刷检测例程为切入点,深入剖析其如何结合模板匹配与Blob分析等关键技术,构建稳定可靠的缺陷检测流程,为工程师解决实际工业

weixin_33871366的博客 377

QPainter中坐标系变换问题

解析:这里将(100,100)点作为了原点,所以此时(100,100)就是(0,0)点,以前的(0,0)点就是(-100,-100)点。下面我们只是对坐标系的平移,缩放,旋转,扭曲等应用进行介绍。解析:这里,painter.shear(0,1),是对纵向进行扭曲,0表示不扭曲,当将第一个0更改时就会对横行进行扭曲,关于扭曲变换到底是什么效果,你观察一下是很容易发现的。解析:可以看到,painter.scale(2,2),是将横纵坐标都扩大了两倍,现在的(50,50)点就相当于以前的(100,100)点。

世间所有的相遇都是久别重逢 910

详解Nacos集群搭建

在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出大问题了。因为在企业当中,我们更加强调的是高可用,所以在企业的生产环境下,Nacos一定要做成个集群。

博客 1万+

基于Windows环境的OGG远程抽取异常(经典模式)OGG-02830 Formatting error

MOS提供的解决方法,根据MOS的提示是由于使用的OGG版本太新了,经典模式下已经弃用了这种远程抽取方式。问题:Windows环境下启用远程抽取ADG备库的数据,在启动抽取进程的时候出现如下错误提示。

Mrzhou的博客 380

Qt6教程之三(15) Modbus通信

本篇博客主要介绍Modbus通信!

让每一个想学习编程的人,都能学会,都能看懂,看了都有收获! 1万+

ESP-IDF下载配合MQTT协议接入云平台实例

通过ESP-IDF下载环境搭建,结合MQTT协议实现设备与云平台通信,详解从配置到连接的完整流程,助力物联网应用开发。重点涵盖espidf下载和MQTT集成关键步骤。

weixin_28913879的博客 454

HALCON入门指南:从模板匹配到尺寸测量的工业视觉实战

在工业机器视觉领域,如何快速实现高精度定位与稳定测量,一直是产线落地中的核心挑战。传统图像处理库虽灵活,但在标定、边缘提取和模板匹配等关键环节往往需要投入大量调试成本。HALCON作为商业视觉开发平台,通过封装高性能算子,将亚像素边缘提取、基于形状的模板匹配、手眼标定等复杂功能转化为可调用的标准化模块,配合HDevelop的可视化调试环境,显著提升项目开发效率。从手机中框定位到尺寸测量,再到与C#、Qt的工程集成,HALCON在视觉引导、缺陷检测、3D视觉等场景中展现出极强的实用价值。本文从零开始梳理环境搭

weixin_33858336的博客 358

Anomalies,Factors,andMultiFactorModels

转 Anomalies, Factors, and Multi-Factor Models 作者:石川,量信投资创始合伙人,清华大学学士、硕士,麻省理工学院博士;精通各种概率模型和统计方法,擅长不确定性随机系统的建模及优化。知乎专栏:https://zhuanlan.zhihu.com/mitcshi。未经授权,严禁转载。 摘要:本文解释了异象、因子以及多因子模型的区别和联系;梳理了从异象到因子再...

绿杨 794

24届数字IC设计/验证秋招总结贴——先看这个

为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中整理不易,欢迎订阅~~

qq_42135020的博客 8413

napari图像可视化

napari:基于 Python 编写的快速、交互式多维图像查看器。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 7058

RAG系统中Reranker模型选型实战

本文详细介绍了RAG系统中Reranker模型选型实战,希望能对学习RAG的同学们有所帮助。 文章目录 1. 前言 2. 思路解析 3. 测评数据集构建 3.1 步骤一 3.2 步骤二 3.3 数据示例 3.4 总结 4. 实战代码 4.1 本地模型 4.2 使用第三方的Reranker模型API

herosunly的博客 17万+

Bitcoin Core 中的 libsecp256k1 完全指南:椭圆曲线密码库原理、模块化构建与源码验证

libsecp256k1 是运行在 secp256k1 椭圆曲线上、面向数字签名与其他密码原语的高性能、高可信 C 语言库,它以子目录(subtree)的形式内嵌于本仓库 `src/secp256k1`,是 Bitcoin Core 所有密钥生成、ECDSA/Schnorr 签名与验证、MuSig2 聚合与 BIP-324 传输加密的底层基石。本文将以该库自带文档为主体,结合本仓库的实际集成代码与

gitblog_00446的博客 217

吊打BEVFormer!GaussianBeV实战:用3D高斯开启BEV分割新范式

GaussianBeV是一种基于3D高斯建模的BEV分割新方法,在自动驾驶感知任务中实现了SOTA性能。其核心创新在于将场景元素表示为3D高斯分布,通过均值、协方差和权重精确描述物体位置、形状和置信度,相比传统BEV方法具有更强的空间建模能力。文章详细介绍了GaussianBeV的原理、环境配置、训练推理流程及其在自动驾驶和城市3D重建中的应用,并讨论了优化方向和未来发展趋势。该方法在nuScenes等数据集上表现出色,为BEV分割任务提供了新的解决方案。

m0_71589036的博客 106

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 Var 变量篇】

例如我们已经知道一个符号(可能是变量或者函数)的地址,怎么确定这个地址是一个变量还是一个函数呢?如果是变量的话,变量名是啥?变量定义的位置在哪?如果是函数,函数名是啥?函数定义的位置又在哪呢?查看结构体变量 str_t32 的值。例如我们已经知道了一个符号的地址为。在map文件中的地址为。

CodingCos的博客 2349

FriendlyWrt eMMC 刷机一次成功指南:从下载固件到后台打开的完整路线

用 Actions 自动构建的 [Actions-FriendlyWrt](https://link.gitcode.com/i/2ad0b91701c7c4705b62d43f43cb88a8) 固件,最终都要落在设备里的 eMMC 上才算安装完成。这篇按你实际动手的顺序写:固件怎么拿、两条刷机路线怎么选、Linux / Windows / macOS 各自怎么写、写完之后怎么确认,以及写坏了怎

gitblog_00657的博客 976

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SBC2332 + LVGL 构建低成本嵌入式本地HMI方案

嵌入式人机界面(HMI)是工业设备实现本地交互的核心能力,其本质是在资源受限平台上完成图形渲染、事件响应与实时数据可视化。LVGL作为轻量级开源图形库,凭借极低内存占用(150KB起)、纯C实现、硬件加速兼容性及面向对象的UI模型,成为ARM Cortex-A系列SoC的理想选择。结合SBC2332这类集成Mali-400 GPU与G2D 2D加速引擎的国产嵌入式主板,可构建零授权费、低BOM成本、高实时性的本地HMI系统。该方案规避了Qt等重型框架的资源开销,也绕开了裸写Framebuffer的开发效率瓶

weixin_34269583的博客 343

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Vc - Qt - QPainter translate

Qt QPainter 坐标系平移

莫忘输赢的博客 1545

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Qt QPainter save() restore() translate()

translate(int,int) 设置相对坐标系,x,y 设置完了之后,想恢复之前的坐标系怎么办 可以使用save()保存painter的状态,用完后使用restore()恢复保存的状态 painter->save(); painter->translate(100,100); //绘图...... painter->restore(); ...

Finull1的博客 4944

QT5.14.2 官方例子 - Qt Widgets 9: painting\affine(仿射)

系列总链接: QT5.14.2 官方例子 - 学习系列 https://blog.youkuaiyun.com/qq_22122811/article/details/108007519 项目位置: Examples\Qt-5.14.2\widgets\painting\affine 注:在Examples下的路径 项目模块:widgets\painting 项目描述: 演示了QPainter中仿射变换的工作原理。(图片,文字进行大小,旋转,) 项目效果: 官网讲解: Aff...

MatthewMao 704

QT电容触摸屏使用

2:触摸事件转换为鼠标事件,不用QT自动转换,用自己写的转换,QT的转换有点问题。4:Qt 单指划过默认当成鼠标事件,单指触摸默认转换鼠标事件。1:触摸事件和鼠标事件不是一个事件。3:触摸分为长按与短按。

u012230798的博客 4025

【QT】qOverload函数介绍

该函数返回一个指向重载函数的指针,其中的模板参数是重载函数参数类型的列表(list)。int如果其中有成员函数是const-overloaded类型的,则必须使qConstOverload 和qNonConstOverloadintintqOverload()需要C++14的支持。在C++11风格的代码中,QOverload和注意:Qt会根据《C++ Committee’s Standing Document 6》中的特征测试推荐来检测必要的C++14编译器支持。

qq_43331089的博客 887

手势识别(一)--手势基本概念和ChaLearn Gesture Challenge

以下转自: http://blog.youkuaiyun.com/qq1175421841/article/details/50312565 像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的核心那样,手势(gestures)是Kinect应用程序的核心。和图形用户界面中的数字交互不同,手势是现实生活中存在的动作。如果没有电脑我们就不需要鼠标,但是没了Kinect,手势依然存在

工作笔记 2万+
上一篇: QPushButton延时单击功能
下一篇: installEventFilter、eventFilter函数理解
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值