티스토리 뷰

📌 지난 회의 회고

✔️ 학인된 것

1) 실제 안드로이드 기기에서 mediapipe 테스트

: 프로그램을 1시간 이상 켜둔 결과 발열에 큰 이상은 없었음

: 좀 더 검증이 필요하겠지만 메모리 이슈만 생기지 않는다면 오래 켜놓아도 큰 문제는 없을 것

: mediapipe가 가상 환경과 달리 실제 환경에서는 빠르게 사람을 트래킹하는 것이 확인

 

2) 낙상 판별 근거

: 움직임의 변화 속도 -> 빠르게 속도가 변화한다면 그만큼 낙상 할/했을 확률이 높을 것

: 포즈 변화 분석 -> 포즈 인식 모듈 개발 필요

: 무게 중심 -> 인체 분절 기반으로 중심을 알아내는 방식

 

✔️ 의논한 것

- 낙상 판별 알고리즘 초안

: 4가지 케이스로 나누어 판별, 침대를 위험 지역과 안전 지역으로 나누어 무게 중심이 안전 지역이면 ①

위험 지역이면 ②

②에서 포즈를 인식하여 굴러 떨어질 위험이 있는 포즈라면 ③

③에서 속도 변화를 관찰하여 빠르게 움직이거나 아예 침대 밖이라면 낙상으로 간주하여

 

✔️ 해야할 것

1️⃣ 병상 영역 검출 By OpenCV

🔎 전처리

: 배경과 병상 분리, 필요한 정보 강조

→ 가우시안 블러(이미지의 노이즈를 줄이는 기법)

→ 색상 공간 변환

→ 이진화

→ 엣지 감지(Canny 엣지 검출)

 

💁🏻‍♀️ 그레이 스케일(흑백)으로 전환?

💡 그레이 스케일을 적용하면 input의 차원↓ + 연산 효율성↑ + 비교적 노이즈에 둔감

    그래서 컬러 정보가 중요한 작업이 아니면 보통 명암 정보에 관심이 있기때문에 그레이 스케일로 변환을 함!

 

🔎 영역검출

: 병상 영역을 검출하는 알고리즘 적용 → 병상 패턴, 색상(흰색) 또는 형태(직사각형) 검출 → 컨투어 검출, 객체 탐지 알고리즘

 

📋 참고 중인 파이썬 코드

import cv2
import numpy as np

def clahe(img, clip_limit=2.0, grid_size=(8,8)): # 영상의 대비를 향상시키기 위한 이미지 프로세싱
    clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=grid_size)
    return clahe.apply(img)

cap = cv2.VideoCapture(1) # 웹캠에서 프레임 캡쳐 (무한 루프)

while True:
    ret, src = cap.read()

    if not ret:
        print("Failed to capture frame")
        break

    # HSV thresholding to get rid of as much background as possible
    # 가능한 한 많은 배경을 제거하기 위한 HSV(그 중에서도 blue) 임계값 설정 (전처리)
    hsv = cv2.cvtColor(src.copy(), cv2.COLOR_BGR2HSV) # 입력 이미지를 HSV 색상 공간으로 변환
    lower_blue = np.array([0, 0, 120])
    upper_blue = np.array([180, 38, 255])
    mask = cv2.inRange(hsv, lower_blue, upper_blue)
    result = cv2.bitwise_and(src, src, mask=mask)
    b, g, r = cv2.split(result)
    g = clahe(g, 5, (3, 3))

    # Adaptive Thresholding to isolate the bed
    # 침대를 격리하기 위한 Adaptive Thresholding
    img_blur = cv2.blur(g, (9, 9))
    img_th = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                   cv2.THRESH_BINARY, 51, 2) # 가우시안 필터 기반으로 적응형 임계값(Adaptive Thresholding)을 설정

    contours, _ = cv2.findContours(img_th, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # 이진 이미지에서 객체의 컨투어(윤곽선)를 검출

    # Filter the rectangle by choosing only the big ones
    # and choose the brightest rectangle as the bed
    # 큰 직사각형만 선택하여 직사각형 필터링
    # 그리고 가장 밝은 직사각형을 침대로 선택
    max_brightness = 0
    canvas = src.copy()
    brightest_rectangle = None
    for cnt in contours:
        rect = cv2.boundingRect(cnt)
        x, y, w, h = rect
        if w*h > 40000:
            mask = np.zeros(src.shape, np.uint8)
            mask[y:y+h, x:x+w] = src[y:y+h, x:x+w]
            brightness = np.sum(mask)
            if brightness > max_brightness:
                brightest_rectangle = rect
                max_brightness = brightness
                

    if brightest_rectangle:
        x, y, w, h = brightest_rectangle
        cv2.rectangle(canvas, (x, y), (x+w, y+h), (0, 255, 0), 1)

    cv2.imshow("canvas", canvas) # 원본 영상 위에 선택된 침대의 위치를 사각형으로 표시

    # Exit loop when "ESC" key is pressed
    # "ESC" 키를 누르면 루프 종료
    key = cv2.waitKey(1)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함