阅读过我的上一篇博客后,都知道应该如何在canny处理后提取到我们的手指轮廓,剔除背景轮廓了,还没看的点这里上一篇博客

然后我们要做的事情很简单,就是拟合手指的中线,并且旋转我们原来的图像以待进一步的处理。

中线的获得:

我拟合中线的办法就是采取手指每一对上下(两侧)轮廓的平均值,然后将这个中间位置的坐标记录下来。

import cv2 as cv
import numpy as np
import math
import  my_algorithm as myclahe_test=cv.imread('clahe_test.bmp',0)
test_edges=cv.Canny(clahe_test,90,150)finger_edges=my.get_edges(test_edges)
finger_center=my.get_centerline(finger_edges)
show=cv.add(finger_edges,finger_center)
cv.imshow('show',show)
cv.imshow('finger_edges',finger_edges)
cv.imshow('finger_center',finger_center)
cv.waitKey(0)
cv.destroyAllWindows()

这是效果图

这里用到了我自己写的方法,get_edges和get_centertline,两个方法都类似,可以参考上一篇博客。上一篇没有写到get_centerline这个方法,我这里贴一下

def get_centerline(img):   # img : single channel img which has been processed by get_edgesrows,cols=img.shapecoord=[]for i in range(cols):temp_index=np.argwhere(img[:,i]==255)temp_index=temp_index.tolist()center_position=round((temp_index[0][0]+temp_index[1][0])/2)temp_index.clear()coord.append([center_position,i])#print(coord)points=np.array(coord)#return pointsresult_img=np.zeros((rows,cols),dtype="uint8")for j in coord:result_img[j[0],j[1]]=255return result_img

实际使用的时候需要把  #return points 前的#删除 ,这样函数返回的就是一组可以用于直线拟合的坐标了

 图片的旋转:

得到了中线后,我们可以开始将这一系列点放入cv.fitline()之中进行拟合了,需要了解有关fitline()的简单使用,可以点击我的这篇博客。

finger_edges=my.get_edges(test_edges)
points=my.get_centerline(finger_edges)
line =cv.fitLine(points,cv.DIST_L2,0,0.01,0.01)
line_test=cv.line(finger_edges,(line[2]-1000*line[1]/line[0],line[2]-1000),(line[2]+1000*line[1]/line[0],line[2]+1000),255)

拟合后:

然后对图片的旋转直接采用opencv中自带的方法就可以了,简单贴一下代码

rows,cols=clahe_test.shape
angle = math.atan(line[1]/line[0])*180/math.pi
angle= 90-angle if angle>0 else -90-angle
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),angle,1)
dst = cv.warpAffine(clahe_test,M,(cols,rows))
cv.imshow("show",dst)

效果:

可以看到after_rotation的右上角出现了一点点缝隙,而这正是往直线倾斜方向的相反方向进行的旋转说明旋转成功了。

点个赞哦亲~

opencv-python 指静脉的ROI获取(拟合手指中线加旋转)相关推荐

  1. 关于SDL多指触屏事件获取各手指状态的问题。

    转自 :http://tieba.baidu.com/p/4251800066 只看楼主 收藏 回复 简单aaaaaaa 大名鼎鼎 10 我不会告诉你们 我到现在还没解决 while(SDL_Poll ...

  2. opencv-python 指静脉的ROI(感兴趣区域)的指节提取(原理+代码)

    静脉采集过程中,由于手指自由度比较大,所以可能会有手指旋转,平移等现象,这有可能使得同一个手指的两次采集图像差别较大.这是我们不希望看到的.所以对图像进行ROI的提取非常有必要,也是图像预处理的一个过 ...

  3. 登陆 manager app显示不是私密链接_小米上线了一款靠指静脉识别开锁的私密箱,打造你的私人存储空间...

    印象中的保险箱体积大.价格昂贵.开锁繁琐,一直都认为那是企业老板.成功人士的标配,对于普通家庭来说存在的价值.或实用性方面并不是很高.往常遇到长时间外出旅行,也会担心家里重要的证件.首饰等贵重物品的安 ...

  4. 指静脉识别技术在安防行业的应用前景

    成都电子科大的一群理工宅男组团研究"指静脉识别",截至目前已斩获11个奖项.采用这一识别系统,只需将手指放在识别器上,短短70毫秒,就能验证出个人独有的手指静脉图像是否和身份信息相 ...

  5. pythonopencv读取图像属性_2、OpenCV Python 图像属性获取

    __author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...

  6. 如何把OpenCV Python获取的图像传递到C层处理

    原文:https://blog.csdn.net/yushulx/article/details/52788051 用OpenCV Python来开发,如果想要用到一些C/C++的图像处理库,就需要创 ...

  7. opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用

    opencv python 从摄像头获取视频.帧率.分辨率等属性设置和使用 文章目录: 1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件 ...

  8. openCV + python实现从摄像头获取视频后,以镜像/水平翻转输出

    opencv + python实现从摄像头获取视频后,以镜像/水平翻转输出 笔者的配置如下: opencv 4.2.0 python 3.7.6 如图,处理前的 摄像头获取并输出的都是翻转后的视频 处 ...

  9. python截取图片的ROI+OpenCV 在坐标中显示图片+鼠标点击图片显示点坐标

    又来做下笔记了.现在我的毕业设计进行到数据处理的阶段,要在乳腺图像上截取4张相同大小的1024*1024图片,并且每张图片都必须覆盖微钙化点,以下是我现在用到的一些简单程序. 1.首先是截图程序如下: ...

最新文章

  1. linux 脚本 符号,Shell脚本 入门 —— 符号篇
  2. Win7下基于消息安全模式的WCF托管(IIS与WinForm)
  3. redis 入门教程
  4. TCP协议三步挥手与四步挥手
  5. 环境变量和用户变量有什么区别?
  6. BeetleX之vue-autoui自匹配UI插件
  7. SequoiaDB 系列之六 :源码分析之coord节点
  8. 连载08:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)...
  9. ASP.NET2.0应用中定制安全凭证之理论篇
  10. winform窗体中嵌入显示Excel文件
  11. 女生适合学python_Python适合女生学习吗?
  12. [古怪问题] Marshal.GetActiveObject 在管理员模式下无法正常运行
  13. java图片透明_Java实现对图片透明化处理
  14. Three.js线宽.lineWidth无效
  15. Win11C盘扩容详细教程
  16. 慎用Application.DoEvents( )
  17. 【转】基于C#的接口基础教程之五(1)
  18. 简单的stm32入门小程序(交通信号灯)STM32F103C8T6
  19. 基于java的心理健康网站的设计与实现_基于JavaEE心理健康教育网站的设计与开发.doc...
  20. JAVA COMMON

热门文章

  1. docker环境下安装rockermq以及rockermq-console
  2. VSCode中Vue的components组件名标签无法快捷闭合
  3. 要不是和阿里P6聊过,到死也不知道自己原来啥也不是
  4. 数据可视化 平台网址汇总
  5. 程序员穿女装上班,都是为了排解编程压力!网友:怕不是个变态
  6. Java——深入理解Class对象(一):什么是Class对象
  7. 测试工程师的简历到底怎么写?
  8. Android 8.1 谷歌Nexus 6 刷机过程简要记录
  9. 逆袭之路——python 数据发展史、MySQL的下载和安装、基本SQL语句【day45】
  10. 文件名批量转换为拼音名