首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从图像中提取数字

从图像中提取数字
EN

Stack Overflow用户
提问于 2015-08-28 02:58:54
回答 1查看 124关注 0票数 2

在这里,我正在尝试获取相等大小的块,以便为OCR应用程序准备好数字

第一次尝试通过按固定步长移动的小代码,在某些位置由于数字之间的空格而跳得很高,主要问题是最后5位,有时是2个数字,然后是3个数字,有时是3个数字,然后是空格,然后是2个数字,如果5个数字很大,最后可能是5个数字

第二次尝试使用FindContour,当它找到对象时,我调整矩形的大小以适合它,但问题是它没有按从左到右或相反的顺序给我数字。

那么我该如何处理呢?

第一次尝试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void DetectEqualRectangles(Mat image){
 resize(image,image,Size(810,52));
int k=0;
for(int i=0;i<14;i++){
    rectangle(image,Point(k,0),Point(45+k,52),Scalar(0,0,255),1,8,0);
    imshow("1",image);
    waitKey(0);
    if(i==0){k+=70;}
    else if(i==2){k+=71;}
    else if(i==4){k+=75;}
    else if(i==6){k+=78;}
    else if(i==8){k+=76;}
    else{k+=50;}
}}

第二次尝试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void DetectUsingContours(Mat image){
resize(image,image,Size(810,52));
Mat gray;int BrightnessIndicator=0;
cvtColor(image,gray,CV_BGR2GRAY);

GaussianBlur(gray,gray,Size(5,5),3,0); // applying a gaussianBlur
BrightnessIndicator=EstimateBrighteness(image); // getting the approximate value for the brightness

cout<<BrightnessIndicator<<endl;
threshold(gray,gray,BrightnessIndicator-33,255,CV_THRESH_BINARY_INV); //thresholding
imshow("s",gray);

vector< vector<Point> > Contour;
findContours(gray,Contour,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);     //finding outer contours
cout<<Contour.size();
for(int i=0;i<Contour.size();i++){

   Rect bounding = boundingRect(Contour[i]);  // draw a rectangle
   if(bounding.x>15 && bounding.x<image.cols-50){bounding.x-=15;bounding.width=50;}
   else if(bounding.x>image.cols-50){bounding.x=image.cols-40;bounding.width=40;}
   else{bounding.x=0;bounding.width=50;}


    bounding.y-=bounding.y;
    bounding.height=image.rows;
  //  rectangle(image,bounding,Scalar(0,255,0),1,8,0);

    Mat CroppedImage=image(bounding);
    stringstream ss;
    ss<<"C:\\Users\\cdc\\Desktop\\GSC\\ExtractingNumbers\\"<<i<<".jpg";
    imwrite(ss.str(),CroppedImage);
    imshow("5",image);
    imshow("23",CroppedImage);
    waitKey(0);
}}

这是原始图像:

EN

回答 1

Stack Overflow用户

发布于 2015-09-04 04:58:56

只需按std::sort对结果进行排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#include <algorithm>
#include <iostream>
#include <sstream>

using namespace cv;
using namespace std;

void DetectUsingContours(Mat &image)
{
    resize(image,image,Size(810,52));
    Mat gray;
    cvtColor(image,gray,CV_BGR2GRAY);

    GaussianBlur(gray,gray,Size(5,5),3,0); // applying a gaussianBlur
    threshold(gray, gray,0, 255,
              CV_THRESH_BINARY_INV | CV_THRESH_OTSU); //thresholding
    imshow("s",gray);

    vector< vector<Point> > Contour;
    findContours(gray,Contour,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);     //finding outer contours
    cout<<Contour.size();
    std::vector<cv::Rect> rects;
    for(size_t i=0;i<Contour.size();i++){

        Rect bounding = boundingRect(Contour[i]);  // draw a rectangle
        if(bounding.x>15 && bounding.x<image.cols-50){bounding.x-=15;bounding.width=50;}
        else if(bounding.x>image.cols-50){bounding.x=image.cols-40;bounding.width=40;}
        else{bounding.x=0;bounding.width=50;}

        bounding.y-=bounding.y;
        bounding.height=image.rows;
        rects.emplace_back(bounding);
    }

    auto func = [](cv::Rect const &lhs, cv::Rect const &rhs)
    {
      return lhs.x < rhs.x;
    };
    std::sort(std::begin(rects), std::end(rects), func);
    for(size_t i = 0; i != rects.size(); ++i){
        Mat CroppedImage=image(rects[i]);
        stringstream ss;
        ss<<"C:/Users/cdc/Desktop/GSC/ExtractingNumbers/"<<i<<".jpg";
        imwrite(ss.str(),CroppedImage);
        imshow("5",image);
        imshow("23",CroppedImage);
        waitKey(0);
    }
}

int main()
{
    DetectUsingContours(cv::imread("tVVEl.jpg"));

    return 0;
}

我使用自适应阈值来做阈值处理,你不需要自己估计亮度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32262667

