제퍼넷 로고

OpenCV를 사용하여 가상 키보드를 개발하는 방법

시간

이 기사는 데이터 과학 Blogathon

개요

OpenCV 컴퓨터 비전 작업에 가장 많이 사용되는 라이브러리로, 실시간 컴퓨터 비전 응용 프로그램을 개발하는 데 사용되는 머신 러닝, 이미지 처리 등을 위한 크로스 플랫폼 오픈 소스 라이브러리입니다.

CVzone은 OpenCV와 Medias를 사용하는 컴퓨터 비전 패키지로 손 추적, 얼굴 감지, 얼굴 랜드마크 감지, 포즈 추정 등과 같이 쉽게 실행할 수 있도록 하는 핵심 기능과 이미지 처리 및 기타 컴퓨터 비전 관련 응용 프로그램입니다. 확인하다 여기에서 지금 확인해 보세요.

OpenCV를 이용한 가상 키보드 구현

가상 키보드를 만들어 보겠습니다.

먼저 필요한 모듈을 설치하겠습니다.

---> pip install numpy ---> pip install opencv-python ---> pip install cvzone ---> pip install pynput

OpenCV를 사용하여 가상 키보드용 라이브러리 가져오기

이제 필요한 모듈을 가져오겠습니다.

import cv2 import cvzone from cvzone.HandTrackingModule import HandDetector from time import sleep import numpy를 pynput.keyboard에서 np로 가져오기 컨트롤러 가져오기

여기에서는 cvzone.HandTrackingModule에서 HandDetector 모듈을 가져오고 가상 키보드가 작동하도록 하려면 pynput.keyboard에서 Controller를 가져와야 합니다.

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) cap.set(3, 1280) cap.set(4, 720)

이제 cv2.Videocapture에서 실시간 입력을 받아보겠습니다.

감지기 = HandDetector(detectionCon=0.8) keyboard_keys = [["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P "], ["A", "S", "D", "F", "G", "H", "J", "K", "L", ";"], ["Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"]]
final_text = ""

탐지 신뢰도 0.8로 HandDetector를 초기화하고 탐지기에 할당합니다. 그런 다음 키보드 레이아웃에 따라 목록 배열을 만들고 입력된 키를 저장할 빈 문자열을 정의합니다.

그리기 기능 정의

키보드 = 컨트롤러()
def draw(img, buttonList): buttonList에 있는 버튼의 경우: x, y = button.pos w, h = button.size cvzone.cornerRect(img, (button.pos[0], button.pos[1], button.pos[0], button.pos[0]). size[20],button.size[0]), 2,rt=255) cv144.rectangle(img, button.pos, (int(x + w), int(y + h)), (30, 2, 2), cv20.FILLED) cv65.putText(img, button.text, (x + 2, y + 4), cv0.FONT_HERSHEY_PLAIN, 0, (0, 4, XNUMX), XNUMX) img 반환

키보드 컨트롤러 초기화 및 이름으로 함수 정의 무승부() 이미지와 buttonList라는 두 개의 인수를 사용하여 이미지를 반환합니다. 여기 내부 무승부() 함수, 우리는 cvzone을 사용하고 있습니다. 모서리 사각형 각 키의 모서리에 사각형 가장자리를 그리는 기능입니다. 키보드 레이아웃을 더 보기 좋게 만들기 위한 것입니다. 아래 이미지와 같이 보일 것입니다.

OpenCV를 사용하는 W 키 가상 키보드

다양한 색상을 변경해 볼 수도 있습니다.

클래스 Button(): def __init__(self, pos, text, size=[85, 85]): self.pos = pos self.size = size self.text = text

그런 다음 Button()이라는 클래스를 정의하고 잘 정의된 순서로 키보드 키를 정렬할 수 있도록 위치, 텍스트 및 크기를 입력으로 제공합니다.

