python提取手掌和手心及一些掌纹,绘图功效

上次大家成功磨练了手掌识别器

Python学习-使用opencv-python提取手掌和手心及部分掌纹,

上次我们成功磨练了手掌识别器

亚洲必赢官网 1

接下去须求利用opencv来博取手掌,去除背景有个别,这里就必要用到掩膜(mask)、ROI(region
of interest)等休戚相关文化,具体的定义还是不讲了,网上海人民广播广播台湾大学。

先是从图中依照上次的程序画框部分提取手掌(当然本人截图再保存也能够-.-)如下

 亚洲必赢官网 2


1图像矩

亚洲必赢官网 3

接下去讲解一下领取手掌的措施

python提取手掌和手心及一些掌纹,绘图功效。  亚洲必赢官网 4

主站:http://ex2tron.top
原文:Python+OpenCV教程8:绘图成效

帮你总计壹些天性,比如重点,面积等。

接下去须求运用opencv来获取手掌,去除背景有个别,那里就需求用到掩膜(mask)、ROI(region
of interest)等辅车相依文化,具体的定义依然不讲了,网上海人民广播电视台湾大学。

  提取手掌核心:

  算法思想:依照黑白图片,基于距离变换获得手掌宗旨,并依据最大半径画入手掌的内切圆如图

  亚洲必赢官网 5

代码如下

 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)

函数cv贰.moments()会给你2个字典,包罗全数矩值

先是从图中依照上次的顺序画框部分提取手掌(当然本身截图再保存也得以-.-)如下

   提取掌纹

    未来我们已知了圆的半径和圆心坐标,因而能够遵照ROI提取出内切长方形(固然内切星型会损失很多的新闻,不过近日本人还不曾想到其他的更加好的办法),作出长方形如下

亚洲必赢官网 6

作星型并领取的代码如下

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)]

运转截图

亚洲必赢官网 7

能够见见出现了淡紫部分,按理说是不会设有的,使用cv2.imwrite发觉未有现身其余难点,如图

亚洲必赢官网 8

倍感是cv二.imshow对于出口图片的像素大小有必然范围,进行了全自动填写可能是默许有紫铁青作为背景象且比在那边大家领到出的图纸要大

代码地址:

学学画线、圆和矩形等各类多少形状,给图片添Gavin字。图片等可到源码处下载。

import cv2

import numpy as np

img = cv2.imread(‘star.jpg’,0)

ret,thresh = cv2.threshold(img,127,255,0)

contours,hierarchy = cv2.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv2.moments(cnt)

print M

 亚洲必赢官网 9

感谢:

1.
那位老哥的repo,基于肤色的提取和形成近似椭圆给自个儿的启发十分的大(固然后半局地完全未有用…..)

2.
纵然依照距离变化参考至此处的对答,然而也算是旗开马到了提问者的急需。

转发请申明出处

 

上次我们中标演习了手掌识别器…


你可以从那个里面得到实惠的多少比如面积,重心等。重心可以用上面包车型客车姿势获得:

接下去讲解一下提取手掌的办法

  1. 将图纸copy,并将图片转换为ycrcb形式,依照ycrcb中的肤色获取和手掌颜色周围的局地,生成黑白图片
  2. 行使黑白图片获得最大的差不多并扭转轮廓图片并拿到四个接近的扁圆形
  3. 基于椭圆角度开始展览旋转(原图片和黑白图片及概况图片同时旋转)以尽力而为的将魔掌放为竖直
  4. 基于原图片和黑白图片,利用黑白图片作为掩膜,获得的原图片如下:

  亚洲必赢官网 10

目标

  • 绘制种种几何形状、添加文字
  • OpenCV函数:cv2.line(), cv2.circle(), cv2.rectangle(),
    cv2.ellipse(), cv2.putText()

cx=int(M[‘m10’]/M[‘m00’])

cy=int(M[‘m01’]/M[‘m00’])

  提取手掌核心:

  算法思想:依据黑白图片,基于距离变换获得手掌宗旨,并基于最大半径画入手掌的内切圆如图

  亚洲必赢官网 11

代码如下

 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提取出内切正方形(即便内切纺锤形会损失很多的新闻,但是当前作者还从未想到其余的更加好的章程),作出圆柱形如下

亚洲必赢官网 12

作椭圆形并提取的代码如下

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)]

运维截图

亚洲必赢官网 13

可以看到出现了紫玉清水蓝部分,按理说是不会存在的,使用cv2.imwrite意识并未有出现别的难题,如图

