上次我们成功训练了手掌识别器http://www.cnblogs.com/take-fetter/p/8438747.html,可以成功得到识别的结果如图

接下来需要使用opencv来获取手掌,去除背景部分,这里就需要用到掩膜(mask)、ROI(region of interest)等相关知识,具体的概念还是不讲了,网上很多。

首先从图中根据上次的程序画框部分提取手掌(当然自己截图再保存也可以-.-)如下

接下来讲解一下提取手掌的方法

  1. 将图片copy,并将图片转换为ycrcb模式,根据ycrcb中的肤色获取和手掌颜色相近的部分,生成黑白图片
  2. 使用黑白图片获得最大的轮廓并生成轮廓图片并得到一个近似的椭圆
  3. 根据椭圆角度进行旋转(原图片和黑白图片及轮廓图片同时旋转)以尽可能的将手掌放为竖直
  4. 根据原图片和黑白图片,利用黑白图片作为掩膜,得到的原图片如下:

  

  提取手掌中心:

  算法思想:根据黑白图片,基于距离变换得到手掌中心,并根据最大半径画出手掌的内切圆如图

  

代码如下

 distance = cv2.distanceTransform(black_and_white, cv2.DIST_L2, 5, cv2.CV_32F)
# Calculates the distance to the closest zero pixel for each pixel of the source image.
maxdist = 0
# rows,cols = img.shape
for i in range(distance.shape[0]):
for j in range(distance.shape[1]):
dist = distance[i][j]
if maxdist < dist:
x = j
y = i
maxdist = dist
 cv2.circle(original, (x, y), maxdist, (255, 100, 255), 1, 8, 0)

  提取掌纹

    现在我们已知了圆的半径和圆心坐标,因此可以根据ROI提取出内切正方形(虽然内切正方形会损失很多的信息,但是目前我还没有想到其他的更好的办法),作出正方形如下

作正方形并提取的代码如下

final_img = original.copy()
#cv2.circle() this line
half_slide = maxdist * math.cos(math.pi / 4)
(left, right, top, bottom) = ((x - half_slide), (x + half_slide), (y - half_slide), (y + half_slide))
p1 = (int(left), int(top))
p2 = (int(right), int(bottom))
cv2.rectangle(original, p1, p2, (77, 255, 9), 1, 1)
final_img = final_img[int(top):int(bottom),int(left):int(right)]

运行截图

可以看到出现了灰色部分,按理说是不会存在的,使用cv2.imwrite发现没有出现任何问题,如图

感觉是cv2.imshow对于输出图片的像素大小有一定限制,进行了自动填充或者是默认有灰色作为背景色且比在这里我们提取出的图片要大

代码地址:https://github.com/takefetter/Get_PalmPrint/blob/master/process_palm.py

感谢:

1.https://github.com/dev-td7/Automatic-Hand-Detection-using-Wrist-localisation 这位老哥的repo,基于肤色的提取和形成近似椭圆给我的启发很大(虽然后半部分完全没有用.....)

2.http://answers.opencv.org/question/180668/how-to-find-the-center-of-one-palm-in-the-picture/ 虽然基于距离变化参考至这里的回答,不过也算是完成了提问者的需求。

转载请注明出处http://www.cnblogs.com/take-fetter/p/8453589.html

