首页 > 编程知识 正文

opencv二维码定位,opencv 人脸识别

时间:2023-05-03 10:06:41 阅读:166844 作者:500

在项目中,在包含人脸的图像中,有脸的部分(口、眉等部分)需要进行标记。

代码实现1、工具包importnumpyasnpimportdlibimportcv 2的引入,在关键点位置定义人脸部分的公式文档中,提取68个关键点来表示人脸部分。 其中:

第1至17分:脸颊; 第18个点到第22个点:右眉; 第二十三至二十七:左眉; 第28款至第36款:鼻子; 第37至42款:右眼; 第43至48条:左眼; 第49至68条:口。

如下图所示。

facial_landmarks_68_idxs=dict () (mouth ),(48,68 ) )、(right_eyebrow )、(17,22 ) )、(left )。 (42, 48 )、)、nose、)、36 )、)、jaw、(0,17 ) ) 3、 dlib库中的面部检测和关键点定位detector=dlib.get _ frontal _ face _ detector (将predictor=dlib.shape _ predictor () ) LiudeHua.jpg ' ) h,w )=image.shape [ :2 ] width=500 r=width/flo ape int (h * r ) ) image=cv2.resize ) image

6、获得关键点的坐标shape=predictor(gray,rect )此处返回的shape需要提取其中包含的坐标信息,而不是关键点的坐标。

写入shape_to_NP(shape,dtype=“int”)函数,将其转换为可使用shape返回值的坐标信息。

defshape_to_NP(shape,dtype='int ' ) : # )创建68*2coords=NP.zeros () shape.num_parts,2 ),dtype

shape=shape_to_NP(shape ) 7、在图中绘制每个键的for(name,(I,j ) ) in facial _ landmarks _ 68 _ idxs.items ) 33666 2 )根据#位置绘制点for(x,y ) inshape[I:j]3360cv2 )提取ROI区域(x,y,w,h )=cv2.boundingrect ) NP.arry ([ x:x w )=ROI.shape [ :2 ] width=250 r=width/float (w ) dim=(width,int(h*r ) ) ROI=cv2.resize ) rom

创建#两个copy # overlayandoneforthefinaloutputimageoverlay=image.copy (output=image.copy ) #以创建几个色域ifcolorsisnonationg

, 76, 240), (230, 159, 23), (168, 100, 168), (158, 163, 32), (163, 38, 32), (180, 42, 220)]# 遍历每一个区域for (i, name) in enumerate(FACIAL_LANDMARKS_68_IDXS.keys()): # 得到每一个点的坐标 (j, k) = FACIAL_LANDMARKS_68_IDXS[name] pts = shape[j:k] # 检查位置 if name == "jaw": # 用线条连起来 for l in range(1, len(pts)): ptA = tuple(pts[l - 1]) ptB = tuple(pts[l]) cv2.line(overlay, ptA, ptB, colors[i], 2) # 计算凸包 else: hull = cv2.convexHull(pts) cv2.drawContours(overlay, [hull], -1, colors[i], -1)# 叠加在原图上,可以指定比例cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)# 展示所有区域output = visualize_facial_landmarks(image, shape)cv2.imshow("Image", output)cv2.waitKey(0)cv2.destroyAllWindows()

如果检测的图片中有两张人脸,只需要加一个循环即可,参考下面的完整代码部分。

完整代码 #导入工具包import numpy as npimport dlibimport cv2#https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/#http://dlib.net/files/FACIAL_LANDMARKS_68_IDXS = dict([("mouth", (48, 68)),("right_eyebrow", (17, 22)),("left_eyebrow", (22, 27)),("right_eye", (36, 42)),("left_eye", (42, 48)),("nose", (27, 36)),("jaw", (0, 17))])def shape_to_np(shape, dtype="int"):# 创建68*2coords = np.zeros((shape.num_parts, 2), dtype=dtype)# 遍历每一个关键点# 得到坐标for i in range(0, shape.num_parts):coords[i] = (shape.part(i).x, shape.part(i).y) # 第i个关键点的横纵坐标。return coordsdef visualize_facial_landmarks(image, shape, colors=None, alpha=0.75):# 创建两个copy# overlay and one for the final output imageoverlay = image.copy()output = image.copy()# 设置一些颜色区域if colors is None:colors = [(19, 199, 109), (79, 76, 240), (230, 159, 23),(168, 100, 168), (158, 163, 32),(163, 38, 32), (180, 42, 220)]# 遍历每一个区域for (i, name) in enumerate(FACIAL_LANDMARKS_68_IDXS.keys()):# 得到每一个点的坐标(j, k) = FACIAL_LANDMARKS_68_IDXS[name]pts = shape[j:k]# 检查位置if name == "jaw":# 用线条连起来for l in range(1, len(pts)):ptA = tuple(pts[l - 1])ptB = tuple(pts[l])cv2.line(overlay, ptA, ptB, colors[i], 2)# 计算凸包else:hull = cv2.convexHull(pts)cv2.drawContours(overlay, [hull], -1, colors[i], -1)# 叠加在原图上,可以指定比例cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)return output# 加载人脸检测与关键点定位detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 读取输入数据,预处理image = cv2.imread('./images/liudehua2.jpg')(h, w) = image.shape[:2]width=500r = width / float(w)dim = (width, int(h * r))image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 人脸检测rects = detector(gray, 1)# 遍历检测到的框for (_, rect) in enumerate(rects):# 对人脸框进行关键点定位# 转换成ndarrayshape = predictor(gray, rect)shape = shape_to_np(shape)# 遍历每一个部分for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items():clone = image.copy()cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,0.7, (0, 0, 255), 2)# 根据位置画点for (x, y) in shape[i:j]:cv2.circle(clone, (x, y), 3, (0, 0, 255), -1)# 提取ROI区域(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))roi = image[y:y + h, x:x + w](h, w) = roi.shape[:2]width=250r = width / float(w)dim = (width, int(h * r))roi = cv2.resize(roi, dim, interpolation=cv2.INTER_AREA)# 显示每一部分cv2.imshow("ROI", roi)cv2.imshow("Image", clone)cv2.waitKey(0)# 展示所有区域output = visualize_facial_landmarks(image, shape)cv2.imshow("Image", output)cv2.waitKey(0)cv2.destroyAllWindows() 最终效果


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。