python+opencv识别鼻孔并打印鼻孔中心坐标
代码
import cv2
import imutils
# 人脸识别分类器
faceCascade = cv2.CascadeClassifier(
r"D:\PYcharm\PyCharm Community Edition 2020.3.3\venv\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml")
# 识别眼睛的分类器
# eyeCascade = cv2.CascadeClassifier(r'D:\PYcharm\PyCharm Community Edition 2020.3.3\venv\Lib\site-packages\cv2\data\haarcascade_eye.xml')
eyeCascade = cv2.CascadeClassifier(
r'D:\MATLAB\mcr\toolbox\vision\visionutilities\classifierdata\cascade\haar\haarcascade_mcs_nose.xml')
# 开启摄像头
cap = cv2.VideoCapture(0)
ok = True
nosej=["左鼻孔","右鼻孔"]
center=[";","\n"]
while ok:
# 读取摄像头中的图像,ok为是否读取成功的判断参数
ok, img = cap.read()
img2 = img
# 转换成灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 人脸检测
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=15,
minSize=(32, 32)
)
# 在检测人脸的基础上检测眼睛
for (x, y, w, h) in faces:
fac_gray = gray[y: (y + h), x: (x + w)]
result = []
eyes = eyeCascade.detectMultiScale(fac_gray, 1.3, 5, cv2.CASCADE_SCALE_IMAGE, (40, 40), (80, 80))
for (ex, ey, ew, eh) in eyes:
# print(eyes[0])
result.append((x + ex, y + ey, ew, eh))
# print("www",result)
# 画矩形
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
try:
for (ex, ey, ew, eh) in result:
cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) # 鼻子
img_eye_l = cv2.resize(img2[result[0][1]:result[0][1] + result[0][3], result[0][0]:result[0][0] + result[0][2]], (300, 300))
img_eye_l = img_eye_l[60:240, 10:290]
image = img_eye_l
image = cv2.resize(image, (image.shape[1], image.shape[0]))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 灰度
blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 5x5的内核的高斯平滑
##################################
thresh = cv2.threshold(blurred, 40, 255, cv2.THRESH_BINARY_INV)[1] # 阈值化,阈值化后形状被表示成黑色背景上的白色前景。
############################# ↑ (1,74)
cv2.imshow("Image", thresh)
# 在阈值图像中查找轮廓
# 找到白色对应的边界点的集合
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
# 计算轮廓中心
m=1
for c in cnts:
m+=1
n=m%2
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# 在图像上绘制形状的轮廓和中心
cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1)
cv2.putText(image, "center", (cX - 20, cY - 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
# 展示图片
cv2.imshow("Image", image)
# with open(file_path, 'w') as w_obj:
# w_obj.write(str(cX) +' ' + str(cY)+ "\n")
cv2.waitKey(1)
# print("左鼻孔:", cX, "右鼻孔:", cY)
print("相对于鼻子的坐标:"f"{nosej[n]}:"f"({cX},{cY})",end=center[0])
print("相对于脸的坐标:"f"{nosej[n]}:"f"({cX+x},{cY+y})",end=center[0])
print("相对于摄像头的坐标:"f"{nosej[n]}:"f"({cX + ex},{cY + ey})", end=center[1])
except:
pass
cv2.imshow('video', img)
k = cv2.waitKey(1)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()