本文区分”问题引出“、”概念抽象“、”算法实现“三个部分由表及里具体讲解OpenCV图像处理中“投影技术”的使用,并通过”答题卡识别“”OCR字符分割”“压板识别”“轮廓展开分析”四个的例子具体讲解算法使用。使得读者能够对“投影技术”加速认识和理解,从而在解决具体问题的时候多一个有效方法。
内容将涉及如下:

1. “投影技术”的基本概念
2. “投影技术”的数学抽象
3. “投影技术”的算法实现
4. “投影技术”在“答题卡识别”场景下的使用
5. “投影技术”在“OCR 字符分割”场景下的使用
6. “投影技术”在“压板识别”例子中的使用
7. “投影技术”在“树叶轮廓分析”中的使用
8. 如何在解决实际问题的时候采用灵活的方法

一、问题引出“
        我第一次集中遇到需要“投影”技术解决的问题,是在“答题卡”项目中。
标准图 实际采集图
在这样采集到的图像中,大量存在黑色的定位区块:
如果进一步定位,可以得到这样的结果:
如果做成连续图像
在这波峰波谷中,存在着的“量化”结果,对应了答题卡中的定位关系。
二、概念抽象

在前面的分析里,我们已经基本建立起“投影”的概念。从离散的角度来说,也就是:

局部最大值:F(x)>F(x−1)且F(x)>F(x+1)

局部最小值:F(x)<F(x−1)且F(x)<F(x+1)

类似于求极值、求切线等的情况。

三、算法实现
//投影到x或Y轴上,上波形为vup,下波形为vdown,gap为误差间隔

void projection2(Mat src,vector<int>& vup,vector<int>& vdown,int direction = DIRECTION_X,int gap = 10);

void projection2(Mat src, vector<int>& vup, vector<int>& vdown, int direction, int gap) {
    Mat tmp = src.clone();
    vector<int> vdate;
    if (DIRECTION_X == direction) {
        for (int i = 0; i < tmp.cols; i++) {
            Mat data = tmp.col(i);
            int itmp = countNonZero(data);
            vdate.push_back(itmp);
        }
    }
    else {
        for (int i = 0; i < tmp.rows; i++) {
            Mat data = tmp.row(i);
            int itmp = countNonZero(data);
            vdate.push_back(itmp);
        }
    }
    //整形,去除长度小于gap的零的洞
    if (vdate.size() <= gap)
        return;
    for (int i = 0; i < vdate.size() - gap; i++) {
        if (vdate[i] > 0 && vdate[i + gap] > 0) {
            for (int j = i; j < i + gap; j++) {
                vdate[j] = 1;
            }
            i = i + gap - 1;
        }
    }
    //记录上下沿
    for (int i = 1; i < vdate.size(); i++) {
        if (vdate[i - 1] == 0 && vdate[i] > 0)
            vup.push_back(i);
        if (vdate[i - 1] > 0 && vdate[i] == 0)
            vdown.push_back(i);
    }
}

在具体使用过程中,注意相关控制变量的管理。
四、问题迁移
1、OCR字符分割
通过看字符的特点,里面加了一些单个点的干扰,可以通过纵向投影来过滤,编写代码,查看特征
在这样的OCR识别中,首先可以通过投影的方法,实现字符的分割。
2、
压板识别

在这样的项目中,同样可以通过投影的方法,获得各个压板的准确定位。
3、轮廓展开分析
在类似树叶这样的测量中,可以通过“极坐标转换”,将树叶的这样的曲线转换成可以分析的投影,从而得到比如“树叶有多少个分叉”“有无缺陷”这样的定量信息。

