본문 바로가기

OpenCV/Python

ROI -2 응용하기

 

1) 트랙바 사용

 -> threshold 수치 변경을 위해

트랙바 값을 가져와 후에 Canny 에서 활용

 

2) mouse_callback

- 버튼 클릭 시 시작좌표로 선정

- 클릭하고 마우스 이동시 끝 좌표 계속 초기화

- 마우스 클릭때면 끝 좌표로 선정

 

cv.setMouseCallback('AAA', mouse_callback)

 

 

3) 비디오에 적용

마우스 클릭시

 -> 작은 원으로 클릭 표시

 

마우스 이동중

 -> 사각형을 생성

 

마우스 땟을때

-> 해당 영역을 복사해 온 후 Canny 처리

 

-> 좌표 예외처리 중요

사각형 그리기 시에 꼭, 왼쪽 위 좌표랑  오른쪽 아래 좌표를 알아야 한다.

근데 이게 역으로 들어가게 되면 에러가 생기니 꼭 swap을 하자

- 추가로 마우스를 클릭만 하고, 때게 되면 rectangle 함수에서 에러가 생기게 되므로, continue 처리도 하자.

 

import cv2 as cv
import numpy as np

mouse_press = False
start_x, start_y, end_x, end_y = 0, 0, 0, 0
step = 0

threshold_1, threshold_2 = 0, 0


def swap(a, b):
    tmp = a
    a = b
    b = tmp


def on_trackbar(x):
    pass


def mouse_callback(event, x, y, flags, param):

    global step, start_x, start_y, end_x, end_y, mouse_press

    if event == cv.EVENT_LBUTTONDOWN:
        step = 1

        mouse_press = True
        start_x = x
        start_y = y

    elif event == cv.EVENT_MOUSEMOVE:
        if(mouse_press == True):
            end_x = x
            end_y = y

            step = 2

    elif event == cv.EVENT_LBUTTONUP:
        mouse_press = False
        end_x = x
        end_y = y

        step = 3


cv.namedWindow('AAA')
cv.setMouseCallback('AAA', mouse_callback)

cv.createTrackbar('1', 'AAA', 0, 200, on_trackbar)
cv.createTrackbar('2', 'AAA', 0, 200, on_trackbar)

cap = cv.VideoCapture(0)

while True:
    ret, img = cap.read()
    threshold_1 = cv.getTrackbarPos('1', 'AAA')
    threshold_2 = cv.getTrackbarPos('2', 'AAA')
    if ret == False:
        print("ERROR")
        continue

    # 클릭시
    if step == 1:
        cv.circle(img, (start_x, start_y), 10, (0, 231, 42), -1)

    # 마우스 이동 중
    elif step == 2:
        cv.rectangle(img, (start_x, start_y), (end_x, end_y), (0, 231, 42), 3)

    # 마우스 땟을때
    elif step == 3:
        if(start_x > end_x):
            swap(start_x, end_x)
            swap(start_y, end_y)
        elif start_x == end_x:
            continue
        ROI = img[start_y:end_y, start_x:end_x]

        ROI = cv.Canny(ROI, threshold_1, threshold_2)
        ROI = cv.cvtColor(ROI, cv.COLOR_GRAY2BGR)

        img[start_y:end_y, start_x:end_x] = ROI

    cv.imshow('AAA', img)

    if cv.waitKey(1) == 27:
        break

 

'OpenCV > Python' 카테고리의 다른 글

이미지 기하학적 변환  (0) 2021.06.13
ROI - 3 응용하기2 ( 평균 색 추출하기)  (0) 2021.06.12
ROI -1 관심영역 설정  (0) 2021.06.11
이미지 비트연산을 활용한 이미지 합성  (0) 2021.06.11
물체 감싸기  (0) 2021.06.11