OpenCV 29

[OpenCV] 성능 측정 및 개선 방법

공식 문서 링크OpenCV를 통한 성능 측정cv.getTickCount() 함수는 기준 이벤트 후 이 함수가 호출되기까지의 클럭 사이클을 반환한다.클럭 사이클이란?: CPU가 연산을 수행하는 최소 시간 단위cv.getTickFrequency() 함수는 1초 동안 발생하는 클럭 사이클 수를 반환한다.측정 방법 예시( 종료 시점의 cv.getTickCount() - 실행 시점의 cv.getTickCount() ) / cv.getTickFrequency()OpenCV의 기본 최적화OpenCV는 SSE2, AVX 같은 SIMD 명령어 최적화를 지원한다.SIMD 명령어란?: SIMD = 단일 명령으로 다중 데이터를 동시에 연산하는 방식이다. CPU가 지원하는 경우, 한 번의 명령으로 여러 값을 동시에 계산하게 해..

OpenCV 2025.02.03

[OpenCV] 이미지에서 산술 연산을 진행하는 방법

이미지 병합두 개의 이미지를 병합하려면, cv.add()나 numpy 연산으로 image1 + image2 로 처리할 수 있다.cv2.add(이미지 1, 이미지 2)cv 덧셈 연산은 최대값을 넘어갈 경우 최대값으로 값을 제한한다.numpy 연산은 최대 범위를 초과하면 초과분을 다시 0부터 시작한다.이미지 블렌딩혼합 또는 투명도를 주기 위해 이미지에 다른 가중치를 부여해 더할 수 있다.가중치를 부여해 덧셈을 하려면, cv.addWeighted()를 사용할 수 있다.cv.addWeighted(이미지 1, 이미지 1에 대한 가중치, 이미지 2, 이미지 2에 대한 가중치, gamma 값)(1, 1) 위치 픽셀의 값으로 제한한 계산식: 결과값 = 이미지 1 * 이미지 1에 대한 가중치 + 이미지 2 * 이미지 2..

OpenCV 2025.02.01

[OpenCV] 영상에서 처리할 수 있는 기본 작업

공식문서픽셀 값에 접근하고, 값을 수정하는 방법행과 열 좌표를 기준으로, 픽셀 값에 접근할 수 있다.이미지의 색상이 BRG일 경우, [파란색, 녹색, 빨간색] 배열을 반환한다.이미지의 색상이 그레이스케일일 경우, 색상 강도를 반환한다.이 값을 변경할 수 있지만, 특정 픽셀들에 접근하고 수정하는 것은 매우 느리기 때문에 권장하지 않는 사항이다.이미지 속성에 접근하는 방법이미지의 속성에는 여러 값들이 포함되어 있다.행/열/채널의 수, 이미지 데이터 유형, 픽셀 수 등이미지의 모양은 image.shape로 접근할 수 있다. 이미지가 색상일 경우, [행, 열, 채널] 튜플을 반환한다.그레이스케일일 경우, [행, 열]만 반환한다.이미지의 총 픽셀 수는 image.size로 접근할 수 있다.이미지의 데이터 타입은 ..

OpenCV 2025.01.31

[OpenCV] 코드 리팩토링을 했다.

