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

上次大家成功陶冶了手掌识别器

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

上次大家成功陶冶了手掌识别器

美高梅开户网址 1

接下去须求使用opencv来获得手掌,去除背景有个别,那里就供给用到掩膜(mask)、ROI(region
of interest)等互为表里文化,具体的定义还是不讲了,网上海人民广播广播台湾大学。

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

 美高梅开户网址 2


1图像矩

美高梅开户网址 3

接下去讲授一下领取手掌的主意

  美高梅开户网址 4

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

帮你计算1些本性,比如重点,面积等。

接下去要求运用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()会给您一个字典,包涵全数矩值

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

   提取掌纹

    今后我们已知了圆的半径和圆心坐标,因而能够依据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

能够见到出现了石青部分,按理说是不会存在的,使用cv贰.imwrite发现并未有出现任何难题,如图

美高梅开户网址 8

认为是cv二.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

 美高梅开户网址 9

感谢:

1.
那位老哥的repo,基于肤色的领取和多变近似椭圆给本身的启示十分大(即便后半片段完全未有用…..)

2.
就算依照距离变化参考至此处的答应,不过也总算马到成功了提问者的须求。

转载请证明出处

 

上次大家中标磨炼了手心识别器…


你能够从那个里面获取有效的多寡比如面积,重心等。重心能够用上面包车型客车架势获得:

python提取手掌和手心及一些掌纹,绘图功用。接下去疏解一下领取手掌的艺术

  1. 将图纸copy,并将图片转变为ycrcb方式,依据ycrcb中的肤色获取和手掌颜色周围的有个别,生成黑白图片
  2. 运用黑白图片得到最大的轮廓并生成轮廓图片并赢得3个类似的扁圆形
  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

能够看来出现了卡其色部分,按理说是不会存在的,使用cv二.imwrite发觉并未有出现其余难题,如图

美高梅开户网址 14

感觉是cv2.imshow对此出口图片的像素大小有必然限制,举行了活动填写可能是暗中认可有紫蓝作为背景观且比在此地大家领到出的图片要大

代码地址:

参数表达

绘图形状的函数有壹些同台的参数,提前在此说爱他美下:

  • img:要绘制形状的图纸
  • color:绘制的水彩,绘制彩色就传来BG中华V的一组值,如(255,0,0);灰度图,传入1个灰度值就行
  • 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)

能够用cv2.arcLength()函数获得。第四个参数钦赐形状是还是不是是闭合的概略(尽管传True)。恐怕只是二个曲线。

画椭圆

画椭圆供给的参数相比多,请对照前边的代码驾驭那多少个参数:

  • 参数2:椭圆中心(x,y)
  • 参数3:x/y轴的长度
  • 参数四:angle–椭圆的团团转角度
  • 参数五:startAngle–椭圆的苗头角度
  • 参数6: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()的参数3头若是False的话,多边形就不闭合。

经历之谈:假诺急需绘制多条直线,使用cv二.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()加上文字,它的参数也比较多,相同请对照前边的代码了然那几个参数:

  • 参数二:要丰盛的文本
  • 参数3:文字的原初坐标(左下角为源点)
  • 参数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算法的落到实处。

小结

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

要通晓那几个,要是你打算找二个图像里的正方,不过出于图像里的局地标题,你得不到3个完善的方框,只好获得三个“坏方块”。今后您能够行使那个函数来就像是,首个参数叫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 = 百分之10 of arc length
的近乎曲线。第多少个图像展现了epsilon = 1% of the arc
length。第一个参数指定曲线是还是不是关闭。

美高梅开户网址 17

五.凸形外壳

凸形外壳和概略近似类似,不过还分化等(某个情形下五个甚至提供了同一的结果)。那儿,cv二.convexHull()函数检查凸面曲线缺陷并修复它。1般的话,凸面曲线总是外凸的,至少是平的,假使它内凹了,这就叫凸面缺陷。比如上面这张图,红线展现了手的凸形外壳。双向箭头展现了凸面缺陷,是大致外壳的最大偏差。

美高梅开户网址 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]],那和近来结果壹致。

陆.检查凸面

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

k=cv2.isContourConvex(cnt)

柒.边界矩形

有二种境界矩形

7.a.正边界矩形

本条矩形不怀恋对象的转动,所以边界矩形的面积不是细微的,函数是cv2.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.渲染矩形

本条界限矩形是用小小面积画出来的,所以要考虑旋转。函数是cv2.minAreaRect()。它回到1个博克斯2D结构,包罗了(左上角(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)

美高梅开户网址 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.椭圆

用三个椭圆来协作指标。它回到一个转悠了的矩形的内接椭圆

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

美高梅开户网址 21

  1. 直线

恍如的我们能够合营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地图