Python学习-使用opencv-python提取手掌和手心及部分掌纹的更多相关文章

  1. python学习第九讲,python中的数据类型,字符串的使用与介绍

    目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...

  2. python学习第五讲,python基础语法之函数语法,与Import导入模块.

    目录 python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 1.函数语法定义 2.函数的调用 3.函数的文档注释 4.函数的参数 5.函数的形参跟实参 6.函 ...

  3. python学习第三讲,python基础语法之注释,算数运算符,变量.

    目录 python学习第三讲,python基础语法之注释,算数运算符,变量. 一丶python中的基础语法,注释,算数运算符,变量 1.python中的注释 2.python中的运算符. 3.pyth ...

  4. python学习第一讲,python简介

    目录 python学习第一讲,python简介 一丶python简介 1.解释型语言与编译型语言 2.python的特点 3.python的优缺点 二丶第一个python程序 1.python源程序概 ...

  5. Python学习教程(Python学习视频_Python学些路线):Day06 函数和模块的使用

    Python学习教程(Python学习视频_Python学些路线):函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. $$x_1 + x_2 + x ...

  6. python入门灵魂5问--python学习路线,python教程,python学哪些,python怎么学,python学到什么程度

    一.python入门简介 对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入门灵魂5问--python学习路线,python教程,python学哪些,pyth ...

  7. 我的Python学习之路 Python的输入输出与基本数据类型

    *** python中的变量不需要事先声明再使用,而可以直接来一个变量名,后面一个赋值,接着一个数据值,如 hw = "hello python",相当于Python能智能的根据你 ...

  8. 我的Python学习之路 Python的初识与准备工作

    注:文笔不好,不喜勿喷,当个段子看看就好 一.初识Python 第一次听到Python是在2016年大概暑假 时候(即将大三),因为对黑客技术的蜜汁热爱(虽然自己并不会),在玄魂大大的公众微信号中看到 ...

  9. python 学习笔记 9 -- Python强大的自省简析

    1. 什么是自省? 自省就是自我评价.自我反省.自我批评.自我调控和自我教育,是孔子提出的一种自我道德修养的方法.他说:“见贤思齐焉,见不贤而内自省也.”(<论语·里仁>)当然,我们今天不 ...

随机推荐

  1. CentOS系统下Redis安装和自启动配置的步骤

    相信大家都知道Redis是一个C实现的基于内存.可持久化的键值对数据库,在分布式服务中常作为缓存服务.所以这篇文章将详细介绍在CentOS系统下如何从零开始安装到配置启动服务.有需要的可以参考借鉴. ...

  2. mysql 批量更新与批量更新多条记录的不同值实现方法

    作者: 字体:[增加 减小] 类型:转载 时间:2013-10-02 我要评论 在mysql中批量更新我们可能使用update,replace into来操作,下面小编来给各位同学详细介绍mysql ...

  3. 网站地图怎么做?dedecms网站地图制作方法听语音

    网站地图怎么生成?下面分享织梦dedecms系统网站地图的生成方式,怎么制作网站地图,方法很简单.下面介绍一下网站地图优化方法及制作方法. 工具/原料 一个网站 方法/步骤 第一步 登录网站后台 第二 ...

  4. 【编程技巧】EXTJS中Ext.grid.GridPanel配置项autoExpandColumn的使用方法

    autoExpandColumn的作用是自动伸展,占满剩余区域.一般使用在列比较少,并且大多数列都比较窄,有一列比较宽的情况下,当然什么时候使用,还是得按照实际情况确定. 使用的时候主要有三点要注意的 ...

  5. Android调试错误-No resource identifier found for attribute 'showAsAction'

    转载自:http://www.bubuko.com/infodetail-498830.html 1.问题描述: 24\YoumiAndroidSdk\demo\offers\res\menu\mai ...

  6. python基础7之python3的内置函数

    官方介绍: python3:https://docs.python.org/3/library/functions.html?highlight=built#ascii python2:https:/ ...

  7. C# WinForm程序退出的方法比较

    1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit();  强制所有消息中 ...

  8. Hystrix-Dashboard仪表盘

    Hystrix Dashboard,它主要用来实时监控Hystrix的各项指标信息.通过Hystrix Dashboard反馈的实时信息,可以帮助我们快速发现系统中存在的问题.下面通过一个例子来学习. ...

  9. JavaScript ES6 module 模块

    在使用JavaScript开发大型项目时,模块开发概念是一个必须考虑的问题.其目的就是通过命名空间对各类业务对象进行一定的封装,防止命名冲突. 本篇着重介绍ES6 module中的export和imp ...

  10. 反应堆模式(reactor)

    在提到高性能服务器编程的时候肯定有听过reactor模式,如果只是简单的写一个服务器和客户端建立连接的程序来熟悉一下使用socket函数编程,一般这种情况都是同步方式实现的,服务器阻塞等待客户端的连接 ...