Qt5实现可配置截图及基于百度OCR自动识别标题保存文件

2023-11-18

需求:当我在看视频学习的时候,需要屏幕指定区域的内容保存起来,采用常见的XX截图软件,你需要选择区域选择路径保存,把文件命名为有意义的名称,效率极其低下。作为一名计算机专业人员强调思考能力、动手能力和内功修炼层级,所以这点事情还是很简单的。
软件界面
软件界面

项目整体介绍

assist : 主界面,主要包含交互逻辑,多屏支持。
uiservant: 为界面提供辅助函数,其它逻辑处理
winhook: 设置键盘鼠标钩子,取点使用
network: 百度OCR API请求
采用集成工具QtCreator IDE设计师直接布局就OK了,Qt布局功能真心强大。

这里写图片描述

配置文件之Json解析与保存

Qt主要有 QJsonObject,QJsonArray,QJsonParseError, QJsonDocument 实现Json解析与格式化以及保存功能,采用组合的结构性模式。

[
    {
        "automatic_recognition_name_area": "360 184 220 30",
        "screenshot_doc_folder": "D:/CommonUser/Documents/",
        "screenshot_picture_area": "360 150 1140 810",
        "screenshot_picture_prefix_name": "线性代数",
        "subject": "可汗学院_线性代数"
    },
    {
        "automatic_recognition_name_area": "12 27 450 40",
        "screenshot_doc_folder": "D:/CommonUser/Documents",
        "screenshot_picture_area": "00 0 120 200",
        "screenshot_picture_prefix_name": "机器学习",
        "subject": "哈弗公开课_机器学习"
    }
]

对应 Json解析代码

QString Assist::loadConf()
{
    QString key;
    QJsonParseError err;
    QByteArray data;
    QJsonObject obj;
    QJsonObject::iterator it;

    QString OK = m_uiservant.fileReadAll(m_uiservant.getMapString("conf_file_path"), data);
    if(!m_uiservant.isOK(OK))
    {
        return OK;
    }

    QJsonDocument doc = QJsonDocument::fromJson(data,&err);
    if(err.error != QJsonParseError::NoError)
    {
        return "parse json error!";
    }

    if (!doc.isArray())
    {
        return "assist_conf.json error format";
    }

     QJsonArray ary = doc.array();

     for(int i=0;i< ary.size();++i)
     {
        stConf conf;
        obj = ary.at(i).toObject();
        key = "subject";
        if((it = obj.find(key))==obj.end())
        {
           continue;
        }
        conf.qstrSubject = it.value().toString();

        key = "screenshot_picture_prefix_name";
        if((it = obj.find(key))==obj.end())
        {
           continue;
        }
        conf.qstrPicName = it.value().toString();
        // 其它实现...
        m_lsConf.push_back(conf);
     }

     return m_uiservant.SUCCEEDED_STRING;
}

Json 保存

QString Assist::saveConf()
{
    QString qstrFilePath = m_uiservant.getMapString("conf_file_path");
    QJsonObject obj;
    QJsonDocument doc;
    QJsonArray ary;

    for(QList<stConf>::iterator it = m_lsConf.begin(); it!=m_lsConf.end(); ++it)
    {
        obj.insert("subject", it->qstrSubject);
        obj.insert("screenshot_doc_folder", it->qstrDocFolder);
        obj.insert("screenshot_picture_prefix_name", it->qstrPicName);
        obj.insert("automatic_recognition_name_area", it->qstrPicNameArea);
        obj.insert("screenshot_picture_area", it->qstrScrShotArea);
        ary.append(obj);
        obj = QJsonObject();
    }

    doc.setArray(ary);
    QString ret = m_uiservant.fileWrite(qstrFilePath, doc.toJson());
    if(!m_uiservant.isOK(ret))
    {
        return ret;
    }

    return m_uiservant.SUCCEEDED_STRING;
}

屏幕取点之Hook实现

