Opencv 손가락 인식 | 가위바위보 기계 만들기 – 손가락 인식 인공지능 24 개의 정답

당신은 주제를 찾고 있습니까 “opencv 손가락 인식 – 가위바위보 기계 만들기 – 손가락 인식 인공지능“? 다음 카테고리의 웹사이트 https://ppa.khunganhtreotuong.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.khunganhtreotuong.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 빵형의 개발도상국 이(가) 작성한 기사에는 조회수 49,145회 및 좋아요 616개 개의 좋아요가 있습니다.

opencv 손가락 인식 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 가위바위보 기계 만들기 – 손가락 인식 인공지능 – opencv 손가락 인식 주제에 대한 세부정보를 참조하세요

* 세상에서 가장 쉽게 모터를 움직이는 방법 DynamiKontrol
https://dk.m47rix.com
* 빵형처럼 되고 싶은 국민들을 위한 머신러닝 기초 강의
http://bit.ly/mlbasic
MediaPipe 손 모델을 사용해서 가위바위보 기계를 만들어봅시다!
Source code(Github):
https://github.com/kairess/Rock-Paper-Scissors-Machine
Dependency:
– Python 3
– OpenCV
– MediaPipe
Chapters:
00:00 Intro
00:45 원리 설명
02:00 코드 설명 (한손)
09:08 코드 설명 (양손)
10:20 데모
10:41 Outro
Reference:
– https://github.com/ntu-rris/google-mediapipe
– https://google.github.io/mediapipe/solutions/hands.html#hand-landmark-model
사업 및 개발문의: [email protected]
빵형의 개발도상국 후원: https://toon.at/donate/helloworld

opencv 손가락 인식 주제에 대한 자세한 내용은 여기를 참조하세요.

OpenPose를 사용하여 손가락 인식하는 OpenCV 예제

OpenPose를 사용하여 손가락 인식하는 OpenCV 예제. webnautes 2021. 2. 2. 23:45. 반응형. 오픈포즈(OpenPose)를 사용하여 손가락을 인식하는 코드를 살펴봅니다.

+ 여기에 자세히 보기

Source: webnautes.tistory.com

Date Published: 9/2/2022

View: 8051

수화 인식 Project – [3일차] 손 인식하기(openCV) – IT 탐험기

수화 인식 Project – [3일차] 손 인식하기(openCV) · cv2.CHAIN_APPROX_NONE: 모든 컨투어 포인트를 반환 · cv2.CHAIN_APPROX_SIMPLE: 컨투어 라인을 그릴 …

+ 자세한 내용은 여기를 클릭하십시오

Source: 88-it.tistory.com

Date Published: 4/11/2021

View: 1522

손가락 인식 볼륨 조절기 만들기 | opencv 손가락 인식 새로운 …

저자별 기사 빵형의 개발도상국 가지고 조회수 5,421회 그리고 의지 좋아요 122개 높은 평가. 이에 대한 추가 정보 opencv 손가락 인식 주제에 대해서는 …

+ 자세한 내용은 여기를 클릭하십시오

Source: ko.maxfit.vn

Date Published: 7/25/2022

View: 530

openCV를 이용하여 손인식 – 기록은 기억을 지배한다

손 인식을 하기 위해 YCrCb라는 색공간을 이용한다. Cr:133~173 Cb:77~127 이 일반적인 살색 이라고 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 …

+ 여기를 클릭

Source: minimin2.tistory.com

Date Published: 5/6/2021

View: 6744

[OpenCV] HSV를 이용한 손 검출, 손가락 개수 세기

opencv, 파이썬, python, 손인식, 손검출, hsv, 손가락 개수, 손가락 인식, 손가락 개수 세기, 캠인식.

+ 여기를 클릭

Source: jkl1643.blogspot.com

Date Published: 4/21/2021

View: 1140

Mediapipe를 이용한 제스쳐인식 – DevAlice

공식홈페이지에 들어간뒤 설치를 하고 Solution카테고리에 Hand로 들어가서 openCV를 이용해 웹캡의 캡쳐 텍스쳐를 가져와 손을 인식하고, 손을 …

+ 더 읽기

Source: developeralice.tistory.com

Date Published: 3/16/2021

View: 6794

주제와 관련된 이미지 opencv 손가락 인식

