目标:使用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)相关推荐

  1. Others12_瞳距测量的方法大全

    无论你是在网上配眼镜,还是在实体眼镜店配眼镜,瞳距是必不可少的.那什么是瞳距?拿什么去测量?怎样去测量?如果瞳距测量的不对,又会给我们的眼睛带来怎么样的伤害呢?这一些列的问题在我们平时配眼镜的时候都是 ...

  2. python opencv单目测距 小孔成像原理

    python opencv单目测距 小孔成像原理 小孔成像原理 代码 opencv>3.x 小孔成像原理 一 用相似三角形计算物体或者目标到相机的距离 我们将使用相似三角形来计算相机到一个已知的 ...

  3. python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学检测

     本篇博客接着讲解机器视觉的有关技术和知识.包括宽度测量,缺陷检测,医学处理. 一:宽度测量   在传统的自动化生产中,对于尺寸的测量,典型的方法就是千分尺.游标卡尺.塞尺等.而这些测量手段测量精度低 ...

  4. 【Python+OpenCV+sklearn+easygui】人脸(口罩)识别+口罩下人脸补全的系统设计

    [写在前面:笔者是一个才接触python半年之久的编程菜鸡,刚好这学期的课程需要用到python做一些有关计算机视觉的设计,于是就根据自己所学,同时借鉴了一些CSDN上各位大佬的思路和代码,做了一个简 ...

  5. Python+OpenCV实现自动扫雷,挑战扫雷世界记录!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自知乎Artrix https://zhuanlan.zh ...

  6. Python+OpenCV实现自动扫雷,创造属于自己的世界记录!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自知乎Artrix https://zhuanlan.zh ...

  7. 使用Python+OpenCV+dlib为人脸生成口罩

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  8. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

  9. Python+OpenCV:直方图(Histograms)

    Python+OpenCV:直方图(Histograms) 理论 什么是直方图?您可以将直方图看作是一种图形或图表,它为您提供关于图像强度分布的总体概念.它是x轴为像素值(范围从0到255,不总是这样 ...

最新文章

  1. 论坛社区做推广要精心的策划
  2. 如何编写和应用Java的自定义异常类
  3. 方差 标准差_方差与标准差——杭州市初中数学核心组寒假微课学习八年级第38课...
  4. php集合与数组的区别,java集合与数组的区别
  5. Linux 下安装与卸载JDK
  6. 如何以10倍速加速Apache Xalan的XPath处理器
  7. Taro+react开发(50) 小程序触底操作
  8. python全栈要学什么_python全栈要学什么 python全栈学习路线
  9. 爬虫-访问用户中心页面-服务端做了些什么
  10. 离开小米后 周受资将加入字节跳动担任CFO
  11. Linux基础-1使用命令帮助
  12. cmd使用SBT构建scala项目
  13. 人工智能专业就业有哪些岗位方向
  14. GNS3 2.1.9版本的安装
  15. python通讯录管理系统设计_通讯录程序设计报告
  16. word vba 控制光标常用代码
  17. Node.js及Express的下载、安装和配置教程
  18. 三种隐藏 HTML 元素的方式
  19. [走过的路]联想时光——人艰不拆(店员篇+推销员篇)
  20. GDK动态代理原理分析

热门文章

  1. error when running snapcast:[Err]Exception:Could not lock PID lock file /var/run/snapclient/pid
  2. 台式计算机idc数据排名,IDC:2018年全球个人计算设备出货量约为4.07亿台 下滑大约3.9%...
  3. 博图Modbus组态及参数设定源码
  4. Getway网关管理ZUUL
  5. PC键盘驱动程序源码分析
  6. 性能测试第一步--性能需求分析
  7. tcp/ip协议概述(8)----TCP/IP加速原理详解
  8. C# HalconDotNet 工业视觉处理
  9. rv-star开发板点灯实验
  10. 学Html之洪荒之力,治CSDN之殇!