之前做过一个自动化工具,录制屏幕取点采用C#实现,生成自定义脚本文件,获取当鼠标处于停在某处时,按下 Alt 键就生成点坐标。现在由于交互比较简单,采用比较三种交互方式,鼠标左键录制x,y坐标,右键录制w,h, 中间键停止录制。
怎么实现HOOK,参考非常棒的一篇文章:QT中安装不使用dll的全局钩子
采用Windows底层API, SetWindowsHookEx 实现,具体实现参照工程源码。

以下为获取点之后

HHOOK WinHook::keyHook=NULL;
HHOOK WinHook::mouseHook=NULL;
QWidget* WinHook::m_pWidget = NULL;

LRESULT CALLBACK keyProc(int,WPARAM,LPARAM lParam )
{
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
    if(pkbhs->vkCode==VK_F12)
    {
        WinHook::unHook();
    }
    return 0;
}

LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam,LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        LPMOUSEHOOKSTRUCT p = (MOUSEHOOKSTRUCT*)lParam;
        ((Assist*)WinHook::m_pWidget)->acceptPoint(wParam, p->pt.x, p->pt.y);
    }
    return 0;
}

void WinHook::setHook(QWidget* widget)
{
    m_pWidget = widget;
    keyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,GetModuleHandle(NULL),0);
    mouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);
}
void WinHook::unHook()
{
    UnhookWindowsHookEx(keyHook);
    UnhookWindowsHookEx(mouseHook);

    keyHook = NULL;
    mouseHook = NULL;
    m_pWidget = NULL;
}

Qt 右下角弹窗之最简实现

当处于全屏时,需要提示采用保证是否成功,否则没有成功截图不是白忙活了吗?

    label = new QLabel;
    label->setWindowFlags(Qt::FramelessWindowHint|Qt::Popup);
    label->adjustSize();
    label->setWordWrap(true);
    label->setAlignment(Qt::AlignCenter);

注意此处 setWindowFlags Qt::FramelessWindowHint|Qt::Popup,无边框,Qt::Popup 保证全屏下不会被遮挡,这一点很重要!

void Assist::showTips(QString tips, bool bStatusShow, int stayLong)
{
    if(bStatusShow)
    {
        ui->status_label->setText(tips);
    }

    label->setText(tips);
    QRect rect = m_uiservant.getScreenRect();
    label->setMaximumWidth(200);
    label->setMaximumHeight(100);
    label->setMinimumWidth(200);
    label->setMinimumHeight(100);
    QFont font;
    font.setPointSize(12);
    label->setFont(font);
    label->setStyleSheet(QLatin1String("color:red;"));
    label->setGeometry(int(rect.width()-label->width()), int((rect.height()-label->height()-50)), label->width(), label->height());
    label->show();
    QTimer::singleShot(stayLong, this, SLOT(slotHideFinishedLabel()));
}

void Assist::slotHideFinishedLabel()
{
    label->hide();
}

设置位置,采用计时器实现,是不是很简单呢?

百度 OCR 之 Post 请求

Qt浏览器采用Chorm内核,对于网络请求自然不在话下,只不过Qt4与Qt5的迁移变化比较大,还是很痛苦的!前同事为了业务需要,竟然在一个软件里面插入两个Qt浏览器,真挺厉害的!

吐槽一下百度的官方API文档,请求与返回的字段有些出入,有些吐血。第一次使用它,感觉没有阿里/讯飞提供的服务体验棒。不过百度的 OCR 速度还可以,之前采用打码兔平台API(额,最近打码兔平台即将关闭了,辛亏只充5元人民币)

在获取图片文字主要做了三件事:

  1. 注册百度开发者账号,注册应用
  2. 获取上传图片需要的 access_token
  3. 上传Base64+urlencode编码之后的图片。

在第3步操作上花了好几个小时折腾,终于看清并理解含义。

图像数据,base64编码后进行urlencode,
要求base64编码和urlencode后大小不超过4M,
最短边至少15px,最长边最大4096px,
支持jpg/png/bmp格式,当image字段存在时url字段失效

为什么需要 base64编码之后还要进行 urlencode

Base64编码 使用的字符:
大小写字母各26个,
加上10个数字,
加号“+”,斜杠“/”,
一共64个字符,
等号=用来作为后缀用途。
其中的+, /, = 都是需要urlencode的,所以无法取代。

