Opencv 图像识别Android实战(识别扑克牌 6.如何获取候选区)

第一节:再谈单步法和两步法

        前面我们说图像识别领域通常有两类方法:一类是单步法,另一类是基于候选区的两步法,常用的单步法多数是基于DNN的方式,能解决更为复杂的问题,但是对设备要求较高,也需要更多的样本,在很多自然场景下对单个类别的样本数据要求可能达到数千张,比较典型的算法是YOLO。基于候选区典型算法比如faster rcnn,目前也是比较成功的,但是目前相对而言YOLO优势更大,速度快,应用广,应用起来也比较简单。 

       上面提到的两类常用算法,都是基于深度神经网络的实现,这样做很多好处,比如更加准确,泛化能力更强等等。但是一旦用上了深度学习就意味着,你的程序会更加复杂,对硬件设备要求更高,否则在某些实时应用场合没有太大的意义,所以深度学习框架一般都是要支持GPU运算来提升速度的。然而在嵌入式设备上通常是没有GPU来加速的,在本例中也是一样,我们还是运用传统的算法来解决这个比较简单而实际的问题,而并不是通过构建神经网络来解决这个问题。

       这样做由很多优势:一、针对这种单一环境下的图像识别处理,本身就只需要用传统算法解决问题,不必要复杂化,二、这种环境下我么得到的样本质量较高,只需要少量样本就可以解决问题,不需要太强的泛化能力也能搞定识别,三、简单的算法和处理过程能提高帧率,使用起来更流畅。事实证明这样做是非常明智的,尤其是在嵌入式设备上,效果是极好的。

      到底用不用深度学习网络,我是这样看的:如果能用传统的算法解决问题就不用DNN的方式,优缺点前面已经提到过了,有些场合必须要用DNN的实现这无可厚非(使用DNN进行图像识别绝非必须的手段,只是很多现成的实现都是基于DNN的)。我觉得再CV领域很多论文都在堆砌网络来实现图像识别,说实话我并不觉得这是一个多么明智的方法,我觉得相比堆砌网络,更为重要的是图像分割技术,只有好的图像分割技术才能更加优雅的解决问题,模仿神经网络的方式到底是不是图像识别的终极方法,或者说是不是一个明智的方向这任然是一个疑问,不少学者已经对深度学习这个方向产生了质疑,认为这门学科是玄学,已经遇到了瓶颈,其实我也有类似的看法:-),深度学习貌似是学术界的时髦产物大家都在研究而已。

第二节:使用Opencv提取候选区域

      这小节将结合实例源码以及Opencv API 来探讨两步法的第一步候选区域的提取。

在这里我们会用到Imgproc.findContours 函数,这个函数在做图像识别的时候经常会被调用到,他主要用来寻找联通区域(或者叫轮廓),他会根据颜色的灰度把输入图像分割成不同大小的小区域,大多数情况下这些区域就是我们要的候选区。比如在本例中,经过findContours 函数拿到的小区域可能就是我们要识别的扑克牌上面的数字或者花色。下面看一下这个函数的C++原型(直接看Demo代码会更好):

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

返回两个值:contours:hierarchy。

参数

第一个参数是寻找轮廓的图像;

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):

    cv2.RETR_EXTERNAL表示只检测外轮廓

    cv2.RETR_LIST检测的轮廓不建立等级关系

    cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。

    cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数method为轮廓的近似办法

    **cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1**,即max(abs(x1-x2),abs(y2-y1))==1

    cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

    cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。

在这里我要重点介绍第二个参数,前两种  cv2.RETR_EXTERNAL和cv2.RETR_LIST,在我实践的过程中我发现只有在传入cv2.RETR_LIST的时候,才能得到足够多的轮廓,从参数的解释来看,这也是合理的,第三个参数选择显得不是那么重要,在本例中我选择了CHAIN_APPROX_SIMPLE,起始选择其他的参数,对本例来说效果上几乎没有差别。

需要注意的是在执行findContours函数的之前还做了一些其他的处理,最主要的就是灰度处理和二值化,其中二值化是findContours函数的要求,必须传入二值化图像,灰度处理则是减少图像干扰的的手段,详细代码见

com.myopencvdemo.PokerRecActivity

经过这一步处理后得到的图像是这样的(待续。。。)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容