서론키 입력을 받는 부분에서, 반복되는 부분이 보이길래 통합을 해 버렸다. 트리거 검증과 이벤트 실행을 나중에 분리하려고 생각했었는데, 지금 리팩토링을 해서 구조를 바꿔버리는게 성급했던 결정은 아닌가 걱정이 된다.지금 당장은 필요하다고 생각되는 부분이였고, 간단한 수정이였기 때문에 강행했지만, 다음 번에 복잡한 코드를 리팩토링 할 때는 더 신중한 자세로 진행해야겠다 생각했다.진행 내용이전 코드trigger_ = index_finger_mcp_y 트리거 검증 + 중복 확인 -> 이벤트 발동의 구조로 이루어진 6줄이 반복되는 걸 볼 수 있다.그래서 이걸 하나의 함수로 만들어 버렸다.이후 코드 class Event: def **init**(self, point_1: float, point_2: fl..

OpenCV 2024.12.30

[OpenCV] 손 인식 커스텀 INPUT 프로젝트 관련

서론OpenCV를 오랜만에 만지작거리다 보니, 예전에 하려고 했던 프로젝트 기획이 떠올랐다.그때는 수화 번역기를 만들어 보려고 했는데, 그건 좀 많이 힘들 것 같아서 폐기했었더랬다.아무튼 각설하고, 나는 카페에서 작업을 할 때가 잦은데, 가끔 마우스를 두고 다닌다. 트랙패드를 쓰면 되기는 하는데, 막상 쓰다 보면 익숙하지도 않고, 마우스가 있어도 책상이 작거나 낮아서 쓰기 불편할 때도 있다.그래서 최근에 건드리던 게, 손가락을 인식해서 마우스 커서를 움직이는 그런 거였고, 이걸 직접 만들어서 쓰려고 하니, 어떤 기능이 더 있으면 좋겠다 하는 게 너무 많았다.마우스도 되니까 키보드도 되면 좋을 것 같고, 키보드 전부에다가 단축키 입력까지 가능하게 하면 정말 좋겠다 해서 만들어 보려고 했다.프로젝트 1차 목..

OpenCV 2024.12.25

[openCV] mp_draw 코드 수정해서 출력 수정하기

서론hand_landmarks.landmark에서 특정 포인트를 찍을 때, 불편한 점이 있다. 이 지점의 값이 몇인지, 이름이 무엇인지 모른다는 것이다. 이걸 확인하기 위한 방법은 라이브러리 코드를 직접 확인하는 것이다.설명1. enum 확인하기앞선 글에서, 클릭 이벤트 처리를 위한 enum을 선언했었다. 이와 같이, HandLandmark도 enum이 선언되어 있다.mediapipe.python.solutions.hands.HandLandmark 경로에 선언되어 있다.class HandLandmark(enum.IntEnum): """The 21 hand landmarks.""" WRIST = 0 THUMB_CMC = 1 THUMB_MCP = 2 THUMB_IP = 3 THUMB_TIP = 4..

OpenCV 2024.12.24

[OpenCV] 클릭 이벤트 작동하기

서론마우스 커서 이동이 가능해졌으니, 이제 클릭도 가능하게 해 보겠다. pyautogui.pyautogui()을 사용할 것이다.코드 설명1. Enum 타입 지정하기한 프레임마다 조건을 검출하기 때문에, 클릭 이벤트가 여러 번 작동할 수 있다. 이를 방지하기 위해, ClickState라는 Enum을 생성하여 조건을 확실하게 명시해 주었다.from enum import Enumclass ClickState(Enum): DISABLED = 0 # 클릭 비활성 READY = 1 # 클릭 준비 완료 BUSY = 2 # 클릭 작동 중// ------read_click: ClickState = ClickState.READY2. 엄지와 약지 읽고 좌표값 구한 다음 클릭 이벤트 적용하기앞선 글에서와..

OpenCV 2024.12.23

[OpenCV] 손가락 제스처로 마우스 이동 이벤트 만들기

서론openCV, mediapipe, pyautogui를 사용해서 제스처를 이용해 마우스 커서를 이동하게 만들어 봤다.openCV로 카메라 input을 받고, mediapipe로 제스처를 인식한 다음, pyautogui로 결과값(마우스 커서 이동)을 출력하는 방식으로 진행했다.코드 설명1. 필요한 정보들 불러오기mediapipe의 hands 모듈을 불러오고, 검출 신뢰도를 조정한다. 기본은 0.5지만, 이번엔 손 모양을 기반으로 input이 들어오게 하기 때문에 신뢰도를 약간 향상시켰다.cv2.imshow로 출력하지 않을 거라면, mp_draw는 불러올 필요가 없다.pyautogui.size()를 통해서, 현재 디스플레이의 높이와 넓이를 불러왔다. mp_hands = mediapipe.solutio..

OpenCV 2024.12.22

[OpenCV_01_EX_키 입력이랑 마우스 이벤트로 점도 찍고 글씨도 쓰고 창도 움직이고 입력한 것 지우기도 하고 현재 창 저장도 하고 하기]

main.py from EX_01 import * window = EX01("./white.jpg") img = window.read() while img is not None: open(img, window.win_name) key = cv2.waitKey() if key == ord('m'): window.x, window.y = move_window(window.win_name, window.x, window.y) if key == ord('c'): circle(img, window.win_name) if key == ord('w'): write(img, window.win_name) if key == ord('r'): remove(img, window.win_name) if key == ord('..

OpenCV 2022.12.17