威尼斯人线上娱乐

【威尼斯人线上娱乐】绘图功用,python提取手掌和手心及一些掌纹

15 4月 , 2019  

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

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

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

威尼斯人线上娱乐 1

接下去须要利用opencv来得到手掌,去除背景有个别,那里就必要用到掩膜(mask)、ROI(region
of interest)等有关文化,具体的定义照旧不讲了,网上海人民广播电视台湾大学。

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

 威尼斯人线上娱乐 2


1图像矩

威尼斯人线上娱乐 3

接下去批注一下提取手掌的措施

  威尼斯人线上娱乐 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)

函数cv2.moments()会给你四个字典,包含全体矩值

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

   提取掌纹

    今后我们已知了圆的半径和圆心坐标,因而可以依照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. 【威尼斯人线上娱乐】绘图功用,python提取手掌和手心及一些掌纹。将图片copy,并将图片转变为ycrcb形式,依据ycrcb中的肤色获取和手掌颜色周边的片段,生成黑白图片
  2. 动用黑白图片获得最大的概略并转移概略图片并收获三个看似的椭圆
  3. 基于椭圆角度打开旋转(原图片和黑白图片及轮廓图片同时旋转)以尽量的将魔掌放为竖直
  4. 传说原图片和黑白图片,利用黑白图片作为掩膜,得到的原图片如下:

  威尼斯人线上娱乐 10

目标

  • 制图各个几何形状、添Gavin字
  • 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)

教程

2.概略面积

   提取掌纹

    未来大家已知了圆的半径和圆心坐标,因而得以依照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

能够见见现身了白灰部分,按理说是不会设有的,使用cv二.imwrite发觉并未有出现别的难题,如图

威尼斯人线上娱乐 14

感觉到是cv二.imshow对于出口图片的像素大小有必然范围,实行了全自动填写只怕是私下认可有鼠灰作为背景观且比在此地大家领到出的图样要大

代码地址:

参数表明

绘制形状的函数有一些共同的参数,提前在此说美赞臣下:

  • img:要绘制形状的图纸
  • color:绘制的颜料,绘制彩色就扩散BG昂Cora的1组值,如(255,0,0);灰度图,传入3个灰度值就行
  • thickness:线宽,暗许为1;对于矩形/圆之类的查封形状来讲,传入-1表示填充形状

模块导入和体现图片的通用代码,相信你曾经很熟练了,为节约篇幅,前面笔者会省略掉噢:

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)

可以用cv2.arcLength()函数获得。第3个参数钦赐形状是还是不是是闭合的轮廓(若是传True)。可能只是二个曲线。

画椭圆

画椭圆必要的参数相比多,请对照后边的代码精晓那多少个参数:

  • 参数2:椭圆中央(x,y)
  • 参数3:x/y轴的长度
  • 参数4:angle–椭圆的团团转角度
  • 参数5:startAngle–椭圆的早先角度
  • 参数陆:endAngle–椭圆的终结角度

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

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

perimeter=cv2.arcLength(cnt,True)

画多边形

画多边形需求钦点一多重多边形的终端坐标,也正是从第七个点到第叁个点画直线,再从第1个点到第两个点画直线….

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:字体
  • 参数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算法的兑现。

小结

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

要知道这几个,倘若你打算找一个图像里的方框,不过出于图像里的一对主题素材,你得不到一个圆满的四方,只可以获取2个“坏方块”。以往您能够使用那一个函数来就如,第三个参数叫epsilon,是从轮廓到类似概略的最大距离。是八个准确率参数,好的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 = 百分之十 of arc length
的接近曲线。第五个图像浮现了epsilon = 一% of the arc
length。第一个参数钦定曲线是还是不是关闭。

威尼斯人线上娱乐 17

5.凸形外壳

凸形外壳和轮廓近似类似,可是还不等同(有些情状下三个甚至提供了扳平的结果)。那儿,cv2.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]],那和日前结果一致。

6.反省凸面

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

k=cv2.isContourConvex(cnt)

7.边界矩形

有二种境界矩形

7.a.正边界矩形

本条矩形不记挂对象的转动,所以边界矩形的面积不是微乎其微的,函数是cv二.boundingRect()。

假使矩形左上角的坐标是(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.渲染矩形

其一界限矩形是用相当小面积画出来的,所以要思虑旋转。函数是cv二.minAreaRect()。它回到二个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

八.微小闭包圆

大家找二个指标的外接圆能够用函数cv贰.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个筋斗了的矩形的内接椭圆

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地图