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

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

上次我们成功陶冶了手心识别器

金沙注册送58 1

接下去须求接纳opencv来收获手掌,去除背景有个别,那里就供给用到掩膜(mask)、ROI(region
of interest)等连锁知识,具体的定义仍旧不讲了,网上海人民广播电视台湾大学。

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

 金沙注册送58 2


1图像矩

金沙注册送58 3

接下去讲授一下提取手掌的情势

  金沙注册送58 4

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

帮你总计1些性质,比如重点,面积等。

接下去要求选拔opencv来收获手掌,去除背景有些,那里就要求用到掩膜(mask)、ROI(region
of interest)等辅车相依文化,具体的定义还是不讲了,网上海人民广播广播台湾大学。

  提取手掌主题:

  算法观念:依照黑白图片,基于距离调换得到手掌核心,并依照最大半径画动手掌的内切圆如图

  金沙注册送58 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()会给您一个字典,包罗全数矩值

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

   提取掌纹

    今后大家已知了圆的半径和圆心坐标,由此得以依据ROI提收取内切长方形(就算内切圆锥形会损失繁多的新闻,不过当前自家还不曾想到其余的更加好的艺术),作出星型如下

金沙注册送58 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)]

运作截图

金沙注册送58 7

能够阅览出现了白灰部分,按理说是不会设有的,使用cv二.imwrite发现并未有出现任何难点,如图

金沙注册送58 8

备感是cv2.imshow对于出口图片的像素大小有肯定范围,举办了机动填写只怕是私下认可有蛋青作为背景象且比在此处大家领到出的图样要大

代码地址:

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

python提取手掌和手心及部分掌纹,绘图功效。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

 金沙注册送58 9

感谢:

1.
那位老哥的repo,基于肤色的领取和变异近似椭圆给本身的启发非常大(即使后半局部完全未有用…..)

2.
就算依据距离变化参考至此处的回应,可是也算是马到功成了提问者的要求。

转发请注脚出处

 

上次大家中标陶冶了手心识别器…


你能够从那些里面获取有效的数据比如面积,重心等。重心能够用上面的架子获得:

接下去讲明一下领到手掌的方法

  1. 将图片copy,并将图纸转变为ycrcb形式,依据ycrcb中的肤色获取和手掌颜色周围的局地,生成黑白图片
  2. 采纳黑白图片获得最大的轮廓并扭转轮廓图片并收获1个看似的扁圆形
  3. 依照椭圆角度实行旋转(原图片和黑白图片及轮廓图片同时旋转)以尽恐怕的将魔掌放为竖直
  4. 据他们说原图片和黑白图片,利用黑白图片作为掩膜,获得的原图片如下:

  金沙注册送58 10

目标

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

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

cy=int(M[‘m01′]/M[金沙注册送58,’m00’])

  提取手掌中央:

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

  金沙注册送58 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提收取内切星型(固然内切星型会损失好些个的音信,不过当前自小编还未曾想到其余的越来越好的办法),作出椭圆形如下

金沙注册送58 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)]

运营截图

金沙注册送58 13

能够看来出现了菘蓝部分,按理说是不会设有的,使用cv二.imwrite发现未有出现任何难题,如图

金沙注册送58 14

深感是cv二.imshow对此出口图片的像素大小有早晚范围,进行了自行填写可能是私下认可有栗色作为背景象且比在那边大家领到出的图形要大

代码地址:

参数表达

绘图形状的函数有一对协同的参数,提前在此说宾博(Nutrilon)下:

  • img:要绘制形状的图样
  • color:绘制的颜色,绘制彩色就盛传BGRAV4的1组值,如(25伍,0,0);灰度图,传入2个灰度值就行
  • thickness:线宽,默感觉一;对于矩形/圆之类的查封形状来说,传入-一表示填充形状

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

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

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

金沙注册送58 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()函数获得。第三个参数钦点形状是还是不是是闭合的大约(假设传True)。大概只是三个曲线。

画椭圆

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

  • 参数2:椭圆主题(x,y)
  • 参数3:x/y轴的长度
  • 参数4:angle–椭圆的团团转角度
  • 参数五:startAngle–椭圆的苗头角度
  • 参数陆:endAngle–椭圆的了断角度

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

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

perimeter=cv2.arcLength(cnt,True)

画多边形

画多边形必要内定1多级多边形的顶峰坐标,也正是从第贰个点到第3个点画直线,再从第贰个点到第一个点画直线….

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()加上文字,它的参数也相比较多,同样请对照前边的代码了然那多少个参数:

  • 参数二:要丰硕的文书
  • 参数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

那会把轮廓形状近似成别的边数少的形象,边数由大家钦命的精确度决定。那是道格拉斯-Peucker算法的落到实处。

小结

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

要明了那些,如果你打算找一个图像里的方框,但是出于图像里的一些主题材料,你得不到二个完美的正方,只可以得到2个“坏方块”。今后您能够利用那么些函数来就像是,第三个参数叫epsilon,是从轮廓到近似轮廓的最大距离。是三个准确率参数,好的epsilon的选取能够获取不错的出口。

练习

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

金沙注册送58 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。第伍个参数钦定曲线是不是关闭。

金沙注册送58 17

伍.凸形外壳

凸形外壳和概况近似类似,然则还不壹致(某个情形下多少个甚至提供了同样的结果)。那儿,cv2.convexHull()函数检查凸面曲线缺陷并修复它。一般的话,凸面曲线总是外凸的,至少是平的,倘诺它内凹了,那就叫凸面缺陷。比如上面那张图,红线突显了手的凸形外壳。双向箭头突显了凸面缺陷,是大概外壳的最大偏差。

金沙注册送58 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]],那和前面结果1律。

六.检查凸面

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

k=cv2.isContourConvex(cnt)

柒.边际矩形

有二种境界矩形

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)

七.b.渲染矩形

本条边界矩形是用非常小面积画出来的,所以要思虑旋转。函数是cv二.minAreaRect()。它回到三个Box二D结构,包涵了(左上角(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)

金沙注册送58 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)

金沙注册送58 20

9.椭圆

用2个椭圆来协作指标。它回到一个筋斗了的矩形的内接椭圆

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

金沙注册送58 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)

金沙注册送58 22

END

相关文章

网站地图xml地图