주제와 관련된 더 많은 사진을 참조하십시오 가위바위보 기계 만들기 – 손가락 인식 인공지능. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

가위바위보 기계 만들기 - 손가락 인식 인공지능
가위바위보 기계 만들기 – 손가락 인식 인공지능

주제에 대한 기사 평가 opencv 손가락 인식

  • Author: 빵형의 개발도상국
  • Views: 조회수 49,145회
  • Likes: 좋아요 616개
  • Date Published: 2021. 5. 20.
  • Video Url link: https://www.youtube.com/watch?v=udeQhZHx-00

수화 인식 Project – [3일차] 손 인식하기(openCV)

반응형

1, 2일차는 openCV에 대해 공부 및 따로 게시글을 작성하지 않았습니다.

import cv2 import numpy as np def cont(): try: cap=cv2.VideoCapture(0) except: print(‘camera_errro’) return while True: ret, frame = cap.read() if not ret: print(‘camera2_error’) break dst = frame.copy() test = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb) mask_hand = cv2.inRange(test, np.array([0,133,77]),np.array([255,173,127])) #test = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ret, thr = cv2.threshold(mask_hand, 127, 255, cv2.THRESH_BINARY_INV) _, contours, hierachy=cv2.findContours(thr, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) for i in contours: hull = cv2.convexHull(i,clockwise=True) cv2.drawContours(dst, [hull], 0, (0,0,255),2) cv2.imshow(‘dst’, dst) cv2.imshow(‘mask_hand’, mask_hand) k = cv2.waitKey(1) & 0xFF if k == 27: break cap.release() cv2.destroyAllWindows() cont()

try ~ break 까지 비디오를 통해서 영상 가져오고 오류 검사

test = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb) 에서는 해당 비디오를 BGR색상을 YCrCb 변환

mask_hand = cv2.inRange(test, np.array([0,133,77]),np.array([255,173,127])) 에서는 inRange로 ycrcb의 이미지를 해당 범위에 속하는 픽셀들만 masking한다. 즉 살색만 흰색을 만들고 그 나머지는 검은색으로 변환

ret, thr = cv2.threshold(mask_hand, 127, 255, cv2.THRESH_BINARY_INV) 관련 설명은 밑 사이트 참고

https://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html

thr에 사진에 대한 정보가 들어가 있다. cv2.imshow(‘thr’, thr)를 하면 확인 가능하다.

하지만 ret, thr = cv2.threshold(mask_hand, 127, 255, cv2.THRESH_BINARY_INV) 를 빼고 적용시켜 본 결과 딱히 큰 차이 없는 듯 이 부분은 없어도 되는 거 같다.

_, contours, hierachy=cv2.findContours(mask_hand, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) 에서 원래는

images, contours, hierachy = cv2.findContours(image, mode, method)

image: 흑백이미지 또는 이진화된 이미지

mode : 컨투어를 찾는 방법 cv2.RETR_EXTERNAL: 컨투어 라인 중 가장 바깥쪽의 라인만 찾음 cv2.RETR_LIST: 모든 컨투어 라인을 찾지만, 상하구조(hierachy)관계를 구성하지 않음 cv2.RETR_CCOMP: 모든 컨투어 라인을 찾고, 상하구조는 2 단계로 구성함 cv2.RETR_TREE: 모든 컨투어 라인을 찾고, 모든 상하구조를 구성함

method : 컨투어를 찾을 때 사용하는 근사화 방법 cv2.CHAIN_APPROX_NONE: 모든 컨투어 포인트를 반환 cv2.CHAIN_APPROX_SIMPLE: 컨투어 라인을 그릴 수 있는 포인트만 반환 cv2.CHAIN_APPROX_TC89_L1: Teh_Chin 연결 근사 알고리즘 L1 버전을 적용하여 컨투어 포인트를 줄임 cv2.CHAIN_APPROX_TC89_KCOS: Teh_Chin 연결 근사 알고리즘 KCOS 버전을 적용하여 컨투어 포인트를 줄임

컨투어 정보는 컨투어를 구성하는 점들로 이루어진 배열의 리스트다.

출처 : https://datascienceschool.net/view-notebook/f9f8983941254a34bf0fee42c66c5539/

hull = cv2.convexHull(i,clockwise=True) 는 cv2.convexHull()를 활용해 윤곽선에서 블록 껍질을 검출합니다.

cv2.convexHull(윤곽선, 방향)을 의미합니다.

