中文手写数据生成基于paddleocr和textrenderer-大幅提高中文识别准确率


参考

主要是参考了这位大佬的工作 ,大佬说生成都是灰度图,因为考虑样本多样性,主要介绍如何生成彩色图片,字典文件和其他参数都类似
PaddleOCR数字仪表识别——2(New). textrenderer使用及修改使之符合PaddleOCR数据标准

一、textrenderer更多参数解释

在我做的时候自己摸索了一些比较有用的可以实现更多效果的参数

代码如下(示例):

chn_data = GeneratorCfg(
            # 1.修改生成图片数量
        num_image=400000,
        save_dir=OUT_DIR ,
        render_cfg=RenderCfg(
            bg_dir=BG_DIR,
            perspective_transform=perspective_transform,
            corpus=CharCorpus(
                CharCorpusCfg(
                    text_paths=[TEXT_DIR / "chn_text.txt"],
                    filter_by_chars=True,
                    chars_file=CHAR_DIR / "chn.txt",
                    length=(5,11),
                    char_spacing=(-0.1, 0),
                    # 固定生成某种字体颜色
                    #text_color_cfg=FixedTextColorCfg(),
                    #根据图片背景底色去随机生成灰度字
                    text_color_cfg= SimpleTextColorCfg(alpha=(110, 255)),
                    **font_cfg
                ),
            ),
            # 2.图片增强效果开启
            corpus_effects=Effects([OneOf([DropoutRand(), DropoutVertical()])]),
            # 3. 图像是否要生成彩色false 彩色
            gray=False,
            
        ),
    )

二、准备手写字体文件

1 百度云资源:链接:https://pan.baidu.com/s/1LqTnMvkq3pEwcKGaCcg1oA
提取码:2lb5
该资源有5个多G的字体文件,可自选

2 经过测试的在程序中使用过的 中文名称进行修改 可以直接在项目中导入使用的
字体文件

效果展示

效果展示如下,生成的数据可用于手写识别训练
在这里插入图片描述
训练识别结果:
在这里插入图片描述

