作业:瞳距测量(python opencv)
目标:使用python及opencv库进行图片采集及瞳距计算
包含以下文件:
- capture.python:用以实现调用笔记本摄像头进行图片抓取
- feature.python:用以读取所抓取图片并进行瞳距计算
- capture.jpg:实验所用人脸图片数据
- haarcascade_frontalface_default.xml:opencv官网下载的用来检测人脸的数据文件
- haarcascade_eye.xml:opencv官网下载的用来检测人眼的数据文件
- 使用说明.txt:环境配置及代码运行说明
- .vscode:使用vscode编辑器时自动生成的配置文件
环境:
(opencv) E:\SoftwareProjection>conda list
# packages in environment at D:\miniconda\envs\opencv:
#
# Name Version Build Channel
astroid 2.4.2 pypi_0 pypi
certifi 2020.6.20 pyhd3eb1b0_3
colorama 0.4.4 pypi_0 pypi
imutils 0.5.3 pypi_0 pypi
isort 4.3.21 pypi_0 pypi
lazy-object-proxy 1.4.3 pypi_0 pypi
mccabe 0.6.1 pypi_0 pypi
numpy 1.18.5 pypi_0 pypi
opencv-python 4.4.0.42 pypi_0 pypi
pip 10.0.1 py35_0
pylint 2.6.0 pypi_0 pypi
python 3.5.6 he025d50_0
setuptools 40.2.0 py35_0
six 1.15.0 pypi_0 pypi
toml 0.10.2 pypi_0 pypi
typed-ast 1.4.1 pypi_0 pypi
vc 14.1 h0510ff6_4
vs2015_runtime 14.16.27012 hf0eaf9b_3
wheel 0.35.1 pyhd3eb1b0_0
wincertstore 0.2 py35hfebbdb8_0
wrapt 1.12.1 pypi_0 pypi
实现过程及结果:
capture.py:
调用摄像头采集图片,按s键可保存图片capture.jpg(分辨率:640×480)至当前路径,按ESC退出。若路径下本身存在同名文件,则会进行覆盖。
图片要求:人脸清晰,光线充足,且不能佩戴眼镜(眼镜反光会导致无法识别)
import numpy as np
import cv2
cap=cv2.VideoCapture(0) #参数为0为笔记本自带摄像头
while True:success,img=cap.read() #从摄像头读取图片#gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转为灰度图片cv2.imshow("img",img) #显示摄像头k=cv2.waitKey(1) #保持画面的持续。if k == 27:cv2.destroyAllWindows() #通过esc键退出摄像breakelif k==ord("s"):#通过s键保存图片,并退出。cv2.imwrite("capture.jpg",img)cv2.destroyAllWindows()break
#关闭摄像头
cap.release()
feature.py:
思路:
1)将采集得到图片先进行预处理(包括滤波,彩色图像转灰度图像等);
2)随后利用adaboost算法进行人脸和人眼检测,定位人眼位置,并进行分割;
3)将眼睛图片进行二值化,进行一次开运算以分割眼球位置,通过计算中心矩以确定质心;
4)将局部图片中质心坐标还原到原始图片,计算两个质心距离,得到瞳距(单位是像素)。
5)若需要将距离转化为厘米,则需要事先进行标定,以确立像素转化至标准长度单位的系数。
import numpy as np
import cv2
import imutilsnp.set_printoptions(threshold=np.inf)
# import matplotlib.pyplot as pltimg = cv2.imread('capture.jpg')
img_filter = cv2.bilateralFilter(img,5,25,50) #双边滤波(去噪+美颜)
# cv2.imshow('img_filter',img_filter)
# cv2.waitKey()#************利用Adaboost进行人脸和眼睛检测*****************face_xml = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('haarcascade_eye.xml')gray = cv2.cvtColor(img_filter, cv2.COLOR_BGR2GRAY)
# 1.灰色图像 2.缩放系数 3.目标大小
faces = face_xml.detectMultiScale(gray, 1.3, 5)
# print('face = ',len(faces))
# print(faces)
#绘制人脸,为人脸画方框
for (x,y,w,h) in faces:cv2.rectangle(img, (x,y), (x + w, y + h), (255,0,0), 2)roi_face = gray[y:y+h,x:x+w]roi_color = img[y:y+h,x:x+w]eyes = eye_xml.detectMultiScale(roi_face)# print('eyes = ',len(eyes))# print(eyes)for (ex,ey,ew,eh) in eyes:cv2.rectangle(roi_color, (ex,ey),(ex + ew, ey + eh), (0,255,0), 2)
# cv2.imshow('face_eye', img)
# cv2.waitKey(0)#**********对眼睛进行处理:提取眼睛的局部图片、二值化、分割眼球(先腐蚀再膨胀)、确定中点、还原坐标、计算距离******************
#提取眼睛的局部图片 %%%%% img(y,x,▲y,▲x) %%%%%
img_face = img[y:y+h,x:x+w]
img_eye1 = img_face[eyes[0,1]:eyes[0,1]+eyes[0,3],eyes[0,0]:eyes[0,0]+eyes[0,2]]
img_eye2 = img_face[eyes[1,1]:eyes[1,1]+eyes[1,3],eyes[1,0]:eyes[1,0]+eyes[1,2]]# cv2.imshow('eye1',img_eye2)
# cv2.waitKey()#二值化
img_gray1 = cv2.cvtColor(img_eye1, cv2.COLOR_BGR2GRAY)
ret,img_binary1 = cv2.threshold(img_gray1, 70, 255, cv2.THRESH_BINARY_INV)
img_gray2 = cv2.cvtColor(img_eye2, cv2.COLOR_BGR2GRAY)
ret,img_binary2 = cv2.threshold(img_gray2, 70, 255, cv2.THRESH_BINARY_INV)# cv2.imshow('eye1', img_binary2)
# cv2.waitKey()#开运算,先腐蚀再膨胀,去除其他噪声,分割眼球
img_element1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11),(-1,-1))
img_center1 = cv2.morphologyEx(img_binary1,cv2.MORPH_OPEN,img_element1)
img_element2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11),(-1,-1))
img_center2 = cv2.morphologyEx(img_binary2,cv2.MORPH_OPEN,img_element2)# cv2.imshow("eye image", img_center2)
# cv2.waitKey()#left eye
cnts1 = cv2.findContours(img_center1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts1 = imutils.grab_contours(cnts1)for c in cnts1: #计算中心矩M = cv2.moments(c)cX1 = int(M["m10"] / M["m00"])cY1 = int(M["m01"] / M["m00"])#right eye
cnts2 = cv2.findContours(img_center2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts2 = imutils.grab_contours(cnts2)for c in cnts2: #计算中心矩M = cv2.moments(c)cX2 = int(M["m10"] / M["m00"])cY2 = int(M["m01"] / M["m00"])#坐标还原
x1 = cX1 + eyes[0,0] + x
y1 = cY1 + eyes[0,1] + y
x2 = cX2 + eyes[1,0] + x
y2 = cY2 + eyes[1,1] + y
p1 = (x1,y1)
p2 = (x2,y2)
# print(p1)
# print(p2)cv2.circle(img_filter, p1, 1, (0,0,255),0)
cv2.circle(img_filter, p2, 1, (0,0,255),0)# cv2.imshow('result',img_filter)
# cv2.waitKey()distance = pow(pow((x1-x2),2)+pow((y1-y2),2),0.5)t = 0.933 #t值为像素值到实际距离的转换,需要提前标定得到
distance_mm = distance * tprint('pixel = ',distance)
print('discance = ', distance_mm, 'mm')# print('img_center1',img_center1.shape)
# print('img_binary1',img_binary1.shape)
# print(img_filter.shape)
# print(img_face.shape)
# print(img_eye1.shape)
作业:瞳距测量(python opencv)相关推荐
- Others12_瞳距测量的方法大全
无论你是在网上配眼镜,还是在实体眼镜店配眼镜,瞳距是必不可少的.那什么是瞳距?拿什么去测量?怎样去测量?如果瞳距测量的不对,又会给我们的眼睛带来怎么样的伤害呢?这一些列的问题在我们平时配眼镜的时候都是 ...
- python opencv单目测距 小孔成像原理
python opencv单目测距 小孔成像原理 小孔成像原理 代码 opencv>3.x 小孔成像原理 一 用相似三角形计算物体或者目标到相机的距离 我们将使用相似三角形来计算相机到一个已知的 ...
- python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学检测
本篇博客接着讲解机器视觉的有关技术和知识.包括宽度测量,缺陷检测,医学处理. 一:宽度测量 在传统的自动化生产中,对于尺寸的测量,典型的方法就是千分尺.游标卡尺.塞尺等.而这些测量手段测量精度低 ...
- 【Python+OpenCV+sklearn+easygui】人脸(口罩)识别+口罩下人脸补全的系统设计
[写在前面:笔者是一个才接触python半年之久的编程菜鸡,刚好这学期的课程需要用到python做一些有关计算机视觉的设计,于是就根据自己所学,同时借鉴了一些CSDN上各位大佬的思路和代码,做了一个简 ...
- Python+OpenCV实现自动扫雷,挑战扫雷世界记录!
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自知乎Artrix https://zhuanlan.zh ...
- Python+OpenCV实现自动扫雷,创造属于自己的世界记录!
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自知乎Artrix https://zhuanlan.zh ...
- 使用Python+OpenCV+dlib为人脸生成口罩
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...
- Python+Opencv图像处理新手入门教程(三):阈值与二值化
一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...
- Python+OpenCV:直方图(Histograms)
Python+OpenCV:直方图(Histograms) 理论 什么是直方图?您可以将直方图看作是一种图形或图表,它为您提供关于图像强度分布的总体概念.它是x轴为像素值(范围从0到255,不总是这样 ...
最新文章
- 论坛社区做推广要精心的策划
- 如何编写和应用Java的自定义异常类
- 方差 标准差_方差与标准差——杭州市初中数学核心组寒假微课学习八年级第38课...
- php集合与数组的区别,java集合与数组的区别
- Linux 下安装与卸载JDK
- 如何以10倍速加速Apache Xalan的XPath处理器
- Taro+react开发(50) 小程序触底操作
- python全栈要学什么_python全栈要学什么 python全栈学习路线
- 爬虫-访问用户中心页面-服务端做了些什么
- 离开小米后 周受资将加入字节跳动担任CFO
- Linux基础-1使用命令帮助
- cmd使用SBT构建scala项目
- 人工智能专业就业有哪些岗位方向
- GNS3 2.1.9版本的安装
- python通讯录管理系统设计_通讯录程序设计报告
- word vba 控制光标常用代码
- Node.js及Express的下载、安装和配置教程
- 三种隐藏 HTML 元素的方式
- [走过的路]联想时光——人艰不拆(店员篇+推销员篇)
- GDK动态代理原理分析
热门文章
- error when running snapcast:[Err]Exception:Could not lock PID lock file /var/run/snapclient/pid
- 台式计算机idc数据排名,IDC:2018年全球个人计算设备出货量约为4.07亿台 下滑大约3.9%...
- 博图Modbus组态及参数设定源码
- Getway网关管理ZUUL
- PC键盘驱动程序源码分析
- 性能测试第一步--性能需求分析
- tcp/ip协议概述(8)----TCP/IP加速原理详解
- C# HalconDotNet 工业视觉处理
- rv-star开发板点灯实验
- 学Html之洪荒之力,治CSDN之殇!