윤곽선은 윤곽선 검출 함수에서 반환되는 구조를 사용합니다.

방향은 검출된 볼록 껍질의 볼록점들의 인덱스 순서를 의미합니다.

블록 껍질 함수는 단일 형태에서만 검출이 가능합니다.

그러므로, 반복문을 활용해 단일 형태의 윤곽선 구조에서 블록 껍질을 검출합니다.

Tip : 윤곽선 구조는 윤곽선 검출 함수의 반환값과 형태가 동일하다면, 임의의 배열에서도 검출이 가능합니다.

Tip : 방향이 True라면 시계 방향, False라면 반시계 방향으로 정렬됩니다.

convexHull에 대한 알고리즘 참고 사이트 : https://hns17.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-ConvexHull-Grahams-Scan

https://www.crocus.co.kr/1288

만약 convexHull을 안 썼을 때 위 코드에서 일부를 밑처럼 수정

_, contours, hierachy=cv2.findContours(mask_hand, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) for i in contours: #hull = cv2.convexHull(i,clockwise=True) cv2.drawContours(dst, [i], 0, (0,0,255),2) cv2.imshow(‘dst’, dst) cv2.imshow(‘mask_hand’, mask_hand)

해당 결과 : 라인이 다 그려짐

외곽선과 convexhull의 선이 겹치는 지점이 손가락 끝점이라 보고 찾을 수 있는데 아래 시도해본 코드

points1 = [] for i in contours: M = cv2.moments(i, False) try: cx = int(M[‘m10’]/M[‘m00’]) cy = int(M[‘m01’]/M[‘m00’]) except ZeroDivisionError: print(“ZeroDivision”) contours = cv2.approxPolyDP(contours,0.02*cv2.arcLength(contours,True),True) hull = cv2.convexHull(contours[0]) for point in hull: if cy > point[0][1]: points1.append(tuple(point[0])) cv2.drawContours(mask_hand, [hull], 0, (0,255,0), 2) for point in points1: cv.circle(mask_hand, tuple(point), 15, [ 0, 0, 0], -1)

손가락 끝 점 출력 코드라고 하는데 오류가 ZeroDivisionError 가 계속 난다. 실시간 동영상인 것이 아마 원인이지 않을까 싶다.

_, contours, hierachy=cv2.findContours(mask_hand, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) points1 = [] result_cx = [] result_cy = [] for i in contours: M = cv2.moments(i) if M[“m00”] != 0: cx = int(M[“m10”] / M[“m00”]) cy = int(M[“m01”] / M[“m00”]) else: # set values as what you need in the situation cX, cY = 0, 0 for cnt in contours: approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True) #cv2.drawContours(dst, [approx], 0, (0,255,0), 3) hull = cv2.convexHull(approx) for point in hull: if cy > point[0][1]: points1.append(tuple(point[0])) cv2.drawContours(dst, [hull], 0, (0,0,255),2) for point in points1: cv2.circle(dst, tuple(point), 15, [255, 0, 0], -1) cv2.imshow(‘dst’, dst)

코드 오류 안 나게 수정한 부분…

그럼에도 원이 표시되지만 이상하게 뜨네요. 아마 원인은 손만 나와야하는데 주변에 잡인식이 많아서 그런 것 같네요. 다음에는 일단 배경 정리부터 다시 해야할 듯 하네요.

밑에는 풀코드.. 주석처리도 많고 더럽네요 나중에 오류 해결하면 코드 정리해야겠어요ㅠ