buttonList = [] # mybutton = Button([100, 100], "Q") for k in range(len(keyboard_keys)): for x, key in enumerate(keyboard_keys[k]): buttonList.append(Button([ 100 * x + 25, 100 * k + 50], 키))

위의 루프는 입력으로 위치와 텍스트를 제공하는 키보드 키와 Button 객체를 반복하며 버튼 목록이라는 목록에 추가됩니다. 나중에 이 목록을 실시간 프레임 위에 그리는 draw 함수에 전달할 수 있습니다.

OpenCV를 사용한 가상 키보드용 메인 프로그램

여기서 중요한 부분이 나옵니다.

while True: 성공, img = cap.read() img = detector.findHands(img) lmList, bboxInfo = detector.findPosition(img) img = draw(img, buttonList) # 투명 키에 대해 그리기 기능을 transparent_layout으로 변경 if lmList : buttonList의 버튼: x, y = button.pos w, h = button.size if x < lmList[8][0]

while 루프 내에서 주요 기능이 발생합니다. 먼저 실시간 입력 프레임을 읽고 이라는 변수에 저장합니다. IMG. 그런 다음 해당 이미지를 detector.findHands() 프레임에서 손을 찾기 위해. 그런 다음 해당 이미지에서 감지된 손의 위치와 경계 상자 정보를 찾아야 합니다.

여기에서 검지와 중지 사이의 거리를 찾을 수 있습니다. 둘 사이의 거리가 특정 임계값보다 작으면 가리키는 문자를 입력할 수 있습니다. 위치를 얻으면 전체 위치 목록을 반복합니다. 그 목록에서 버튼 위치와 버튼 크기를 찾은 다음 잘 정의된 방식에 따라 프레임에 플로팅합니다.

손 랜드마크 모델 | OpenCV를 사용한 가상 키보드
이미지 1: 손 랜드마크 모델  

그런 다음 검지와 중지 사이의 거리를 찾아야 합니다. 위의 이미지에서 우리가 필요로 하는 상위 포인트는 포인트 8과 포인트 12임을 알 수 있습니다. 따라서 우리는 그들 사이의 거리를 얻기 위해 거리 찾기 함수 내부에 8, 12를 전달해야 합니다. 위의 코드에서 볼 수 있습니다 detector.findDistance() 거기에서 거리를 찾기 위해 8, 12 및 image를 전달했고 두 점 사이에 선이 필요하지 않도록 그리기 플래그를 false로 설정했습니다.

점 사이의 거리가 매우 짧으면 다음을 사용합니다. 누르다() 키를 누르는 기능입니다. 위의 코드에서 키보드.프레스() 그리고 우리는 지나가고 있다 버튼.텍스트 누른 키를 표시하기 위해. 마지막으로 누른 키를 표시하기 위해 키보드 레이아웃 바로 아래에 작은 흰색 직사각형 상자를 그립니다.

전체 코드를 실행하면 다음과 같이 보입니다.

최종 출력 | OpenCV를 사용한 가상 키보드

특정 문자 위에 검지와 중지를 가까이 대면 해당 문자를 입력할 수 있습니다.

가상 키보드 사용

키보드 레이아웃을 더 사용자 정의해야 하는 경우 키보드 레이아웃을 투명하게 만들 수 있습니다. 투명 레이아웃 기능을 추가하고 무승부() 기능 투명_레이아웃() 기능.

정의하자 투명_레이아웃() 기능. 아래는 함수이며, 동일한 입력을 취합니다. 무승부() 기능. 여기에서 우리는 numpy를 할당합니다. 제로_라이크() 라는 변수에 대한 함수 imgNew 모서리 사각형을 갖고 각 키에 대한 사각형 상자를 만들고 상자 안에 텍스트를 넣는 것과 같이 원하는 작업을 수행합니다. 그런 다음 해당 이미지를 새 변수에 복사하고 다음의 마스크를 만듭니다. imgNew 그리고 우리는 OpenCV를 사용합니다 추가 가중치() 실제 이미지 위에 마스크를 배치하는 기능입니다. 따라서 키보드 레이아웃이 투명해집니다.

