바뀜

둘러보기로 가기 검색하러 가기
314 바이트 추가됨 ,  2021년 9월 30일 (목) 16:34
편집 요약 없음
51번째 줄: 51번째 줄:  
     '''이미지를 받아 해당 얼굴을 찾는다.'''
 
     '''이미지를 받아 해당 얼굴을 찾는다.'''
 
     faces = detector(img)  # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
 
     faces = detector(img)  # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
     try:
+
     for face in faces:
        face = faces[0]  # 인식된 얼굴 중 첫번째.
   
         # 인식이 잘 되었는지 확인. 네모 그리기. 기존 이미지에 덧씌워 보여준다.
 
         # 인식이 잘 되었는지 확인. 네모 그리기. 기존 이미지에 덧씌워 보여준다.
 
         img = cv2.rectangle(img, pt1=(face.left(), face.top()), pt2=(face.right(), face.bottom()),
 
         img = cv2.rectangle(img, pt1=(face.left(), face.top()), pt2=(face.right(), face.bottom()),
59번째 줄: 58번째 줄:  
                             lineType=cv2.LINE_AA    # 선의 타입 지정
 
                             lineType=cv2.LINE_AA    # 선의 타입 지정
 
                             )
 
                             )
    except:  # 얼굴이 없으면 faces[0]에서 인덱스 에러가 뜬다. 그럴 땐 그냥 패스!
  −
        pass
   
     cv2.imshow('window', img)  # 창에 해당하는 이미지를 띄운다.
 
     cv2.imshow('window', img)  # 창에 해당하는 이미지를 띄운다.
     cv2.waitKey(1)  # 1ms만큼 대기 해야 창이 제대로 열린다.
+
     cv2.waitKey(1)  # 이게 있어야 창이 제대로 열린다.
 +
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
80번째 줄: 78번째 줄:  
     '''이미지를 받아 얼굴의 특징점을 찾는다.'''
 
     '''이미지를 받아 얼굴의 특징점을 찾는다.'''
 
     faces = detector(img)  # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
 
     faces = detector(img)  # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
     try:
+
     for face in faces:
        face = faces[0]  # 인식된 얼굴 중 첫번째.
   
         dlib_shape = predictor(img, face)  # 특징점을 리턴받는다.
 
         dlib_shape = predictor(img, face)  # 특징점을 리턴받는다.
 
         shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])  # 연산을 위해 배열로 저장.
 
         shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])  # 연산을 위해 배열로 저장.
 
         for s in shape_2d:  # 해당 좌표에 원 그리기. 68개의 특징점을 찾는다.
 
         for s in shape_2d:  # 해당 좌표에 원 그리기. 68개의 특징점을 찾는다.
 
             cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
 
             cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
    except:
+
 
        pass
   
     cv2.imshow('window', img)  # 창에 해당하는 이미지를 띄운다.
 
     cv2.imshow('window', img)  # 창에 해당하는 이미지를 띄운다.
     cv2.waitKey(1)  # 1ms만큼 대기 해야 창이 제대로 열린다.
+
     cv2.waitKey(1)  # 이게 있어야 창이 제대로 열린다.
 
</syntaxhighlight>앞으로의 목표는 많은 얼굴에 대해서도 찾는 것...
 
</syntaxhighlight>앞으로의 목표는 많은 얼굴에 대해서도 찾는 것...
   102번째 줄: 98번째 줄:  
     '''1. 이미지를 받아 얼굴의 중심점을 찾는다. 2. 그 지점에 이미지를 불러온다.'''
 
     '''1. 이미지를 받아 얼굴의 중심점을 찾는다. 2. 그 지점에 이미지를 불러온다.'''
 
     faces = detector(img)  # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
 
     faces = detector(img)  # 디텍터에 이미지를 넣어주어 얼굴을 찾는다.
     try:
+
     blind_image = img.copy()
        face = faces[0]  # 인식된 얼굴 중 첫번째.
+
    for face in faces:
         dlib_shape = predictor(img, face)  # 특징점을 리턴받는다.
+
         try:
        shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])  # 연산을 위해 배열로 저장.