import cv2 import numpy as np def cont(): try: cap=cv2.VideoCapture(0) except: print(‘camera_errro’) return while True: ret, frame = cap.read() if not ret: print(‘camera2_error’) break dst = frame.copy() #cv2.imshow(‘frame’, frame) #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #gray = cv2.equalizeHist(gray) #rects = detect(gray, debug=False) #height,width = frame.shape[:2] #for x1, y1, x2, y2 in rects: # cv.rectangle(frame, (x1-10, 0), (x2+10, height), (0,0,0), -1) #cv2.imshow(‘frame1’, frame1) test = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb) mask_hand = cv2.inRange(test, np.array([0,133,77]),np.array([255,173,127])) #cv2.imshow(‘mask_hand’, mask_hand) #test = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #ret, thr = cv2.threshold(mask_hand, 127, 255, cv2.THRESH_BINARY_INV) #cv2.imshow(‘thr’, thr) _, contours, hierachy=cv2.findContours(mask_hand, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) points1 = [] result_cx = [] result_cy = [] for i in contours: M = cv2.moments(i) if M[“m00”] != 0: cx = int(M[“m10”] / M[“m00”]) cy = int(M[“m01”] / M[“m00”]) else: # set values as what you need in the situation cX, cY = 0, 0 for cnt in contours: approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True) #cv2.drawContours(dst, [approx], 0, (0,255,0), 3) hull = cv2.convexHull(approx) for point in hull: if cy > point[0][1]: points1.append(tuple(point[0])) cv2.drawContours(dst, [hull], 0, (0,0,255),2) for point in points1: cv2.circle(dst, tuple(point), 15, [255, 0, 0], -1) cv2.imshow(‘dst’, dst) k = cv2.waitKey(1) & 0xFF if k == 27: break cap.release() cv2.destroyAllWindows() cont()

그 밖에 참고 사이트 : https://webnautes.tistory.com/1378

https://076923.github.io/posts/Python-opencv-25/

https://m.blog.naver.com/PostView.nhn?blogId=jinhuk1313&logNo=220618953390&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://ngost.tistory.com/category/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%81%EC%83%81%EC%B2%98%EB%A6%AC?page=2

https://m.blog.naver.com/pckbj123/100203325426

나중에 참고할 사이트 : https://dbpia.co.kr/journal/articleDetail?nodeId=NODE02367971#none

https://m.blog.naver.com/PostView.nhn?blogId=samsjang&logNo=220516822775&proxyReferer=https%3A%2F%2Fwww.google.com%2F

반응형

손가락 인식 볼륨 조절기 만들기 | opencv 손가락 인식 새로운 업데이트

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

openCV를 이용하여 손인식

손 인식을 하기 위해 YCrCb라는 색공간을 이용한다.

Cr:133~173

Cb:77~127

이 일반적인 살색 이라고 한다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import cv2 import numpy as np img = cv2.imread( ‘./hand_sample.jpg’ ) #YCrCb 변환 ycrcb = cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb) #Cr:133~173, Cb:77~127 mask_hand = cv2.inRange(ycrcb,np.array([ 0 , 133 , 77 ]),np.array([ 255 , 173 , 127 ])) cv2.imshow( “Hands” ,mask_hand) cv2.imshow( “Origin” ,img) cap.release() cv2.destroyAllWindows() Colored by Color Scripter cs

위와같이 cvtColor를 이용해 BGR색상을 YCrCb 색상으로 바꿔주고,

inRange로 ycrcb의 이미지를 해당 범위에 속하는 픽셀들만 masking한다.

코드 짠거 올리기: [OpenCV] HSV를 이용한 손 검출, 손가락 개수 세기