复制
相关文章
gorm指定外键和关联外键
一直分不清association_foreignkey和foreignkey的作用,此文总结一下
平凡的学生族
2019/12/24
6.9K0
gorm指定外键和关联外键
如何在 macOS 中互换 Control 和 Command 键
习惯用Win电脑,猛然间使用Mac电脑,习惯不了Control键和Command键的位置,希望调换一下它们的位置 。如何在 macOS 中互换 Control 和 Command 键呢?小编为大家带来了详细的调换教程 ,有需要的朋友收藏起来吧!
用户10395188
2023/03/14
4.6K0
如何在git中删除指定的文件和目录
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113172.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
3.6K0
JS中函数作为参数和返回值 15
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> /*let say=function() { console.log("hello world"); } say(); let fn=say; fn(); // 将函数作为其他函数的参数 function test(fn) { /
贵哥的编程之路
2020/10/28
4.7K0
辨析Java方法参数中的值传递和引用传递
小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示。
翎野君
2023/05/12
1.5K0
辨析Java方法参数中的值传递和引用传递
Backbonejs如何在events中传递参数
最近在用Backbonejs做个应用,至于是啥应用大家可以先猜测下,猜中无奖。这次实践应该比之前学习todos那个东西更具有实际意义。其中遇到一个问题,就是如何在event中给函数传递参数。
the5fire
2019/02/28
1.9K0
[Nginx] nginx屏蔽某个url和指定参数访问
有个地址总是被人恶意访问,可以配置nginx屏蔽这个请求 域名/chatIndex?kefu_id=l5702123&ent_id=324 location ~ / {
唯一Chat
2022/01/05
3.9K0
[Nginx] nginx屏蔽某个url和指定参数访问
winhex哈希值校验_文件的哈希值不在指定的目录中
这里记录如何使用这个程序校验文件,网上很多资源的下载很多都会提供文件的md5,SHA256等等之类的哈希值,便于下载者校验文件是否存在被修改,破坏等改变文件内容的操作
全栈程序员站长
2022/10/01
2.7K0
winhex哈希值校验_文件的哈希值不在指定的目录中
helm install 指定参数
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100346.html原文链接:
全栈程序员站长
2021/05/19
1.7K0
helm install 指定参数
helm install 指定参数
Java架构师必看
2021/07/05
1.3K0
helm install 指定参数
替换指定字符串中,键对应的键值
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112613.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
3.8K0
替换指定字符串中,键对应的键值
flutter - 如何在 dart/flutter 中收听流值
如果流不是广播流,则您只能收听一次。 请参阅此 Medium post 以了解有关 Streams 的更多信息。 收听 stream 时,您需要在 _assetsAudioPlayer.currentPosition 函数中添加您的代码。
徐建国
2021/08/30
1.1K0
如何在python中构造时间戳参数
前面有一篇随笔大致描述了如何在jmeter中生成时间戳,这次继续介绍下在用python做接口测试时,如何构造想要的时间戳参数
冰霜
2022/03/19
2.6K0
如何在python中构造时间戳参数
如何在Nginx中拒绝或允许指定的IP
Nginx拒绝或允许指定的IP,并使用模块HTTP访问控制模块(HTTP Access)。 按照规定的顺序检查控制规则,并且将启用与IP匹配的第一个访问规则。
星哥玩云
2022/08/13
1.2K0
如何在 SQL 中查找重复值? GROUP BY 和 HAVING 查询示例教程
如果您想知道如何在表中查找重复值,那么您可以在 SQL 中使用 GROUP BY 和 HAVING 子句。 使用 group by 您可以创建组,如果您的组有超过 1 个元素,则意味着它是重复的。 例如,您需要编写一个 SQL 查询来查找名为 Person 的表中的所有重复电子邮件。 这是一个流行的 SQL Query 面试问题以及 Leetcode 问题。 您可以看到电子邮件 a@b.com 是重复的电子邮件,因为它在表格中出现了两次。 您需要编写一个查询来查找所有重复值。
从大数据到人工智能
2022/03/30
15.4K0
如何在linux系统中创建快捷键
本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/91/
羽翰尘
2019/11/20
2K0
如何在virtualenv环境中安装指定的python版本
指定python版本:virtualenv   -p python执行文件路径     自定义虚拟环境名称。如果文件路径有空格,用引号。
超级小可爱
2023/02/20
7.5K0
词典对象 NSDictionary与NSMutableDictionary
做过Java语言或者 C语言开发的朋友应该很清楚关键字map 吧,它可以将数据以键值对儿的形式储存起来,取值的时候通过KEY就可以直接拿到对应的值,非常方便,是一种非常常用的数据结构。在Objective-C语言中,当然也有这方面的支持,词典对象就是做这个事情的,不过在同一个词典对象中可以保存多个不同类型的数据,不像Java与C只能保存声明的相同类型的数据,这一点还是可以解决不少问题的。 词典的关键字为NSDictionary与NSMutableDictionary。对OC稍有认识的朋友应该从关键字的结构就
猿人谷
2018/01/17
1.3K0
点击加载更多

相似问题

如何在NSDictionary中交换键和值?

21

如何在NSDictionary中添加和检索整数(键和值)

22

NSDictionary键和值的顺序

13

NSDictionary键/值概念

32

如何在iphone的NSDictionary中设置数组的值和键?

51
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文