+
            dlib_shape = predictor(img, face)  # 특징점을 리턴받는다.
        center_x, center_y = np.mean(shape_2d, axis=0).astype(np.int)  # 중심점을 찾는다.
+
            shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])  # 연산을 위해 배열로 저장.
        overlay = cv2.imread(address, cv2.IMREAD_UNCHANGED)  # 이미지를 불러온다. 알파채널까지 읽기 위한 옵션.
+
            center_x, center_y = np.mean(shape_2d, axis=0).astype(np.int)  # 중심점을 찾는다.
        # 얼굴 경계 찾기.
+
            overlay = cv2.imread(address, cv2.IMREAD_UNCHANGED)  # 이미지를 불러온다. 알파채널까지 읽기 위한 옵션.
        min_coords = np.min(shape_2d, axis=0)  # 각 열에 대해 가장 작은 값들.
+
            # 얼굴 경계 찾기.
        max_coords = np.max(shape_2d, axis=0)
+
            min_coords = np.min(shape_2d, axis=0)  # 각 열에 대해 가장 작은 값들.
        face_size = max(max_coords - min_coords)
+
            max_coords = np.max(shape_2d, axis=0)
        # 덮을 이미지가 얼굴 인식에 따라 급격하게 변하기 때문에, 이를 중화하기 위한 코드.
+
            face_size = max(max_coords - min_coords)
        face_sizes.append(face_size)
+
            # 덮을 이미지가 얼굴 인식에 따라 급격하게 변하기 때문에, 이를 중화하기 위한 코드.
        if len(face_sizes) > 10:
+
            face_sizes.append(face_size)
            del face_sizes[0]
+
            if len(face_sizes) > 10:
        mean_face_size = int(np.mean(face_sizes) * 2.0)  # 얼굴을 적절히 덮기 위한 숫자보정.
+
                del face_sizes[0]
        origin_image = img.copy()
+
            mean_face_size = int(np.mean(face_sizes) * 2.0)  # 얼굴을 적절히 덮기 위한 숫자보정.
        # 다음 사용하는 함수는 아랫쪽에 정의되어 있다.
+
            # 다음 사용하는 함수는 아랫쪽에 정의되어 있다.
        result = overlay_transparent(x=center_x, y=center_y - 25,  # 얼굴의 중심을 찾고 숫자로 보정해준다.
+
            blind_image = overlay_transparent(x=center_x, y=center_y - 25,  # 얼굴의 중심을 찾고 숫자로 보정해준다.
                                    background_img=origin_image,  # 기존 이미지.
+
                                        background_img=blind_image,  # 기존 이미지.
                                    img_to_overlay_t=overlay,  # 덮을 이미지.
+
                                        img_to_overlay_t=overlay,  # 덮을 이미지.
                                    overlay_size=(mean_face_size, mean_face_size))
+
                                        overlay_size=(mean_face_size, mean_face_size))
         cv2.imshow('window', result) # 창에 해당하는 이미지를 띄운다.
+
         except:  # 이상하게 얼굴 2개를 인식하게 되는 순간 에러가 난다....왤까...
    except:
+
            pass  # 근데, 에러가 나도 1,2 프레임 뿐인지, 그냥 pass처리하면 잘 나온다;;
         cv2.imshow('window', img)  # 얼굴 인식이 안되면 이미지를 그냥 띄우기
+
        '''이유를 찾았다.
        pass
+
        OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-czu11tvl\opencv\modules\core\src\arithm.cpp:230: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'cv::binary_op'
     cv2.waitKey(1)  # 1ms만큼 대기 해야 창이 제대로 열린다.
+
        위 에러는 덮어씌우는 이미지가 해당 창 밖으로 나갈 때 발생하는 에러이다.
 +
         '''
 +
    cv2.imshow('window', blind_image)  # 창에 해당하는 이미지를 띄운다.
 +
     cv2.waitKey(1)  # 이게 있어야 창이 제대로 열린다.
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
169번째 줄: 168번째 줄:  
</syntaxhighlight>
 
</syntaxhighlight>
 
|}
 
|}
 +
[[분류:딥러닝 트레킹]]

둘러보기 메뉴