티스토리 뷰

일몰 이미지에서 관심 영역 지정하기 


1. 정적으로 관심 영역 지정 

import cv2
import numpy as np


img=cv2.imread('C:/Users/kycky/opencv/sunset3.jpg')

x=310;y=215;w=60;h=60           # 관심영역 좌표
roi = img[y:y+h,x:x+w]          # 관심영역 지정
img2 = roi.copy()				# 관심영역을 복사하여 img2에 저장

print(roi.shape)
cv2.rectangle(roi,(0,0),(h-1,w-1),(0,255,0),2) # roi에 사각형 그리기
cv2.imshow("img",img)            
cv2.imshow("img copy",img2) 	# 새 창에서 관심영역 출력             

cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

코드 실행 결과

 

 

관심 영역을 사각형 도형을 사용하여 지정했다. 하지만 위의 방법은 이미지에서 관심영역에 해당되는 좌표를 직접 코드로 입력하여 지정했다. 이 방법은 매우 번거러우므로 동적으로 해당 영역을 지정할 필요가 있다. 

 

 

 

동적(마우스 입력)으로 관심영역 지정하기 

import cv2
import numpy as np

isDragging=False                        # 마우스 드래그 상태 저장
x0,y0,w,h =-1,-1,-1,-1                  # 영역 선택 좌표 저장
blue, red = (255,0,0),(0,0,255)         # 생상 값


def onMouse(event,x,y,flags,param):     # 마우스 이벤트 핸들 함수
    global isDragging,x0,y0,img         # 전역 변수로 참조
    if event ==cv2.EVENT_LBUTTONDOWN:   # 왼쪽 마우스 버튼을 누름면,드래그 시작
        isDragging =True
        x0=x
        y0=y
    elif event == cv2.EVENT_MOUSEMOVE:  # 마우스 움직임
        if isDragging:                  # 드래그 진행 중
            img_draw = img.copy()       # 사각형 그림 표현을 위한 이미지 복제
            cv2.rectangle(img_draw,(x0,y0),(x,y),blue,2)    # 드래그 진행 영역 표시
            cv2.imshow('img',img_draw)                      # 사각형으로 표시된 그림 화면 출력
    elif event ==cv2.EVENT_LBUTTONUP:   # 왼쪽 마우스버튼을 땠을 때
        if isDragging:                  # 드래그 중지
            isDragging=False
            w=x-x0                      # 드래그 영역 폭 계산
            h=y-y0                      # 드래그 영역 높이 계산
            print("x:%d,y:%d,w:%d,h:%d"%(x0,y0,w,h))
            if w>0 and h >0:            # 폭과 높이가 음수이면 드래그 방향이 옳음
                img_draw = img.copy()   # 선택 영역에 사각형 그림을 표시핳 이미지 복제
                cv2.rectangle(img_draw,(x0,y0),(x,y),red,2) 
                cv2.imshow('img',img_draw)# 빨간색 사각형 이미지 출력
                roi = img[y0:y0+h,x0:x0+w]#원본이미지에서 roi로 지정
                cv2.imshow('cropped',roi) # roi 지정 영역을 새 창으로 표시
                cv2.moveWindow('cropped',0,0)   # 새 창을 화면 좌측 상단으로 이동
                cv2.imwrite('./cropped.jpg',roi)# ROI 영역만 파일로 저장 
                print("croped.")
            else:
                cv2.imshow('img',img)
                print("좌측 상단에서 우측 하단으로 영역을 드래그 하세요")
img=cv2.imread('C:/Users/kycky/opencv/sunset3.jpg')
cv2.imshow('img',img)
cv2.setMouseCallback('img',onMouse)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

드래그 했을 경우 이미지

 

드래그가 끝났을 경우 이미지

'Opencv 공부' 카테고리의 다른 글

[openCV] Matplotlib  (1) 2023.05.07
[openCV] NumPy  (3) 2023.05.06
[openCV] 각종 이벤트 함수 모음  (1) 2023.05.04
[openCV] 창 관리하기  (0) 2023.05.01
[openCV] 그림 그리기  (2) 2023.04.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함