#기말 프로젝트 12월 7일 import cv2 import numpy as np import time count = 0 avg_time = 0 #카메라 안에 손이 들어가있어야 작동이 되게 했습니다 #손과 비슷한색깔이 손보다 크면 검출이 잘 안됩니다 cap = cv2 . VideoCapture( 0 ) if cap . isOpened(): while True: ret, img = cap . read() if ret: laptime = time . time() hsv = cv2 . cvtColor(img, cv2 . COLOR_BGR2HSV) hue = np . array([ 0 , 48 , 80 ]) hue2 = np . array([ 20 , 255 , 255 ]) #손 색깔 hand = cv2 . inRange(hsv, hue, hue2) #손의 컨투어를 잘 잡기위한 작업들 hand = cv2 . GaussianBlur(hand, ( 3 , 3 ), 0 ) k = cv2 . getStructuringElement(cv2 . MORPH_RECT, ( 3 , 3 )) hand = cv2 . morphologyEx(hand, cv2 . MORPH_CLOSE, k) hand = cv2 . erode(hand, k) #손가락을 없애서 손바닥만남긴후 손바닥의 중심좌표를 구하기위함 k = cv2 . getStructuringElement(cv2 . MORPH_RECT, ( 27 , 27 )) fingerless = cv2 . erode(hand, k) #cv2.imshow(“fingerless”, fingerless) #손가락없는 손 출력 #cv2.imshow(“hand”, hand) #손 출력 #그레이스케일 모델을 이진화로 바꿔줌 ret, thresh_cv = cv2 . threshold(hand, 254 , 255 , cv2 . THRESH_BINARY) ret, thresh_cv2 = cv2 . threshold(fingerless, 254 , 255 , cv2 . THRESH_BINARY) hand = thresh_cv fingerless = thresh_cv2 #손의 컨투어 handcontours, hierachy = cv2 . findContours(hand, cv2 . RETR_EXTERNAL, cv2 . CHAIN_APPROX_NONE) handcontrarray = np . array(handcontours) #손가락없는 컨투어 fingerlesscontours, hierachy = cv2 . findContours(fingerless, cv2 . RETR_EXTERNAL, cv2 . CHAIN_APPROX_NONE) fingerlesscontrarray = np . array(fingerlesscontours) #손의 컨투어중에 제일 길이간 긴 컨투어를 찾아줌 handmax = 0 for i in range(len(handcontrarray)): if len(handcontrarray[i]) >= len(handcontrarray[handmax]): handmax = i #손가락없는 컨투어중에 제일 길이간 긴 컨투어를 찾아줌 fingerlessmax = 0 for i in range(len(fingerlesscontrarray)): if len(fingerlesscontrarray[i]) >= len(fingerlesscontrarray[fingerlessmax]): fingerlessmax = i #—————————————– if fingerlesscontours != []: fx = fingerlesscontours[fingerlessmax][:,:, 0 ] #손가락없는컨투어의 x좌표 fy = fingerlesscontours[fingerlessmax][:,:, 1 ] #손가락없는컨투어의 y좌표 avgx = np . mean(fx) #컨투어의 평균 좌표값 avgy = np . mean(fy) #——————————————————— #손 컨투어의 x좌표중 최대값, 최소값을 구함 x_min, x_max = 0 , 0 value = list() for j in range(len(handcontours[handmax])): value . append(handcontours[handmax][j][ 0 ][ 0 ]) x_min = np . min(value) – 5 x_max = np . max(value) + 5 #손 컨투어의 y좌표중 최대값, 최소값을 구함 y_min, y_max = 0 , 0 value = list() for j in range(len(handcontours[handmax])): value . append(handcontours[handmax][j][ 0 ][ 1 ]) y_min = np . min(value) – 5 y_max = np . max(value) + 5 x = x_min y = y_min w = x_max – x_min h = y_max – y_min #손 컨투어의 크기만큼 손roi를 만듬 handroi = thresh_cv[y:y + h, x:x + w] #기존 캠 크기만큼의 검정색픽셀들로 이루어진 배경생성 background = np . zeros_like(fingerless) try : #손roi를 검정배경에 삽입, 삽입시 창 크기를 벗어나면 오류남 background[int(avgy – h / 2 ):int(avgy + h / 2 ), int(avgx – w / 2 ):int(avgx + w / 2 )] = handroi except ValueError : print ( “roi범위 벗어남” ) #삽입이 안될때 #cv2.imshow(“handroi”, handroi) #손roi를 검정배경에 삽입했을 때 출력 #———————————– #손가락없는 컨투어의 x좌표중 최대값, 최소값을 구함 x_min, x_max = 0 , 0 value = list() for j in range(len(fingerlesscontours[fingerlessmax])): value . append(fingerlesscontours[fingerlessmax][j][ 0 ][ 0 ]) #네번째 괄호가 0일 때 x의 값 x_min = np . min(value) x_max = np . max(value) #손가락없는 컨투어의 y좌표중 최대값, 최소값을 구함 y_min, y_max = 0 , 0 value = list() for j in range(len(fingerlesscontours[fingerlessmax])): value . append(fingerlesscontours[fingerlessmax][j][ 0 ][ 1 ]) #네번째 괄호가 0일 때 x의 값 y_min = np . min(value) y_max = np . max(value) x2 = x_min y2 = y_min w2 = x_max – x_min h2 = y_max – y_min #손가락없는 컨투어의 크기만큼 손roi를 만듬 #fingerlessroi = thresh_cv2[y2:y2+h2, x2:x2+w2] #cv2.imshow(“fingerlessroi”, fingerlessroi)#손가락없는roi를 검정배경에 삽입했을 때 출력 #——————————————————————— #손가락셀 때의 원의 반지름을 구할 때, 주먹을쥐었을 때도 원의 반지름이 주먹크기에 맞게 줄어들어서 #손가락으로 인식하게되는 문제가 있음 #그래서 주먹을 쥐었을때 원의 반지름을 크게해 손가락으로 인식하지 않게함 #손roi의 너비보다 높이가 더 클 때 손가락을 세어줄 원의 반지름 계산 if h > w: #손roi와 손가락없는roi의 높이를 비교해 차이가 많이나지 않을때 if abs(h2 / h) <= 0.7 : r = h * 0.37 #주먹을 쥐었을때 손roi와 손가락없는roi의 높이값이 비슷함 else : r = h #손roi의 높이보다 너비가 더 클 때 손가락을 세어줄 원의 반지름 계산 elif h < w: #손roi와 손가락없는roi의 너비를 비교해 차이가 많이나지 않을때 if abs(w2 / w) <= 0.7 : r = w * 0.37 #주먹을 쥐었을때 손roi와 손가락없는roi의 너비값이 비슷함 else : r = w #------------------------------------------------------------------------- #cv2.drawContours(img, fingerlesscontours[fingerlessmax], -1, (0,255,0), 3) #손가락없는 컨투어 그림 #cv2.circle(img, (int(avgx), int(avgy)), int(r), (255,0,0), 3) #손가락인식하는 원 circle = np . zeros_like(fingerless) #손가락검출을위해 흰색원 생성 cv2 . circle(circle,(int(avgx), int(avgy)),int(r),( 255 , 255 , 255 ), - 1 ) #손가락없는 컨투어의 좌표에 원을 생성 #cv2.imshow("circle", circle) 만들어진 흰색 원 그림 #원 둘레의 좌표를 알기위한 컨투어 circlecontour,_ = cv2 . findContours(circle, cv2 . RETR_EXTERNAL, cv2 . CHAIN_APPROX_NONE) circlecontourarray = np . array(circlecontour) if circlecontourarray is not None: #원 컨투어의 배열이 없을 때는 실행안함 cx = circlecontourarray[:,:,:, 0 ] #원 둘레의 x좌표 cy = circlecontourarray[:,:,:, 1 ] #원 둘레의 y좌표 finger = 0 #손가락수 for i in range(len(circlecontourarray[ 0 ])): #원의 둘레만큼 반복 a = background[cy[ 0 ][i - 1 ],cx[ 0 ][i - 1 ]] #손 마스크의 전 좌표값 b = background[cy[ 0 ][i],cx[ 0 ][i]] #손 마스크의 현재 좌표값을 비교해서 if (a == 0 ) and (b == 255 ): # 값이 달라졌을때 #cv2.circle(img, (cx[0][i], cy[0][i]), 5, (0,0,255), -1) #겹친 부분에 조그만 원을 그려줌 finger = finger + 1 finger = finger - 1 #손목이나 손바닥주변이 손가락으로 인식되는것 때문에 1을 빼줌 #cv2.imshow("img", img) #위에 있는 주석들을 출력 if finger == 1 : #손가락 1개일 때 edges = cv2 . Canny(img, 100 , 200 ) cv2 . imshow( "result" , edges) elif finger == 2 : #손가락 2개일 때 img_gray = cv2 . cvtColor(img, cv2 . COLOR_BGR2GRAY) img_gray = cv2 . GaussianBlur(img_gray, ( 9 , 9 ), 0 ) edges = cv2 . Canny(img_gray, 100 , 200 ) ret, sketch = cv2 . threshold(edges, 70 , 255 , cv2 . THRESH_BINARY_INV) kernel = cv2 . getStructuringElement(cv2 . MORPH_CROSS, ( 3 , 3 )) sketch = cv2 . erode(sketch, kernel) sketch = cv2 . medianBlur(sketch, 5 ) cv2 . imshow( "result" , sketch) elif finger == 4 : #손가락 4개일 때 rows, cols = img . shape[: 2 ] exp = 0.5 scale = 1 mapy, mapx = np . indices((rows, cols), dtype = np . float32) mapx = 2 * mapx / (cols - 1 ) - 1 mapy = 2 * mapy / (rows - 1 ) - 1 r, theta = cv2 . cartToPolar(mapx, mapy) r[r < scale] = r[r < scale] ** exp mapx, mapy = cv2 . polarToCart(r, theta) mapx = ((mapx + 1 ) * (cols - 1 )) / 2 mapy = ((mapy + 1 ) * (rows - 1 )) / 2 distorted = cv2 . remap(img, mapx, mapy, cv2 . INTER_LINEAR) cv2 . imshow( "result" , distorted) else : #그 외의 경우일 때 cv2 . imshow( "result" , img) laptime = time . time() - laptime count += 1 avg_time = (avg_time * (count - 1 ) + laptime) / count if cv2 . waitKey( 1 ) != - 1 : break else : print ( 'no frame' ) break else : print ( "can't open camera." ) print ( "count :" , count) print ( "average time :" , avg_time) cap . release() cv2 . destroyAllWindows()

