【问题标题】:how to mesure the distance between 2 points in the facial landmarks from dlib 68 x- y-coordinates如何从 dlib 68 x-y 坐标测量面部地标中 2 个点之间的距离
【发布时间】:2020-09-03 18:11:16
【问题描述】:

我正在使用 python 代码拍摄照片,如果某些面部地标(dlib 的)之间的距离有条件,实际上是点 1 和点 29 之间的距离除以点 17 的距离并且 29 介于 1.1 和 .9 之间,那么应该拍照,这是地标的图表和正在工作的代码

COUNTER = 0
TOTAL = 0


shape_predictor= "shape_predictor_68_face_landmarks.dat" #dace_landmark
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(shape_predictor)


(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"]
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]
(jStart,jEnd) = face_utils.FACIAL_LANDMARKS_IDXS["jaw"]
(reStart,reEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eyebrow"]
(leStart,leEnd)= face_utils.FACIAL_LANDMARKS_IDXS["left_eyebrow"]
(nStart,nEnd)= face_utils.FACIAL_LANDMARKS_IDXS["nose"]
#video que vamos a procesar

print("[INFO] starting video stream thread...")
vs = VideoStream(src=0).start()
fileStream = False
time.sleep(1.0)

fps= FPS().start()
cv2.namedWindow("test")
while True:
    frame = vs.read()
    frame = imutils.resize(frame, width=450)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    rects = detector(gray, 0)
    for rect in rects:
        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)
        mouth= shape[mStart:mEnd]
        left_eye= shape[lStart:lEnd]
        right_eye = shape[rStart:rEnd]
        jaw = shape[jStart:jEnd]
        right_eyebrow = shape[reStart:reEnd]
        left_eyebrow = shape[leStart:leEnd]
        nose = shape[nStart:nEnd]

        #here is where i need help
        l1= what do i need to put here?
        l2 = what do i need to put here?
        ratio = l1/l2

        mouthHull = cv2.convexHull(mouth)
        left_eyeHull = cv2.convexHull(left_eye)
        right_eyehHull = cv2.convexHull(right_eye)
        jawhHull = cv2.convexHull(jaw)
        right_eyebrowHull = cv2.convexHull(right_eyebrow)
        noseHull = cv2.convexHull(nose)
        left_eyebrowHull = cv2.convexHull(left_eyebrow)
        #print(shape)
        cv2.drawContours(frame, [mouthHull,left_eyeHull, right_eyehHull, jawhHull, right_eyebrowHull, noseHull, left_eyebrowHull], -1, (0, 255, 0), 1)


        if ratio <= .9 or mar > 1.1 :
            COUNTER += 1
        else:
            if COUNTER >= 15:
                TOTAL += 1
                frame = vs.read()
                time.sleep(.3)
                frame2= frame.copy()
                img_name = "opencv_frame_{}.png".format(TOTAL)
                #cv2.imwrite(img_name, frame)
                print("{} written!".format(img_name))
            COUNTER = 0

        cv2.putText(frame, "the ratio from l1 and l2 is: {}".format(distance), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    cv2.imshow("Frame", frame)
    fps.update()

    key2 = cv2.waitKey(1) & 0xFF
    if key2 == ord('q'):
        break
fps.stop()


cv2.destroyAllWindows()
vs.stop()

现在我的问题是我不知道如何计算两个地标之间的距离,我在代码中放了一条需要帮助的评论。

如果有人能帮助我,我将不胜感激,在此先感谢

【问题讨论】:

  • 两点之间的距离公式在许多地方都有记载。我们希望您在发布之前进行此类研究。你被困在哪里了?另外,请将其减少并增强为预期的MRE。不接受针对 5 行问题发布所有代码。
  • 抱歉,我不明白的是如何在图片表示的 x,y 平面中找到编号为 1、17 和 29 的地标;为了计算欧几里得距离,我希望我足够清楚,以便您可以帮助我,现在将编辑代码以使其更容易接受并等待任何帮助,感谢您的评论
  • 请从intro tour 重复how to ask。当您对问题有明确的解释时,我们或许可以提供帮助。
  • 谢谢我解决了
  • 如果您对网站有实质性贡献,请发布正确的问题和您的解决方案。如果没有,请删除问题。

标签: python facial-landmark-alignment


【解决方案1】:

在我使用的条件下完成了

l1= math.sqrt((jaw[0][0]-nose[1][0])**2+(jaw[0][1]-nose[1][1])**2)
            l2 = math.sqrt((jaw[16][0]-nose[1][0])**2+(jaw[16][1]-nose[1][1])**2)
            ratio = l1/l2
            m = (jaw[0][1]-jaw[16][1])/(jaw[0][0]-jaw[16][0])
            if (ratio <= 1.1 and ratio > .9) :
                cond1 = True
            else:
                cond1= False
            if (jaw[0][1]<= (nose[1][1]+5) and jaw[0][1]> (nose[1][1]-5)):
                cond2 = True
            else:
                cond2= False
            if (m <= .05 and m >-.05 ):
                cond3 = True
            else:
                cond3= False

主要思想是颚[0]表示属于颚的0点的点(x,y)

所以当下巴[0] 和鼻子[1] 之间的距离与下巴[16] 和鼻子[1] 之间的距离相似时,cond1 为真

当下巴的 y 坐标与鼻子的 y 坐标相似时,cond2 为真

最后一个条件是关于下颌[0]和下颌[16]之间的角度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2012-04-20
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多