制图功用,python提取手掌和手心及片段掌纹

By admin in 4858.com on 2019年3月31日

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

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

上次我们成功练习了手心识别器

4858.com 1

接下去须求动用opencv来博取手掌,去除背景有个别,那里就须求用到掩膜(mask)、ROI(region
of interest)等巢毁卵破文化,具体的概念照旧不讲了,网上海人民广播电视台大。

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

 4858.com 2


1图像矩

4858.com 3

接下去讲解一下领取手掌的艺术

  4858.com 4

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

帮你总括一些性质,比如重点,面积等。

接下去须求使用opencv来获取手掌,去除背景某些,这里就须要用到掩膜(mask)、ROI(region
of interest)等连锁文化,具体的概念依旧不讲了,网上海人民广播电视台湾大学。

  提取手掌焦点:

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

  4858.com 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)

函数cv2.moments()会给您二个字典,包括全数矩值

第二从图中依据上次的次第画框部分提取手掌(当然本人截图再保存也足以-.-)如下

   提取掌纹

    以往我们已知了圆的半径和圆心坐标,由此得以依照ROI提取出内切星型(即便内切纺锤形会损失很多的音信,可是当前笔者还未曾想到别的的更好的办法),作出圆柱形如下

4858.com 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)]

运作截图

4858.com 7

能够看看出现了深绿部分,按理说是不会存在的,使用cv2.imwrite发觉并未出现别的难题,如图

4858.com 8

制图功用,python提取手掌和手心及片段掌纹。感觉到是cv2.imshow对此出口图片的像素大小有自然限制,举办了自行填写或然是暗中认可有松石绿作为背景观且比在此地大家领到出的图片要大

代码地址:

上学画线、圆和矩形等三种几何形象,给图片添加文字。图片等可到源码处下载。

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

 4858.com 9

感谢:

1.
那位老哥的repo,基于肤色的领到和形成近似椭圆给本人的启示非常的大(即使后半片段完全没有用…..)

2.
就算依照距离变化参考至此处的答应,可是也究竟大功告成了提问者的需求。

转载请申明出处

 

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


您能够从这几个里面获取实惠的数额比如面积,重心等。重心能够用上边包车型地铁架子获得:

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

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

  4858.com 10

目标

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

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

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

  提取手掌中央:

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

  4858.com 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)

教程

2.大约面积

   提取掌纹

    以往大家已知了圆的半径和圆心坐标,由此能够依照ROI提取出内切星型(尽管内切正方形会损失很多的音信,然而近日本人还不曾想到其余的更好的章程),作出星型如下

4858.com 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)]

运作截图

4858.com 13

能够看出出现了褐色部分,按理说是不会设有的,使用cv2.imwrite发觉没有出现其余难题,如图

4858.com 14

感觉是cv2.imshow对于出口图片的像素大小有肯定范围,实行了电动填写只怕是默许有铁蓝作为背景观且比在此间我们领到出的图纸要大

代码地址:

参数表达

绘图形状的函数有部分齐声的参数,提前在此证实一下:

  • img:要绘制形状的图形
  • color:绘制的水彩,绘制彩色就传出BG索罗德的一组值,如(255,0,0);灰度图,传入一个灰度值就行
  • thickness:线宽,暗中同意为1;对于矩形/圆之类的查封形状而言,传入-1代表填充形状

模块导入和出示图片的通用代码,相信你早已很熟谙了,为节约篇幅,后边我会省略掉噢:

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

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

4858.com 15

制图各个几何形状

上海教室便是本课程绘制的末尾效果,上面一步步来看:

大约面积由函数cv2.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)

3.概况周长

画圆

画圆须要内定圆心和半径,注意上面包车型客车例证中线宽=-1代表填写:

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

能够用cv2.arcLength()函数获得。首个参数钦点形状是或不是是闭合的大致(固然传True)。或然只是一个曲线。

画椭圆

画椭圆须求的参数相比多,请对照前面包车型客车代码理解那多少个参数:

  • 参数2:椭圆主题(x,y)
  • 参数3:x/y轴的尺寸
  • 参数4:angle–椭圆的旋转角度
  • 参数5:startAngle–椭圆的开始角度
  • 参数6: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()的参数3倘若是False的话,多边形就不闭合。

经验之谈:假诺急需绘制多条直线,使用cv2.polylines()要比cv2.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))

4.大概近似

添加文字

使用cv2.putText()充足文字,它的参数也正如多,同样请对照前边的代码通晓这多少个参数:

  • 参数2:要增加的文本
  • 参数3:文字的原初坐标(左下角为源点)
  • 参数4:字体
  • 参数5:文字大小(缩放比例)

# 添加文字
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算法的达成。

小结

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

要明了这几个,假若你准备找三个图像里的正方,可是由于图像里的部分题目,你得不到1个到家的方框,只好获得1个“坏方块”。未来你可以利用这么些函数来就像是,第二个参数叫epsilon,是从轮廓到类似概略的最大距离。是叁个准确率参数,好的epsilon的挑三拣四能够获取正确的输出。

练习

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

4858.com 16

OpenCV logo

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

引用

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

在底下第①个图像里,绿线突显了epsilon = 百分之十 of arc length
的近乎曲线。第多少个图像呈现了epsilon = 1% of the arc
length。第一个参数钦赐曲线是还是不是关闭。

4858.com 17

5.凸形外壳

凸形外壳和概略近似类似,然则还差异(某个情形下七个甚至提供了平等的结果)。那儿,cv2.convexHull()函数检查凸面曲线缺陷并修复它。一般的话,凸面曲线总是外凸的,至少是平的,假使它内凹了,那就叫凸面缺陷。比如上面那张图,红线展现了手的凸形外壳。双向箭头显示了凸面缺陷,是大约外壳的最大偏差。

4858.com 18

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

参数详情:

·points 是大家传入的概况
·hull 是出口,一般大家不用传
·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]],那和前面结果一致。

6.反省凸面

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

k=cv2.isContourConvex(cnt)

7.境界矩形

有三种境界矩形

7.a.正境界矩形

本条矩形不考虑对象的旋转,所以边界矩形的面积不是相当小的,函数是cv2.boundingRect()。

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

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

7.b.渲染矩形

以此边界矩形是用十分小面积画出来的,所以要考虑旋转。函数是cv2.minAreaRect()。它回到1个Box2D结构,包罗了(左上角(x,y),(width,
height),旋转角度)。然而要画那么些矩形大家须要陆个角。那多少个角用函数cv2.boxPoints()获得

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

4858.com 19

8.纤维闭包圆

我们找一个目的的外接圆能够用函数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)

4858.com 20

9.椭圆

用3个椭圆来合营指标。它回到三个旋转了的矩形的内接椭圆

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

4858.com 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)

4858.com 22

END

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有