Mediapipe를 이용한 제스쳐인식

먼저 시작은 유튜브다 딥러닝,머신러닝을 공부하는 사람을 봤는데 너무 내취향의 유튜브였다

그 유튜브에서 Mediapipe를 이용해 개발하는 영상을 하나 봤는데 너무 재밌어 보여서 해보게되었다

공식홈페이지에 들어간뒤 설치를 하고 Solution카테고리에 Hand로 들어가서 openCV를 이용해 웹캡의 캡쳐 텍스쳐를 가져와 손을 인식하고, 손을 트레킹하는데까지는 성공했다

그 이후 이 손동작이 어떤제스쳐인지 판단하는 로직을 넣어야하는데 이 정보가 공식문서에 존재하지않는다

이때 좀 어질어질했는데 마음을 다잡고 다시 정보를 찾아보며 생각해봤는데 제스쳐인식을 너무 어렵게

생각안해도 되는 것이란 것을 깨달았다 그냥 각 손가락이 펴졌는지 접혔는지 상태로 제스쳐를

판단할 수 있었다너무 너무 간단한 솔루션이였다 바로 코드로 옮겼다

이게 공식 홈페이지에 있는 사진인데

검지는 0번부터 8번까지의 길이가 0번부터 6번까지의 길이보다 짧으면 접힌걸로 판단