采用 python编码只需要几行代码就实现了

Python 获取 access_token

from urllib import parse,request
import ssl

host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Bjm0X1hsLxrxsyA3hyuSUuke&client_secret=P6CBRGWnmTUSOboM0Dao5ZUI51SW8ODE'
req = request.Request(host,headers={'Content-Type':'application/json; charset=UTF-8'})
res = request.urlopen(req)
res = res.read()
print(res)

Python Post 获取识别结果

from urllib import parse,request
import ssl
import base64
host = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic/token?access_token=24.ae2a4c83a7a4778a2d12395b62b68099.2592000.1529261360.282335-11263768'
with open(r"D:\CommonUser\Documents\BookCode\QT\Test\screen_assist\ss.png", 'rb') as f:
    data = base64.b64encode(f.read())
textmod={'image': data,}
textmod = parse.urlencode(textmod).encode(encoding='utf-8')
req = request.Request(host,headers={'Content-Type':'application/x-www-form-urlencoded'},data=textmod,)
res = request.urlopen(req)
res = res.read()
print(res)

是不是很简答?此处使用我在百度注册的Id,请试一试就好,不然我不高兴就撤销这个应用。

Qt 实现 Post 获取识别结果

OK,试着用Qt实现 Post 请求,实现第三步的功能:

EMRequestTypeFlags NetWorker::fetchPictureOCR(QString access_token,
                                              QByteArray base64_img,
                                              QString language_type,
                                              QString detect_direction,
                                              QString detect_language,
                                              QString probability)
{
    QNetworkRequest request;

    QUrl url("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic");
    QUrlQuery query;
    query.addQueryItem("access_token",access_token);
    url.setQuery(query);
    request.setUrl(url);
    request.setRawHeader(QByteArray("Content-Type"), QByteArray("application/x-www-form-urlencoded"));
    base64_img = base64_img.toPercentEncoding();
    QByteArray postData;
    postData.append(QString("image=").toLatin1()+base64_img);
    postData.append(QString("&language_type="+language_type).toLatin1());
    postData.append(QString("&detect_direction="+detect_direction).toLatin1());
    postData.append(QString("&detect_language="+detect_language).toLatin1());
    postData.append(QString("&probability="+probability).toLatin1());

    QNetworkReply* reply = mNetmanager->post(request,postData);
    reply->ignoreSslErrors();
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));
    mRequest[reply] = emRequestAccessOCR;

    return mRequest[reply];
}

application/x-www-form-urlencoded 格式是一种非常通用数据传输格式,关键字=值&关键字=值 的形式传输数据。

实现base64的urlencod很简单,base64_img.toPercentEncoding(); 关键是一定要理解。

解决 Qt之https传输问题

https和ssl协议广泛应用,Qt并没有直接去实现这些协议,但是内部具有支持调用协议的接口,没有 libeay32.dllssleay32.dll 会爆出一大堆警告,百度API里面明确支持 https 协议,必须要有这两个文件。在本地一搜索,一大堆软件包含这两个dll,比如:QQ,WeChat, IQIYI… 等都含有。我直接采用 WeChat的这两个文件不好使,找到了一篇文章,请参照下载并放在应用程序所在目录。

思考

我一直使用Qt,主要是Qt支持跨平台,安卓,IOS,MAC, Linux, Window, WinCE,车载操作系统 …,而且还和Python完美融合, 具有一些 Python 的影子,事实上现代标准 C++ 也在向 Python学习,不过它花哨的语法,让我有些不爽。

亮点一:我尝试在C++ 中融入脚本的思考,采用典型的词典代替其它变量声明:

void setMapString(QString qstrKey, QString qstrValue);
QString getMapString(QString qstrKey, QString qstrDefaultValue="");

我不希望一个类里面充满了大量的变量声明,统统塞入map里面,整个类就瘦了,干净很多。

亮点二 :代码分层,那些以简单为由,直接把逻辑与界面揉在一起的开发指导人员是在误导他人。