如果对该项目有想法或者可以提升的地方,欢迎私信我或者邮件505991554@qq.com

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个在QOpenGLWidget中使用QOpenGLBuffer和freetype渲染汉字的程序。这个程序通过使用FreeType库,将一个Unicode字符串转换为纹理并将其渲染到OpenGL上下文中。 ```cpp #include <QtGui/QOpenGLFunctions> #include <QtGui/QOpenGLShaderProgram> #include <QtGui/QOpenGLBuffer> #include <ft2build.h> #include FT_FREETYPE_H class TextRenderer : protected QOpenGLFunctions { public: TextRenderer(QOpenGLWidget* widget) : m_widget(widget) , m_program(nullptr) , m_vbo(QOpenGLBuffer::VertexBuffer) , m_texture(0) { // Initialize FreeType library FT_Library ft; if (FT_Init_FreeType(&ft)) { qWarning("Failed to initialize FreeType library"); return; } // Load font face FT_Face face; if (FT_New_Face(ft, "/path/to/font.ttf", 0, &face)) { qWarning("Failed to load font face"); return; } // Set font size FT_Set_Pixel_Sizes(face, 0, 48); // Create shader program m_program = new QOpenGLShaderProgram(m_widget); m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, "attribute vec4 vertex;\n" "uniform mat4 matrix;\n" "varying vec2 texCoord;\n" "void main() {\n" " gl_Position = matrix * vertex;\n" " texCoord = vertex.zw;\n" "}\n" ); m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, "uniform sampler2D texture;\n" "uniform vec4 color;\n" "varying vec2 texCoord;\n" "void main() {\n" " gl_FragColor = color * texture2D(texture, texCoord);\n" "}\n" ); m_program->link(); // Create VBO GLfloat vertices[] = { // Position TexCoord 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, }; m_vbo.create(); m_vbo.bind(); m_vbo.allocate(vertices, sizeof(vertices)); // Create texture glGenTextures(1, &m_texture); glBindTexture(GL_TEXTURE_2D, m_texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Set up font rendering parameters glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); // Clean up FreeType library FT_Done_Face(face); FT_Done_FreeType(ft); } ~TextRenderer() { m_vbo.destroy(); glDeleteTextures(1, &m_texture); delete m_program; } void renderText(const QString& text, const QPointF& position, const QColor& color) { if (!m_program) return; // Bind shader program m_program->bind(); // Enable blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Set color uniform m_program->setUniformValue("color", color); // Set matrix uniform QMatrix4x4 matrix; matrix.setToIdentity(); matrix.translate(position.x(), position.y(), 0.0f); matrix.scale(textWidth(text), textHeight(text), 1.0f); m_program->setUniformValue("matrix", matrix); // Bind texture glBindTexture(GL_TEXTURE_2D, m_texture); // Enable vertex attribute array m_program->enableAttributeArray("vertex"); m_program->setAttributeBuffer("vertex", GL_FLOAT, 0, 4); // Render each character GLfloat x = 0.0f; GLfloat y = 0.0f; for (int i = 0; i < text.length(); ++i) { renderChar(text[i], x, y); } // Disable vertex attribute array m_program->disableAttributeArray("vertex"); // Disable blending glDisable(GL_BLEND); // Release shader program m_program->release(); } private: QOpenGLWidget* m_widget; QOpenGLShaderProgram* m_program; QOpenGLBuffer m_vbo; GLuint m_texture; void renderChar(QChar character, GLfloat& x, GLfloat& y) { // Initialize FreeType library FT_Library ft; if (FT_Init_FreeType(&ft)) { qWarning("Failed to initialize FreeType library"); return; } // Load font face FT_Face face; if (FT_New_Face(ft, "/path/to/font.ttf", 0, &face)) { qWarning("Failed to load font face"); return; } // Set font size FT_Set_Pixel_Sizes(face, 0, 48); // Load glyph if (FT_Load_Char(face, character.unicode(), FT_LOAD_RENDER)) { qWarning("Failed to load glyph"); return; } // Create texture glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, face->glyph->bitmap.width, face->glyph->bitmap.rows, 0, GL_RED, GL_UNSIGNED_BYTE, face->glyph->bitmap.buffer); // Calculate character position and advance GLfloat xpos = x + face->glyph->bitmap_left; GLfloat ypos = y - face->glyph->bitmap_top; GLfloat w = face->glyph->bitmap.width; GLfloat h = face->glyph->bitmap.rows; x += (face->glyph->advance.x >> 6); // Update vertex buffer with new character position and texture coordinates GLfloat vertices[] = { xpos, ypos + h, 0.0f, 0.0f, xpos + w, ypos, 1.0f, 1.0f, xpos, ypos, 0.0f, 1.0f, xpos, ypos + h, 0.0f, 0.0f, xpos + w, ypos + h, 1.0f, 0.0f, xpos + w, ypos, 1.0f, 1.0f, }; m_vbo.bind(); m_vbo.write(0, vertices, sizeof(vertices)); // Draw character glDrawArrays(GL_TRIANGLES, 0, 6); // Clean up FreeType library FT_Done_Face(face); FT_Done_FreeType(ft); } int textWidth(const QString& text) { int width = 0; for (int i = 0; i < text.length(); ++i) { // Initialize FreeType library FT_Library ft; if (FT_Init_FreeType(&ft)) { qWarning("Failed to initialize FreeType library"); return 0; } // Load font face FT_Face face; if (FT_New_Face(ft, "/path/to/font.ttf", 0, &face)) { qWarning("Failed to load font face"); return 0; } // Set font size FT_Set_Pixel_Sizes(face, 0, 48); // Load glyph if (FT_Load_Char(face, text[i].unicode(), FT_LOAD_RENDER)) { qWarning("Failed to load glyph"); return 0; } // Add glyph advance to width width += (face->glyph->advance.x >> 6); // Clean up FreeType library FT_Done_Face(face); FT_Done_FreeType(ft); } return width; } int textHeight(const QString& text) { // Initialize FreeType library FT_Library ft; if (FT_Init_FreeType(&ft)) { qWarning("Failed to initialize FreeType library"); return 0; } // Load font face FT_Face face; if (FT_New_Face(ft, "/path/to/font.ttf", 0, &face)) { qWarning("Failed to load font face"); return 0; } // Set font size FT_Set_Pixel_Sizes(face, 0, 48); // Get font height int height = face->size->metrics.height >> 6; // Clean up FreeType library FT_Done_Face(face); FT_Done_FreeType(ft); return height; } }; ``` 这个程序包含一个名为TextRenderer的类,它可以在QOpenGLWidget上渲染Unicode字符串。该类使用FreeType库将字符串转换为纹理,并使用QOpenGLBuffer和着色器程序将其渲染到OpenGL上下文中。要使用此类,请将其实例化并在QOpenGLWidget的paintGL()函数中调用renderText()函数。例如: ```cpp void MyOpenGLWidget::paintGL() { // Initialize OpenGL functions initializeOpenGLFunctions(); // Clear the background glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // Render some text TextRenderer textRenderer(this); textRenderer.renderText("你好,世界!", QPointF(0.0f, 0.0f), QColor(0, 0, 0)); } ``` 在这个例子中,我们使用TextRenderer类在QOpenGLWidget上渲染“你好,世界!”。该字符串的颜色为黑色,并出现在左上角。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值