중지는 0번 -> 12번 길이가 0번 -> 10번 길이보다 짧으면 접힌걸로 판단

약지는 0번 -> 16번 길이가 0번 -> 14번 길이보다 짧으면 접힌걸로 판단

소지는 0번 -> 20번 길이가 0번 -> 18번 길이보다 짧으면 접힌걸로 판단

이게 엄지가 판단하기 좀 애매했다 다른 손가락같이 0번 -> 4번 길이가

0번 -> 3번 길이보다 짧은걸로 판단하면

무조건 엄지가 펴져있는걸로 인식됬다 인체구조상 4번까지 길이가

3번까지 길이보다 짧아질 수 가없기 때문이다

그래서 나는 0번 -> 4번 길이와 0번 -> 18번 길이를 비교해 판단하기로 했다

결과물이 제법 깔끔하게 나왔다 그리고 길이 구하는 데에는 점과 점사이의 거리공식을 썼다

이렇게 판단하고, 제스쳐의 데이터를 넣어서

이렇게 완성됬다

전체 소스코드다

새로운 제스쳐를 추가하고 싶으면 gesture배열에

각각 엄지,검지,중지,약지,소지,제스쳐이름 순으로 추가하면된다

이다음으로 할거는 제스쳐를 이용해 컴퓨터의 볼륨을 조절하는 것이고

최종목표는 수화번역AI를 만드는 것이다

꾸준히 해보도록하자

키워드에 대한 정보 opencv 손가락 인식

다음은 Bing에서 opencv 손가락 인식 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

See also  마스터 노드 투자 | 마스터노드란 무엇인가? Prot 마스터노드 뉴스3 Prot Masternode News3 (Korean Version) 13552 좋은 평가 이 답변
See also  조폭 마누라 다시 보기 | 조폭 마누라 2001 100 개의 자세한 답변

See also  군대 바로 입대 | 군입대도 준비가 필요합니다. 인기 답변 업데이트

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 가위바위보 기계 만들기 – 손가락 인식 인공지능

  • 개발
  • 인공지능
  • 파이썬
  • 이미지처리
  • python
  • ai
  • imageprocessing
  • deeplearning
  • machinlearning

가위바위보 #기계 #만들기 #- #손가락 #인식 #인공지능


YouTube에서 opencv 손가락 인식 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 가위바위보 기계 만들기 – 손가락 인식 인공지능 | opencv 손가락 인식, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment