반응형




OpenCV를 사용하여 손을 검출 및 인식하는 방법에 대해 다룹니다. 


현재 두가지 방법으로 코드가 작성되었습니다. 


Background Subtraction을 사용한 방법과 HSV 공간에서 살색을 검출한 방법입니다.  




다음 에러가 발생하는 경우 아래 포스트를 참고해보세요


The convex hull indices are not monotonous, which can be in the case when the input contour contains self-intersections in function 'cv::convexityDefects



[OpenCV / Python ] convexityDefects 함수에 convex hull indices are not monotonous ... self-intersections 에러 나는 경우 해결 방법

https://webnautes.tistory.com/1432




Background Subtraction를 사용한 경우 






HSV 색공간에서 살색을 검출한 경우






반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. thumbnail
    2019.10.25 22:34

    비밀댓글입니다

  2. thumbnail
    2019.11.03 17:36

    비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.11.03 17:58 신고

      안드로이드에서 OpenCV 카메라 예제를 다룬 다음 포스트를 수정하여 진행하면 될듯합니다.

      자바는 결과를 보여주는데 사용하고
      실제 구현은 CPP 코드에서 하면 됩니다.

  3. thumbnail
    꾸꾸루꾸
    2019.11.13 15:57

    안녕하세요 opencv 사용하여 카메라 mjpg스트리밍으로 얼굴 검출 하고있습니다..ㅠ
    이게 제 소스인데
    #카메라 구동되도록 해주는 명령어
    os.system("sudo modprobe bcm2835-v4l2")

    # 얼굴특징이 담겨져있는 xml 파일을 불러옴
    faceCascade = cv2.CascadeClassifier("/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml")

    #카메라를 가져옴
    video_capture = cv2.VideoCapture(-1)


    #카메라 설정
    video_capture.set(cv2.CAP_PROP_FPS,20)
    video_capture.set(cv2.CAP_PROP_FRAME_WIDTH ,320)
    video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT,240)


    while True: #무한반복


    #카메라의 한프레임을 읽어옴
    ret, frame = video_capture.read()

    rows,cols,_ = frame.shape#현재 프레임의 해상도를 가지고오고
    M = cv2.getRotationMatrix2D((cols/2,rows/2),180,1) #180 도 회전
    frame = cv2.warpAffine(frame,M,(cols,rows)) # 프레임에 저장


    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #흑백으로 만들어줌

    faces = faceCascade.detectMultiScale(#얼굴검출
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(20, 20),
    maxSize=(100, 100)
    )

    rows,cols,_ = frame.shape 부분에서
    AttributeError: 'NoneType' object has no attribute 'shape'
    이란 에러가 뜨네요.. 구글링 해서 몇페이지 다 번역해서 읽어봐도 다들 영상을 불러와서 쓰지 저처럼 스트리밍 해서
    하는 사례가 없더군요 ㅠ 혹시 도와주실수 있는지 해서 댓글 남겨봅니다!!
    비디오캡쳐는 0으로도 해보고 -1로도 해봤습니다!

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.11.13 21:26 신고

      스트리밍이면 주소로 해야 하지 않나요?

      아래 링크를 참고하세요

      mjpg-streamer를 사용한 웹 스트리밍을 OpenCV에서 가져오기
      https://webnautes.tistory.com/1262

    • thumbnail
      꾸꾸루꾸
      2019.11.14 10:39

      안녕하세요! 댓글 답변 정말 감사합니다!! 하나만 더 여쭤보겠습니다 ㅠㅠ
      말씀하신대로 스트리밍 주소를 비디오 캡쳐에 넣어서 하니 에러없이 스트리밍이 되는데
      전엔 VideoCapture(0)으로도 소스가 잘 돌아갔었는데 한번 뻑난 이후로 설치환경을 다른버전들을 설치해서그런지 안돌아가기 시작했던거거든요..
      제가 하고있는것이 팬/틸트 키트(서보모터2개 x축,y축) 에 파이카메라를 부착하여 파이카메라가 사람 얼굴을 인식하면
      사각형을 그리며 프레임이 한쪽으로 치우치면 서보모터 작동하여 얼굴을 따라가게 되는데 우선적으로 얼굴인식을 하면 초록 사각형을 그리고 가장 큰 얼굴에 파란 사각형을 계속 화면에 띄워졌었는데
      VideoCapture(웹스트리밍주소)로 바꾸고선 cv2.rectangle 사용해도 사각형이 웹스트리밍 화면에 그려지질 않네요 ㅠㅠ 혹시 mjpg 웹스트리밍 화면에 사각형을 그릴 수 있는 방법 혹시 아시나요..?!

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.11.14 21:08 신고

      rectangle로 사각형을 그린 후에 imshow 함수를 호출해야 화면에 사각형이 보입니다.

    • thumbnail
      꾸꾸루꾸
      2019.11.14 21:25

      imshow 함수를 호출하면 웹 스트리밍 창이 아닌 새로운 창이 뜨면서
      사각형이 그려지긴 하나 렉이 엄청 심합니다 ㅠ 그리고 뒤집혀서 나오기도하구요..
      아이피주소:8080/?action=stream.html
      mjpg 게시글 보며 스트리밍 옵션을 넣어주어 들어가서 보면 상하반전에 프레임도 괜찮게 나와서 딜레이도 없는것같은데...

      이런 매끄러운 화면에서 제가 원하는 화면을 띄우는건 욕심일까요..?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.11.14 22:12 신고

      웹스트리밍창도 OpenCV로 만든 창 아닌가요?

    • thumbnail
      꾸꾸루꾸
      2019.11.15 12:37

      자꾸 귀찮게 해드려서 죄송합니다 ㅠ
      export STREAMER_PATH=$HOME/mjpg/mjpg-streamer/mjpg-streamer-experimental

      export LD_LIBRARY_PATH=$STREAMER_PATH

      $STREAMER_PATH/mjpg_streamer -i "input_raspicam.so -vf -d 200 -fps 20" -o "output-http.so -p 8080 -w $STREAMER_PATH/www"

      란 내용의 mjpg.sh 파일을 만들고
      sh mjpg.sh 를 한 콘솔창에 실행한 뒤

      또 다른 콘솔창에서 python face.py 를 실행하고있습니다.

      저도 여러곳에서 구글링해서 이것저것 추가해서 해봤던거라 라즈베리파이가 고장나기 전엔 videocapture(0)도 됐었고 이렇게 두개 창으로 했을 때 인터넷 열어서 주소창 들어갔을 때 스트리밍 화면에 사각형도 그려졌었거든요..ㅠㅠ

      하나하나 댓글 달아주심에 감사합니다..

    • thumbnail
      2019.11.15 15:54

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.11.16 18:01 신고

      imshow 호출전에 이미지에 사각형을 그려주도록 하면됩니다.

    • thumbnail
      꾸꾸루꾸
      2019.11.17 17:33

      몇일간 도움 감사했습니다!! 어느정도 여러가지 손보며 해결한듯 합니다 ㅎㅎ

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.11.17 19:19 신고

      축하드려요..

  4. thumbnail
    초보자
    2019.12.30 12:32

    HSV 예제를 따라서 진행을 했는데

    cascade = cv.CascadeClassifier(cv.samples.findFile(current_file_path + "\haarcascade_frontalface_alt.xml"))

    이부분에서 다음과 같은 에러메시지가 출력되었는데요
    cascade = cv.CascadeClassifier(cv.samples.findFile(current_file_path + "\haarcascade_frontalface_alt.xml"))
    AttributeError: module 'cv2' has no attribute 'samples'
    이때에는 어떻게 해야되는지 검색을 해봐도 파일명을 바꾸면 된다고 만 나와서 이렇게 글을 남겨봅니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.12.30 13:36 신고

      cv.samples.findFile을 제거하고 해보세요

    • thumbnail
      초보자
      2019.12.30 16:02

      cascade = cv.CascadeClassifier(current_file_path + "\haarcascade_frontalface_alt.xml")
      or
      cascade = cv.CascadeClassifier()
      이렇게 두가지 방식으로 했는데
      GStreamer-CRITICAL **: 15:52:02.185: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed

      VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV

      Unable to stop the stream: Device or resource busy

      VIDEOIO ERROR: V4L: can't open camera by index 0
      이러한 에러 문구가 출력되었습니다
      말씀하신 방법을 맞게 했는지 문의 드립니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.12.30 16:09 신고

      첫번째가 맞는 방법입니다. 에러는 카메라를 열수 없다는 에러입니다. 카메라를 확인해보세요

    • thumbnail
      초보자
      2019.12.30 16:12

      pi카메라를 사용중인데 어떻게 확인하면 되나요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.12.30 16:17 신고

      다음.포스트를 참고하세요

      https://webnautes.tistory.com/1192

    • thumbnail
      초보자
      2019.12.30 17:11

      포스트를 참고하여 raspistill -o image.jpg 까지 진행 하였고 이미지까지 확인하였습니다만 dmesg 에선
      brcmfmac : brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
      brcmfmac : brcmf_link_down : WLC_DISASSOC failed(-52)
      이렇게 출력되었는데 연결 문제인가요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.12.30 18:38 신고

      포스트에서 확인하는 값이 둘다 1로 보이나요?

    • thumbnail
      초보자
      2019.12.31 12:41

      네 둘다 1로 출력됩니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.12.31 20:10 신고

      0대신 -1을 사용해보셨나요?

    • thumbnail
      초보자
      2020.01.02 10:31

      cap = cv.VideoCapture(0) 이부분을 -1로 변경하고 실행을 했더니
      Traceback (most recent call last):
      File "/home/pi/test.py", line 248, in <module>
      img_result = process(img_bgr, debug=False)
      File "/home/pi/test.py", line 190, in process
      img_bgr = removeFaceAra(img_bgr, cascade)
      File "/home/pi/test.py", line 19, in removeFaceAra
      rects = detect(gray, cascade)
      File "/home/pi/test.py", line 9, in detect
      flags=cv.CASCADE_SCALE_IMAGE)
      cv2.error: OpenCV(4.1.2) /home/pi/opencv/opencv-4.1.2/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
      에러 문구가 출력 되었습니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.01.03 09:41 신고

      XML 파일 위치를 못찾는 듯합니다. xml 파일을 파이썬 코드 있는 곳으로 복사해왔는지요?

      그리고 혹시 웹캠이 잘동작하는지 다음 코드에서 0 을 -1로 바꾸어서 테스트해보세요.
      https://webnautes.tistory.com/577

    • thumbnail
      초보자
      2020.01.03 14:57

      xml 파일을 파이썬 코드 있는 곳으로 복사해서 실행을 해보았는데 동일한 에러가 발생했습니다
      그리고 알려주신 주소에 있는 예제로 테스트 진행을 했는데 pi카메라는 잘 동작하엿습니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.01.03 20:59 신고

      xml 파일을 못찾는 듯합니다..

      아래 링크의 예제로 테스트해보세요.
      https://webnautes.tistory.com/1352

  5. thumbnail
    초보영상처리
    2020.01.30 20:10

    안녕하세요 손가락 검출을 이용한 프로젝트를 진행중인 학생입니다.
    손끝을 검출하고 그 좌표를 이용하여 그림판에 그림을 그리는 것처럼 프로그램을 구현하고자 하는데
    가끔가다가 ret, points = getFingerPosition(findMaxArea(contours)[1],frame,True) 이 코드 부분에서 'NoneType' object is not iterable 이러한 오류가 발생합니다.
    아마 이미지 컨투어가 제대로 이루어지는 환경에 좌우되는 것 같기는 한데... 혹시 해결할수있는 방법을 여쭤보고 싶어서 댓글달았습니다.

    구글링해본 결과 반환되는 points가 None일 경우를 대비하여 예외문을 만들었는데도 같은 경우의 에러가 발생합니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.01.30 20:19 신고

      잘하셨네요. 아직 덜 해결된듯합니다. 에러나는 부분을 찾아 None인 경우 예외처리해보세요.

  6. thumbnail
    오픈씨비초보
    2020.02.19 12:16

    저는 동영상 시작 전 드래그를 통해 드래그 한 물체만 트래킹 하는 프로그램을 만들고 있습니다.
    혹시 배경을 대부분 검은 색으로 바꾸고 바꾼 비디오를 가지고 트래킹을 할 수 있는 방법이 있을까요?

  7. thumbnail
    마루카롱
    2020.03.04 16:48

    안녕하세요. PYTHON을 공부하는 초보 학생입니다.
    다름이 아니라 CNN을 통해서 이미지 분류를 하고자 하는데
    1.이미지가 여러개 있는데 이미지 파일명이 숫자로 표기가 되어 라벨링이 되어 있지 않은 상황입니다.
    2.이런 경우 어떻게 하면 이미지를 불러와 비슷한 유형의 이미지들 끼리 분류를 하여 라벨링을 해줄 수 있는 방법이 있는지 궁금하여 댓글을 남깁니다.
    감사합니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.03.04 17:06 신고

      이미지를 분류하여 폴더에 넣으면 될듯합니다. 폴더 이름으로 이미지에 레이블을 붙여주는 거지요.

      이미지의 경로에 폴더이름이 포함되도록하여 이미지 불러오는 것과 레이블 작업을 같이하세요

    • thumbnail
      마루카롱
      2020.03.05 10:25

      답변 감사합니다.
      수작업으로 하는 방법밖에 없을까요?ㅜ
      이미지가 몇천개가 되어서...일일히 하기가 어려워서 혹시나 python으로 하는 방법이 없을까요..

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.03.05 11:11 신고

      이미지에서 특징을 추출할수 있다면 자동으로 레이블을 추가할 수 있습니다. 그렇지 않으면 수작업으로 할수밖에 없습니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.03.05 11:12 신고

      수작업으로 할경우 파일이름을 하나씩 바꾸는 것보단 폴더이름으로 구분하는 편이 좋을듯합니다.

  8. thumbnail
    Favicon of https://ideabot.tistory.com BlogIcon ideabot

    안녕하세요 꾸준하게 유익한 자료들을 업로드해주셔서 감사합니다.
    저는 블로그와 유튜브를 보며 조금씩 조금씩 공부를 해나아가고 있는 직장인으로 현재는 로봇설계 업무를 담당하고 있으나, 이번에 직장을 관두고 창업을 해보려고 합니다. 눈팅만 하다가 webnautes 님께 몇가지 조언을 구하고 질문을 드리고 싶은 부분이 있어서 이렇게 댓글을 달게 되었습니다. 혹시 가능하시면 메일 한통 부탁드리겠습니다. 제 이메일은 isochoricv@gmail.com 입니다. 책도 잘 보고있습니다. 좋은책을 출판해주셔서 감사드립니다.

  9. thumbnail
    2020.05.07 15:17

    비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.05.07 21:13 신고

      컨투어 사용방법이 OpenCV 버전에 따라 다음처럼 달라집니다.

      OpenCV 4.x

      contours, hierarchy = cv.findContours(img_binary, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)



      OpenCV 3.x

      _, contours, hierarchy = cv.findContours(img_binary, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)

    • thumbnail
      2020.05.08 14:19

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.05.08 18:58 신고

      1. step1 ~3이 주석처리되어 있네요 . 주석을 없애보세요.

      2. 컨투어외에는 별 차이 없는듯합니다.

    • thumbnail
      2020.05.10 14:49

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.05.10 17:05 신고

      img_binary관련 얘기한부분에 주석이 안되어 있네요. 그런데도 img_binary가 정의되어 있지 않다고 에러나나요?

    • thumbnail
      2020.05.11 16:06

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.05.11 21:09 신고

      다음 줄에 있는 주석들을 제거하세요.

      # # STEP 1
      # img_bgr = removeFaceAra(img_bgr, cascade)


      # # STEP 2
      # img_binary = make_mask_image(img_bgr)


      # # STEP 3
      # kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
      # img_binary = cv.morphologyEx(img_binary, cv.MORPH_CLOSE, kernel, 1)
      # if debug:
      # cv.imshow("Binary", img_binary)



      다음 에러는 hand.avi 파일을 찾을 수 없다는 에러입니다.
      파이썬 코드와 같은 디렉토리에 해당 파일이 있어야 합니다.
      (DEBUG) try_init_v4l2 open "hand.avi": No such file or directory

  10. thumbnail
    전기4학년
    2020.05.14 17:07

    안녕하세요! 이 글과는 다른 방향으로 프로젝트를 진행 중인 대학생입니다.

    제가 하고 싶은 것은 MOG2를 이용하여 배경을 제거하고 움직이는 물체를 검출하려는 것입니다!

    MOG2로 배경을 제거하니 움직이는 물체가 하얗게 표시가 되는데

    그 이후에 어떤식으로 물체를 감지해야 할지 감을 잡기가 어려운데, 혹시 조언해주실 수 있을까요.

    contour를 이용해보려 했으나 실패했습니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.05.14 23:12 신고

      포스트에 나온대로 컨투어를 사용하거나 또는 라벨링을 사용할 수도 있습니다.

  11. thumbnail
    구름
    2020.08.21 23:12

    안녕하세요! 덕분에 보고 열심히 공부하고 있습니다. 제가 지금 얼굴인식과 손 인식이 같이 되었을 때 도어락을 제어하려고 하는데
    얼굴인식시 도어락 제어.py와 손 인식(주먹을쥐면)시 도어락제어.py 이 각자의 코드를 사용했을 때는 도어락 제어가 잘 됩니다.

    합치려고 하는데
    for(x,y,w,h) in faces:
    for(x, y, w, h) in hands:
    cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
    id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
    if (confidence < 100) and (len(contour)==1):
    id = names[id]
    confidence = " {0}%".format(round(100 - confidence))
    GPIO.output(4, False)
    time.sleep(0.5)
    GPIO.output(pin,0)
    else:
    id = "unknown"
    confidence = " {0}%".format(round(100 - confidence))
    GPIO.output(pin,1)
    GPIO.output(4, True)
    time.sleep(0.5)
    GPIO.output(4, False)
    count+=1

    cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
    cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)

    cv2.putText(img, text='door is open', org=(int(100 / 2 - 20), int(100 / 2)),
    fontFace=cv2.FONT_HERSHEY_DUPLEX, fontScale=1,
    color=(0, 255, 0))

    cv2.imshow('camera',img)
    이런식으로 해서 imshow라고 하니 작동은 하지만 frame이 뜨지 않는 현상이 발견되더라고요.. 어떤 문제인지 혹시 아실까요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.08.22 06:31 신고

      얼굴인식 for문과 손인식 for문이 중첩되어 있는데 각각 따로 돌려야 하지 않을까 샆습니다

  12. thumbnail
    JaeH
    2020.10.01 01:45

    C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-j8nxabm_\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): hand.avi in function 'cv::icvExtractPattern'

    주피터 프롬프트에 위와 같이 뜨며 따로 뜨는 화면이 없습니다 왜이럴까요??