OpenCV图像处理中“投影技术”的使用的更多相关文章

  1. OpenCV图像处理中的“机器学习"技术的使用

    注意,本文中所指"机器学习"(ML)技术,特指SVM.随机森林等"传统"技术. 一.应用场景        相比较当下发展迅速的各路"端到端" ...

  2. OpenCV图像处理中常用函数汇总(1)

    //俗话说:好记性不如烂笔头 //用到opencv 中的函数时往往会一时记不起这个函数的具体参数怎么设置,故在此将常用函数做一汇总: Mat srcImage = imread("C:/Us ...

  3. OpenCV图像处理中常用函数汇总(2)

    // 霍夫线变换 hough vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合 HoughLines(dstImage,lines,,CV_ ...

  4. paper 119:[转]图像处理中不适定问题-图像建模与反问题处理

    图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...

  5. Zedboard甲诊opencv图像处理(三)

    整个工程进展到这一步也算是不容易吧,但技术含量也不怎么高,中间乱起八糟的错误太烦人了,不管怎么样,现在面临了最大的困难吧,图像处理算法.算法确实不好弄啊,虽然以前整过,但都不是针对图像的. 现在的图像 ...

  6. Python+OpenCV图像处理(八)—— 图像直方图

    直方图简介:图像的直方图是用来表现图像中亮度分布的直方图,给出的是图像中某个亮度或者某个范围亮度下共有几个像素.还不明白?就是统计一幅图某个亮度像素数量.比如对于灰度值12,一幅图里面有2000 个像 ...

  7. OpenCV图像处理篇之边缘检测算子

    OpenCV图像处理篇之边缘检测算子 转载: http://xiahouzuoxin.github.io/notes/ 3种边缘检测算子 一阶导数的梯度算子 高斯拉普拉斯算子 Canny算子 Open ...

  8. Python+OpenCV图像处理(十四)—— 直线检测

    简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...

  9. Python+OpenCV图像处理(九)—— 模板匹配

    百度百科:模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题.它是图像处理中最基本.最常用的匹配方法.模板匹配具有自身的局限性, ...

随机推荐

  1. Django : Security in Django

    Security in Django https://docs.djangoproject.com/en/1.10/topics/security/ 1 Cross site scripting (X ...

  2. 高阶函数 HOF & 高阶组件 HOC

    高阶函数 HOF & 高阶组件 HOC 高阶类 js HOC 高阶函数 HOF 函数作为参数 函数作为返回值 "use strict"; /** * * @author x ...

  3. React Hooks: useCallback All In One

    React Hooks: useCallback All In One useCallback https://reactjs.org/docs/hooks-reference.html#usecal ...

  4. js 实现各种数据结构 APP

    js 实现各种数据结构 APP 常见数据结构: 数组,队列,栈,堆,链表,集合,字典,散列表,树, 图 Array, Queue, Link, Collection, Set,Map, HashMap ...

  5. Make one your own Online Video Recorder by using WebRTC & vanilla javascript

    Make one your own Online Video Recorder by using WebRTC & vanilla javascript Online Video Record ...

  6. css border-radius & yin-yang & taiji

    css border-radius & yin-yang & taiji solution css border-radius & tabs effect https://co ...

  7. map & scale bug

    map & scale TW bug https://antv.alipay.com/zh-cn/g2/3.x/demo/map/drill-down.html import React, { ...

  8. Renice INC:不同颜色的酒帽所代表的意义

    酒帽就是酒瓶上方的热缩胶帽/锡帽/蜡封,也就是开瓶前要割掉的那一层保护物,所有的法国酒在酒帽上,都会有一个圆形贴纸,除了有不同颜色外,上面还有一串号码,有可能很多人在喝酒时都不会对这个酒帽有更多的在意 ...

  9. 死磕Spring之IoC篇 - Bean 的“前身”

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  10. 扒几个 3D 模型备用

    前言 在上一篇中,我展示了 OpenGL 开发的基本过程,算是向 3D 世界迈出的一小步吧.对于简单的 3D 物体,比如立方体.球体.圆环等等,我们只需要简单的计算就可以得到他们的顶点的坐标.但是仅仅 ...