반응형

대학생때 Toy Project로 진행하였던, 손가락 위치에 따른 Trex게임 제어를 포스팅 하겠습니다.

해당 프로젝트는 Mediapipe 라이브러리를 사용하여 손을 인식 시키고, 손가락 위치에 따른 키보드 제어를 통해 Google Trex게임을 다루어보았습니다.

https://google.github.io/mediapipe/solutions/hands.html

 

Hands

Cross-platform, customizable ML solutions for live and streaming media.

google.github.io

LandMark

Mediapipe의 hands는 손의 각 부분에 LandMark가 지정되어 있으며, LandMark의 위치에 따른 제어를 진행 할 수 있습니다.


Mediapipe 설치

cmd창에서 아래 코드 입력하시면, 설치를 진행하게 됩니다.

pip install mediapipe opencv-python


HandTrackingModule.py 모듈 생성

카메라에 화면을 띄우고 손을 인식 시키기위한 모듈 입니다.

import cv2
import mediapipe as mp
import time



class handDetector():
    def __init__(self, mode=False, maxHands = 2, detectionCon= 0.5, trackCon=0.5):
        self.mode = mode
        self.maxHands = maxHands
        self.detectionCon = detectionCon
        self.trackCon = trackCon

        self.mpHands = mp.solutions.hands
        self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.detectionCon, self.trackCon)
        self.mpDraw = mp.solutions.drawing_utils

    def findHands(self, img, draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.hands.process(imgRGB)
        # print(results.multi_hand_landmarks)

        if self.results.multi_hand_landmarks:
            for handLms in self.results.multi_hand_landmarks:
                if draw:
                    self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)

        return img

    def findPosition(self, img, handNo=0, draw=True):

        lmList = []
        if self.results.multi_hand_landmarks:
            myHand = self.results.multi_hand_landmarks[handNo]

            for id, lm in enumerate(myHand.landmark):
                # print(id, lm)
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                # print(id, cx, cy)
                lmList.append([id, cx, cy])
                if draw:
                    cv2.circle(img, (cx, cy), 3, (0, 0, 255), cv2.FILLED)

        return lmList

def main():
    pTime = 0
    cTime = 0
    cap = cv2.VideoCapture(1)
    detector = handDetector()

    while True:
        success, img = cap.read()
        img = detector.findHands(img)
        lmList = detector.findPosition(img)
        if len(lmList) != 0:
            print(lmList[4])

        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime

        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 255), 3)

        cv2.imshow("Image", img)
        cv2.waitKey(1)


if __name__ == "__main__":
    main()

Trex_jump.py

HandTracking 모듈을 연결 시켜주고, .pyautogui를 통하여 LandMark의 위치에 따라 키보드를 제어할 수 있습니다.

import cv2
import time
import HandTrackingModule as htm
import pyautogui

def jump():
    pyautogui.keyDown('space')
    time.sleep(0)
    print("jump")
    pyautogui.keyUp('space')

cap = cv2.VideoCapture(0)


detector = htm.handDetector(detectionCon=0.75)

while True:

    success, img = cap.read()
    img = detector.findHands(img)
    lmList = detector.findPosition(img, draw=False)
    # print(lmList)

    if len(lmList) != 0:
        if lmList[8][2] < lmList[6][2]: # y 방향일때 2 , x 방향일때 1
            jump()
            cv2.putText(img, "jump", (100, 70), cv2.FONT_HERSHEY_PLAIN, 2, (255, 255, 255), 3)

        if lmList[20][2] < lmList[18][2]:
            pyautogui.keyDown('down')
            time.sleep(0)
            print("down")
            cv2.putText(img, "Down", (480, 70), cv2.FONT_HERSHEY_PLAIN, 2, (255, 255, 255), 3)
        else:
            pyautogui.keyUp('down')


    cv2.imshow("Dino Hand Tracking", img)
    cv2.waitKey(1)

if lmList[8][2] < lmList[6][2]:

 LandMark의 8번이 6번 아래로 내려가게 되면, junp()라는 함수를 호출하고 "jump"라는 문구를 표시하게 됩니다.

 

if lmList[20][2] < lmList[18][2]:

LandMark의 8번이 6번 아래로 내려가게 되면, keyDown('down')이 호출되어 키보드 아래방향 키를 누른 상태를 보여주고 "jump"라는 문구를 표시하게 됩니다.

 

cv2.capture(0) 부분은 현재 기본으로 설정되어있는 카메라(노트북 내장 카메라)를 통해 화면을 띄워줍니다. 다른 카메라를 연결하여 사용하는 경우 해당 부분을 1로 바꾸로 사용하시면 다른 카메라를 사용하실 수 있습니다.


결과

Key Down
Key Up

반응형
반응형

중복 클래스 오류

 

kotlin-stdlib 버전 문제

 


시도1

gradle.properties

android.enableJetifier=true
android.useAndroidX=true

시도2

File - Invalidate Caches - INVALIDATE AND RESTART

 

Invalidate Caches


해결

build.gradle(:app)

configurations.all {
	...
    details.useVersion "1.6.+"
    // 1.+ -> 1.6+로 변경
}
반응형
반응형

호출이나 어떠한 동작에 딜레이를 주고싶을 때 사용합니다.

new Handler().postDelayed(new Runnable() {
    @Override
	// 지연할 부분
    }
}, 2000); // 2초

 

반응형
반응형
  • image파일의 경로 이상.
  • image파일의 경로의 log를 찍어보면 /content/— 형식으로 나오는데, /storage/emulated/0/Pictures/KakaoTalk/1664328418019.png 이러한 형식으로 변형해주어야 합니다.