亚洲必赢官网 14

觉得是cv2.imshow对此出口图片的像素大小有自然限制,实行了机关填写可能是私下认可有巴黎绿作为背景象且比在此地大家领到出的图形要大

代码地址:

参数表达

绘图形状的函数有一些二头的参数,提前在此说美素佳儿(Dumex)下:

  • img:要绘制形状的图片
  • color:绘制的颜色,绘制彩色就传到BG奥迪Q3的1组值,如(25伍,0,0);灰度图,传入三个灰度值就行
  • thickness:线宽,暗中认可为一;对于矩形/圆之类的查封形状而言,传入-一象征填充形状

模块导入和出示图片的通用代码,相信你早就很熟知了,为节约篇幅,前边作者会省略掉噢:

import cv2
import numpy as np
import matplotlib.pyplot as plt

cv2.imshow('img', img)
cv2.waitKey(0)

亚洲必赢官网 15

绘制各类几何形状

上海体育场地正是本学科绘制的末尾效果,上面一步步来看:

概况面积由函数cv二.contourArea()获得恐怕从矩里获得M[‘m00’]

感谢:

1.
那位老哥的repo,基于肤色的领取和变异近似椭圆给小编的启迪不小(固然后半部分完全未有用…..)

2.
尽管依照距离变化参考至此处的答疑,可是也总算大功告成了提问者的须求。

转发请声明出处

 

画线

画线只需通晓源点和终端的坐标就行:

# 创建一副黑色的图片
img = np.zeros((512, 512, 3), np.uint8)
# 画一条线宽为5的蓝色直线,参数2:起点,参数3:终点
cv2.line(img, (0, 0), (512, 512), (255, 0, 0), 5)

经历之谈:绘图函数会一贯影响到原图片,那一点要留心

area=cv2.contourArea(cnt)

画矩形

画矩形须要精晓左上角和右下角的坐标:

# 画一个绿色边框的矩形,参数2:左上角坐标,参数3:右下角坐标
cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)

三.概况周长

画圆

画圆必要钦赐圆心和半径,注意下边包车型地铁例子中线宽=-一代表填写:

# 画一个填充红色的圆,参数2:圆心坐标,参数3:半径
cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)

能够用cv二.arcLength()函数得到。第一个参数钦赐形状是或不是是闭合的大约(若是传True)。或然只是1个曲线。

画椭圆

画椭圆须求的参数比较多,请对照前面的代码驾驭那多少个参数:

  • 参数二:椭圆中央(x,y)
  • 参数三:x/y轴的长度
  • 参数四:angle–椭圆的团团转角度
  • 参数五:startAngle–椭圆的原初角度
  • 参数六:endAngle–椭圆的扫尾角度

经验之谈:那里的角度是以顺时针方向总括的

# 在图中心画一个填充的半圆
cv2.ellipse(img, (256, 256), (100, 50), 0, 0, 180, (255, 0, 0), -1)

perimeter=cv2.arcLength(cnt,True)

画多边形

画多边形须求内定一种类多边形的顶峰坐标,约等于从第二个点到第二个点画直线,再从首个点到第三个点画直线….

OpenCV中需求先将多边形的终端坐标须求变成顶点数×1×2维的矩阵,再来绘制:

# 定义四个顶点坐标
pts = np.array([[10, 5],  [50, 10], [70, 20], [20, 30]], np.int32)
# 顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))

cv2.polylines()的参数③要是是False的话,多边形就不闭合。

经历之谈:假诺必要绘制多条直线,使用cv二.polylines()要比cv二.line()高效很多,例如:

# 使用cv2.polylines()画多条直线
line1 = np.array([[100, 20],  [300, 20]], np.int32).reshape((-1, 1, 2))
line2 = np.array([[100, 60],  [300, 60]], np.int32).reshape((-1, 1, 2))
line3 = np.array([[100, 100],  [300, 100]], np.int32).reshape((-1, 1, 2))
cv2.polylines(img, [line1, line2, line3], True, (0, 255, 255))

四.轮廓近似

丰裕文字

使用cv2.putText()累加文字,它的参数也相比多,同样请对照前面包车型大巴代码了解那多少个参数:

  • 参数二:要加上的文书
  • 参数三:文字的开首坐标(左下角为起源)
  • 参数4:字体
  • 参数伍:文字大小(缩放比例)

# 添加文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'ex2tron', (10, 500), font,
            4, (255, 255, 255), 2, lineType=cv2.LINE_AA)