키보드 사용자 정의

def transparent_layout(img, buttonList): imgNew = np.zeros_like(img, np.uint8) for buttonList의 버튼: x, y = button.pos cvzone.cornerRect(imgNew, (button.pos[0], button.pos[ 1], button.size[0],button.size[0]), 20 ,rt=0) cv2.rectangle(imgNew, button.pos, (x + button.size[0], y + button.size[ 1]), (255, 144, 30), cv2.FILLED) cv2.putText(imgNew, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4)

출력 = img.copy()
알파하 = 0.5
마스크 = imgNew.astype(bool)
인쇄(마스크.모양)
out[마스크] = cv2.addWeighted(img, 알파하, imgNew, 1-알파하, 0)[마스크]
돌아오다


일단 교체하면 무승부() while 루프 내부의 함수 투명_레이아웃() 기능은 다음과 같이 보일 것입니다. (아래 이미지)

투명 키보드 |

OpenCV를 사용한 가상 키보드의 전체 코드

아래는 전체 코드입니다

import cv2 import cvzone from cvzone.HandTrackingModule import HandDetector from time import sleep import numpy as np from pynput.keyboard import Controller cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) cap.set(3, 1280) cap.set(4, 720) 감지기 = HandDetector(detectionCon=0.8) keyboard_keys = [["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"], ["A", "S", "D", "F", "G", "H", "J", "K", "L", ";"], ["Z ", "X", "C", "V", "B", "N", "M", ",", ".", "/"]] final_text = "" keyboard = Controller() def draw (img, buttonList): buttonList의 버튼: x, y = button.pos w, h = button.size cvzone.cornerRect(img, (button.pos[0], button.pos[1], button.size[ 0],버튼.크기[0]), 20,rt=0) cv2.rectangle(img, button.pos, (int(x + w), int(y + h)), (255, 144, 30) , cv2.FILLED) cv2.putText(img, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4) img 반환 def transparent_layout(img, buttonList) : imgNew = np.zeros_like(img, np.uint8) buttonList의 버튼: x, y = button.pos cvzone.cornerRect(im gNew, (button.pos[0], button.pos[1], button.size[0], button.size[0]), 20 ,rt=0) cv2.rectangle(imgNew, button.pos, (x) + button.size[0], y + button.size[1]), (255, 144, 30), cv2.FILLED) cv2.putText(imgNew, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (0, 0, 0), 4) out = img.copy() alpaha = 0.5 mask = imgNew.astype(bool) print(mask.shape) out[mask] = cv2.addWeighted(img , alpaha, imgNew, 1-alpaha, 0)[mask] return out class Button(): def __init__(self, pos, text, size=[85, 85]): self.pos = pos self.size = size self .text = 텍스트 buttonList = [] # mybutton = Button([100, 100], "Q") for k in range(len(keyboard_keys)): for x, key in enumerate(keyboard_keys[k]): buttonList.append (Button([100 * x + 25, 100 * k + 50], key)) while True: 성공, img = cap.read() img = detector.findHands(img) lmList, bboxInfo = detector.findPosition(img) img = draw(img, buttonList) # 투명 키에 대해 그리기 기능을 transparent_layout으로 변경 if lmList: for button in buttonList: x, y = button.pos w , h = 버튼 크기 x < lmList[8][0]인 경우

결론

이것은 가상 키보드의 구현입니다. 다음 단계로 이동하려면 모든 키 누르기 소리를 내고 키보드 레이아웃을 프레임 내에서 이동할 수도 있습니다.

당신이 그것을 즐겼기를 바랍니다.

참조

이미지 1: https://google.github.io/mediapipe/solutions/hands.html

My 링크드인

감사합니다

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.

출처: https://www.analyticsvidhya.com/blog/2021/09/develop-a-virtual-keyboard-using-opencv/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?