publicString getPathFromUri(Uri uri){
Cursorcursor = getContentResolver().query(uri,null,null,null,null);
    cursor.moveToNext();
    String path = cursor.getString( cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
    cursor.close();
return path;
}

 

위 메소드를 통해 uri의 주소를 상대경로에서 절대경로로 변경 후 넣어줍니다.

반응형
반응형
  • 안드로이드 9.0 파이에서는 https를 사용 하며, 주소가 http인 경우 오류가 발생.
  • Android Manifest 파일에서 usesCleartextTraffic을 true로 설정
android:usesCleartextTraffic="true"

 

반응형
반응형

안녕하세요, 

신입으로 면접을 보러 다닐때 받았던 질문들을 정리해서 올려 드리려고 합니다.

 

참고로 저는 비전공 + 국비지원교육을 통해 취업준비를 한 케이스 입니다. 추후 국비지원교육에 대한 내용도 한번 다루어 보도록 하겠습니다.

 

차량관련(Android Auto) 안드로이드 개발 기업

  • ANI가 무엇인지 알고있는지?
  • AUTOSA 들어봤는지?
  • 비전공자이고 JAVA를 처음 접했는데, 어땠는지?
    • 객체지향 언어의 특징?
  • android 실행 절차?
  • 절차지향언어가 무엇인지?
  • 내학과는 어떤 학과이고, 학과에서 무엇을 배우는지?
  • QT플랫폼 들어봤는지?
  • JVM이 무엇이고 장 단점은?
  • 메소드 오버로딩, 오버라이딩에 대한 설명?

자사 서비스 개발 및 솔루션 기업

  • 비전공자인데 프로그래밍을 선택한 특별한 이유가 있는지?
  • 메소드 오버로딩, 오버라이딩이 무엇인지?
  • 회사가 어떠한 일을 하는지 알고있는지?
  •  B2C(Business to Customer)보다는 B2B(Business to Business) 를 담당하는 회사인데 알고있는지?
    • 그렇다면 이 회사에 들어와서 어떠한 일을 하게 될거같은지?
    • 이 회사에 들어와서 어떠한 개발자로 성장 하고 싶은지?
  • Retrofit2 라이브러리에 대한 설명?

자사 서비스 개발 기업

  • list, tuple, set 차이점?
  • ANR이 무엇이고, 경험해본적이 있는지?
  • 학과에서는 어떠한 것을 배우는지?
  • 프로그래밍 관련 과목은 이수를 했는지?
  • 학점관리는 어떻게 했는지?
  • 포트폴리오에 기재된 프로젝트중에 가장 의미있는 프로젝트가 무엇인지?
  • 영상처리관련 기술 관심이 있는지?
  • 안드로이드 라이프사이클 설명
  • 안드로이드 4대 컴포넌트?
    • service와 content provider를 사용해서 프로젝트를 진행한 것이 있는지?
  • 서버와의 통신은 무엇을 통해 구현을 하였는지?
    • 다른 라이브러리도 있지만, Retrofit2을 사용한 이유가 있는지?

 

TIP

기본적인 java, android 질문 외에  대부분 '비전공자'에 초점을 두어 학과에 대한 설명을 요구하였고, 왜 프로그래밍을 하게 되었는지에 대한 질문이 주를 이루었던 것 같습니다.

 

저는 학과와 프로그래밍을 접목시킬 수 있는 방향으로 설명을 하였고, 학과에서 했던 경험들을 풀어서 말씀 드렸습니다.

 

면접보러 가시는 기업이 현재 서비스 하고 있는 앱이 있다면, 면접 보러가기전에 설치해서 조금 봐두시는 것도 추천드립니다. 만약 어플 후기의 평점이 낮다면 그 이유에 대해서도 한번쯤 생각 해보시면 좋을 것 같습니다.

 

마지막으로 회사에 궁금한점, 할 말?

마지막으로 회사에 대해 궁금한 점이나 할말이 있냐는 질문을 받았을 경우 정말 궁금하신 부분을 물어보시면 될 것 같습니다. 만약 정말 물어볼 것이 없다면 다음 질문을 여쭤보시는것도 추천 드립니다.

 

 - 회사에 입사하게 되면, 실제로 하게 되는 일이 어떤 것인지?

 - 안드로이드 개발을 담당하는 인원은 몇 명이 있는지?

 - 중간급 관리자(사수) 가 있는지?

 

회사가 원하는 사람을 채용하는 것도 맞지만, 내가 회사에 입사하여 적응하고 배울점이 있는지도 중요하기 때문입니다. 

 

실제 규모는 조금 있다고 하더라도, 팀단위로 나뉘게 되면 실제 개발업무를 담당하는 인원이 적을수도 있습니다. 중간급 관리자가 없는 경우도 신입의 입장에서는 부담스럽기 때문에 궁금하신 부분은 면접때 여쭤보시면 좋을 것 같습니다. 

 

입사 후 면접을 보셨던 사수님께 들은 후기?

- 신입으로 채용을 하는 경우, 큰 기대를 하지않는다고 하셨습니다. 실제 입사 후에 같이 일을 해야하는 사람을 채용하는 과정이다보니 태도와 자세, 의지를 크게 본다고 하세요. 그 외에  자소서 및 포트폴리오에 기재한 내용은 반드시 숙지하고, 질문에 대한 대답이 떠오르지않아도 솔직하게 말씀드리고 설명에 대한 경청하는 자세를 보이시면 될 것 같습니다. 

반응형

+ Recent posts