一个看似很简单的软件,其实是花了好几天来完成,做一件事情,不急不躁,坚持做完,你就胜利了。

加好友 & 工程下载

这里写图片描述

下一篇文章预告

当我看到旋转的风车,走动的唐老鸭,米老鼠,我就在想他们只不过是绘画出来的,我怎么能根据一幅画实现线条拆离以及动画的重组? 那么,你有更好的思路吗?欢迎加好友讨论 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt5实现可配置截图及基于百度OCR自动识别标题保存文件 的相关文章

  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 按照约定应返回哪些 REST PUT/POST/DELETE 调用?

    根据 REST 意识形态 PUT POST DELETE 请求的响应正文中应该包含什么 返回码呢 是HTTP OK enough 如果有的话 这种约定的原因是什么 我发现了一篇描述 POST PUT 差异的好文章 发布与放置 http ww
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt:在多个布局中使用一个小部件

    我有一个 QTabBar 所有选项卡都应该有相同的小部件 layout1 gt addWidget w layout2 gt addWidget w 然而打电话addWidget第二次导致该小部件在第一个布局中消失 有没有办法使用一个小部件
  • 如何使用 Chai Http 发布对象数组

    我正在尝试发布一个对象数组ChaiHttp https github com chaijs chai http像这样 agent post route to api send locations lat lat1 lon lon1 lat
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 使用python将json和文件发送到flask

    我遇到这个问题 我试图在单个函数中向 Flask API 发送 接收一些文件和 JSON 在我的客户端 发件人 上我有 my json to be sent datas var1 var1 var2 var2 my file to be s
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • 使用 WCF 支持“application/x-www-form-urlencoded”发布数据的最佳方式?

    我正在基于 W3C 规范构建 WCF 服务 该规范定义了接受 application x www form urlencoded 发布数据的 RESTful Web 服务端点 默认情况下 WCF 不支持这种类型的消息编码 我发现了许多创建如
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub

随机推荐

  • 设计模式——Visitor(访问者)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 Java实际应用举例 以ASM技术为例 4 1 被访问对象 ClassReader 4 2 Visitor ClassVisitor 4 3 具体visitor
  • web渗透测试学习路线

    web渗透学习路线 文章目录 web渗透学习路线 前言 一 web渗透测试是什么 二 web渗透步骤 1 前期工作 2 中期提高 3 后期打牢 总结 前言 本文整理的学习路线 清晰明了 重点分明 能快速上手实践 相信想学的同学们都能轻松学完
  • Stable Diffusion入门笔记(自用)

    学习视频 20分钟搞懂Prompt与参数设置 你的AI绘画 咒语 学明白了吗 零基础入门Stable Diffusion 保姆级新手教程 Prompt关键词教学 哔哩哔哩 bilibili 1 图片提示词模板 2 权重 提示词 无数字 fl
  • 如何编译火狐浏览器的源代码

    以下摘录于 http zhidao baidu com question 33214960 html 源代码编译安装Firefox linux下 http forums mozine cn index php showtopic 601 W
  • Goland2023版新UI的debug模式调试框按钮功能说明

    一 背景 Jetbrains家的IDE的UI基本都是一样的 debug模式的调试框按钮排列也是一致的 但是在我使用Goland2023版的新UI时 发现调试框的按钮变化还是很大的 有一些按钮被收起来了 如果看之前的博客会发现有一些文中的旧U
  • 自绘CComboBox

    转自 http www gymsaga com mfc 419 html 先介绍基本ComboBox 风格 列表框何时可见 静态控件还是编辑控件 Simple 包括下拉框一直可见 编辑控件 Drop down 可编辑 下拉框 点击可见 编辑
  • 数字逻辑笔记7丨2.5逻辑函数卡诺图化简法

    卡诺图的构成 1 卡诺图的构成 一种图形化简法 在逻辑设计中广泛应用 卡诺图 一种平面方格图 每个小方格代表一个最小项 又叫 最小项方格图 卡诺图可以视为真值表图形化的结果 n个变量的真值表是用2的n次方行给出变量的2的n次方种取值 每行取
  • laravel框架 - 安装初步使用学习 composer安装

    一 什么是laravel框架 Laravel框架可以开发各种不同类型的项目 内容管理系统 Content Management System CMS 是一种比较典型的项目 常见的网站类型 如门户 新闻 博客 文章等 都可以利用CMS进行搭建
  • Shiro权限管理框架

    Shiro 一 Shiro权限 什么是权限控制 忽略特别细的概念 比如权限能细分很多种 功能权限 数据权限 管理权限等 理解两个概念 用户和资源 让指定的用户 只能操作指定的资源 CRUD 初学javaweb时怎么做 Filter接口中有一
  • 153、有效三角形的个数

    题目描述 给定一个包含非负整数的数组 你的任务是统计其中可以组成三角形三条边的三元组个数 示例 1 输入 2 2 3 4 输出 3 解释 有效的组合是 2 3 4 使用第一个 2 2 3 4 使用第二个 2 2 2 3 注意 数组长度不超过
  • 为 Vue 编写一个插件

    1 介绍 以编写Vue日志插件为例 讲述从插件的开发到部署 原文 https lluvio github io blog plugin for vuejs html 2 代码初始 不用一步到位开发插件 先抛开 Vue保证自己的代码能够运行
  • 数字IC后端笔试500题出炉(附答案)

    数字IC后端笔试500题出炉 附答案 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 吾爱 IC 社区 吾爱 IC 社区 52 ic com 是一个专业交流和分享数字 IC 设计与实现技术与经验的
  • element-ui table 某列数据后加上单位,排序不正确

    根据项目需要 在时间列 需要显示分秒 而后台返回的值是秒 前端需要转换 页面显示如下 转换之后 点击排序发现 数据展示的顺序是错乱的 如下图 解决方法 在请求数据后 给数组多加一个字段 用来后面排序 注 flightTime是处理后 页面显
  • Charles 学习心得,Mac环境下解决https乱码,以及火狐浏览器配置https后无法上网的问题

    网上有很详细的ssl证书配置方法 此处不再赘述 简要的过程 Charles help ssl proxying install charles root certificate 将证书设置成始终信任 移动端 安卓 iOS 中 将WiFi里面
  • 【分布式设计与开发3】什么是分布式架构设计中的CAP原理

    分布式系统 CAP原理 架构设计 一 引言 在2000年7月ACM 美国计算机协会 组织的PODC PrinciplesofDistributedComputing分布式计算原理 会议上 UCBerkeley大学的EricA Brewer教
  • Foo bar 什么鬼?

    相信大家对于 foo 和 bar 这两个单词一定再熟悉不过了 它们是计算机图书中最常使用的变量名 不同的字典对 foo 的解释相去甚远 一说来自中国 福 字的发音 又有解释为二战时期的一种武器 其实将 foo 和 bar 组合在一起所构成的
  • [CVPR‘22] DTLD: Towards Accurate Facial Landmark Detection via Cascaded Transformers

    paper https openaccess thecvf com content CVPR2022 papers Li Towards Accurate Facial Landmark Detection via Cascaded Tra
  • Python - 嵌入式数据库Sqlite3的基本使用

    SQLite是一种轻量级的嵌入式关系型数据库管理系统 而Python标准库中提供了与SQLite交互的模块 sqlite3 下面是一个Python 3中使用sqlite3模块的详细示例与解析 import sqlite3 创建或连接数据库
  • 多任务学习

    一 单任务学习和多任务学习 多任务学习是和单任务学习对应的一种机器学习方法 单任务学习 在单任务学习中 认为不同任务之间是不具有关联性的 因此 每个模型的参数都是独立训练的 这样的学习方法有两个缺陷 由于每个任务中的训练数据有限 因此所训练
  • Qt5实现可配置截图及基于百度OCR自动识别标题保存文件

    需求 当我在看视频学习的时候 需要屏幕指定区域的内容保存起来 采用常见的XX截图软件 你需要选择区域选择路径保存 把文件命名为有意义的名称 效率极其低下 作为一名计算机专业人员强调思考能力 动手能力和内功修炼层级 所以这点事情还是很简单的