那里有个线型lineType参数,LINE_AA代乙型肝脓肿表面抗原锯齿线型,具体可见LineTypes

那会把轮廓形状近似成其他边数少的样子,边数由大家钦赐的精确度决定。那是Douglas-Peucker算法的落实。

小结

  • cv贰.line()画直线,cv二.circle()画圆,cv二.rectangle()画矩形,cv二.ellipse()画椭圆,cv二.polylines()画多边形,cv2.putText()添加文字
  • 画多条直线时,cv2.polylines()要比cv贰.line()高效很多

要明了这些,假若你打算找叁个图像里的方框,可是出于图像里的一些题材,你得不到一个两全的正方,只好得到三个“坏方块”。今后您能够利用那个函数来就如,首个参数叫epsilon,是从轮廓到近似概况的最大距离。是3个准确率参数,好的epsilon的选项能够获取不错的出口。

练习

  1. 您能用已学的绘图效用画出OpenCV的logo吗?(提示:椭圆和圆)

亚洲必赢官网 16

OpenCV logo

epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

引用

  • 本节源码
  • LineTypes
  • Drawing Functions in
    OpenCV

在上面第一个图像里,绿线呈现了epsilon = 1/10 of arc length
的类似曲线。第多个图像展现了epsilon = 一% of the arc
length。第八个参数钦命曲线是不是关闭。

亚洲必赢官网 17

五.凸形外壳

凸形外壳和轮廓近似类似,可是还不雷同(有些情形下多少个甚至提供了1致的结果)。那儿,cv二.convexHull()函数检查凸面曲线缺陷并修复它。一般的话,凸面曲线总是外凸的,至少是平的,要是它内凹了,那就叫凸面缺陷。比如上边这张图,红线呈现了手的凸形外壳。双向箭头彰显了凸面缺陷,是大约外壳的最大偏差。

亚洲必赢官网 18

hull = cv2.convexHull(points[, hull[, clockwise[,
returnPoints]]

参数详情:

·points 是大家传入的大致
·hull 是出口,1般大家不用传
·clockwise:
方向标示,假设是True,输出凸形外壳是顺时针方向的。不然,是逆时针的。
·returnPoints:默许是True。然后会回去外壳的点的坐标。假诺为False,它会回到概略对应外壳点的目录。

于是要博得凸形外壳,上边

hull=cv2.convexHull(cnt)

可是假使你想找到凸面缺陷,你供给传入returnPoints =
False。我们拿地方的矩形图形来说,首先本身找到她的概略cnt,未来用returnPoints
= True来找他的凸形外壳,笔者得到上边包车型地铁值:[[[234 202]], [[亚洲必赢官网 ,51
202]], [51 79]], [[234 79]]]
 是四个角的点。就算你用returnPoints =
False,笔者会取得下边包车型客车结果:[[129], [67], [0], [142]].
 那是概略里对应点的目录,比如cnt[129] = [234,
202]],那和前边结果同样。

六.反省凸面

有三个函数用来检查是还是不是曲线是凸面,
cv二.isContourConvex().它回到True或False。

k=cv2.isContourConvex(cnt)

7.境界矩形

有两种境界矩形

柒.a.正边际矩形

其一矩形不思量对象的转动,所以边界矩形的面积不是纤维的,函数是cv二.boundingRect()。

1旦矩形左上角的坐标是(x,y), (w, h)是它的宽和高

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

7.b.渲染矩形

那一个界限矩形是用小小面积画出来的,所以要记挂旋转。函数是cv2.minAreaRect()。它回到1个Box二D结构,包蕴了(左上角(x,y),(width,
height),旋转角度)。不过要画这几个矩形我们须要陆个角。那多少个角用函数cv二.boxPoints()获得

rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
im = cv2.drawContours(im,[box],0,(0,0,255),2)

亚洲必赢官网 19

捌.微细闭包圆

咱俩找贰个目的的外接圆能够用函数cv2.minEnclosingCircle().那个圆用最小面积完全包围目的。

(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)

亚洲必赢官网 20

9.椭圆

用3个椭圆来合作指标。它回到1个转悠了的矩形的内接椭圆

ellipse=cv2.fitEllipse(cnt)
im=cv2.ellipse(im,ellipse,(0,255,0),2)

亚洲必赢官网 21

  1. 直线

就如的大家能够包容一根直线,上边包车型大巴图像包括一层层的橄榄黑点,大家得以给它一条看似的直线。

rows,cols = img.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
img = cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

亚洲必赢官网 22

END

网站地图xml地图