OpenCV C++基于极值区域滤波算法的场景文本检测(OCR)

这个程序使用OpenCV text模块实现基于极值区域滤波算法的场景文本检测。

第一组输入输出:

第二组输入输出:

代码:

cpp 复制代码
#include  "opencv2/text.hpp"
#include  "opencv2/highgui.hpp"
#include  "opencv2/imgproc.hpp"

#include  <vector>
#include  <iostream>
#include  <iomanip>

void er_show(vector<Mat> &channels, vector<vector<ERStat> > &regions)
{
    for (int c=0; c<(int)channels.size(); c++)
    {
        Mat dst = Mat::zeros(channels[0].rows+2,channels[0].cols+2,CV_8UC1);
        for (int r=0; r<(int)regions[c].size(); r++)
        {
            ERStat er = regions[c][r];
            if (er.parent != NULL) 
            {
                int newMaskVal = 255;
                int flags = 4 + (newMaskVal << 8) + FLOODFILL_FIXED_RANGE + FLOODFILL_MASK_ONLY;
                floodFill(channels[c],dst,Point(er.pixel%channels[c].cols,er.pixel/channels[c].cols),
                          Scalar(255),0,Scalar(er.level),Scalar(0),flags);
            }
        }
        char buff[20]; char *buff_ptr = buff;
        sprintf(buff, "channel %d", c);
        imshow(buff_ptr, dst);
    }
    waitKey(0);
}

int main()
{
    Mat src = imread("scenetext_segmented_word01.jpg");

    vector<Mat> channels;
    computeNMChannels(src, channels);

    int cn = (int)channels.size();
    for (int c = 0; c < cn-1; c++)
        channels.push_back(255-channels[c]);

    Ptr<ERFilter> er_filter1 = createERFilterNM1(loadClassifierNM1("trained_classifierNM1.xml"),16,0.00015f,0.13f,0.2f,true,0.1f);
    Ptr<ERFilter> er_filter2 = createERFilterNM2(loadClassifierNM2("trained_classifierNM2.xml"),0.5);

    vector<vector<ERStat> > regions(channels.size());
    for (int c=0; c<(int)channels.size(); c++)
    {
        er_filter1->run(channels[c], regions[c]);
        er_filter2->run(channels[c], regions[c]);
    }

    vector< vector<Vec2i> > region_groups;
    vector<Rect> groups_boxes;
    erGrouping(src, channels, regions, region_groups, groups_boxes, ERGROUPING_ORIENTATION_HORIZ);

    er_show(channels,regions);

    er_filter1.release();
    er_filter2.release();
    regions.clear();
    if (!groups_boxes.empty())
    {
        groups_boxes.clear();
    }
}

text模块里有提供trained_classifierNM1.xml和trained_classifierNM2.xml

相关推荐
lichuangcsdn1 小时前
【Spring AI 学习(三)】实现简单的对话
java·人工智能·学习·spring·spring ai
星恒随风1 小时前
C++ 多态底层原理:静态绑定、动态绑定、虚函数表与工程实践
开发语言·c++·笔记·学习
心念枕惊1 小时前
零基础认识大语言模型(LLM)工作原理(9.从聊天机器人到智能体:AI 为什么必须学会完成任务?)
人工智能·语言模型·机器人
IT_陈寒1 小时前
Python的finally居然不等同于Go的defer,差点坑惨我
前端·人工智能·后端
码农学院1 小时前
GEO效果度量体系:AI搜索可见性、引用率与转化追踪的技术实现
人工智能·dubbo
恋猫de小郭1 小时前
给 AI 的 Agent 实现指南,可控 Agent 的关键
前端·人工智能·ai编程
AI导出鸭PC端1 小时前
手机deepseek怎么导出pdf AI导出鸭
人工智能·pdf
蓦然回首却已人去楼空1 小时前
Build a Large Language Model (From Scratch) 第6章 针对分类的微调
人工智能·语言模型·分类