openCv page Dewarp 분석 -2

저번 포스트에는 프로젝트 개요 부터 이미지 입력, 이미지 resize까지 살펴 보았습니다.

이번 포스트에선 마스킹 이미지 생성을 알아보겠습니다.

파일 이름 구하기

1
2
3
4
5
6
7
8
basename = os.path.basename(imgfile)
name, _ = os.path.splitext(basename)

print ("loaded", basename, "with size", imgsize(img),)
print ('and resized to', imgsize(small))

if DEBUG_LEVEL >= 3:
debug_show(name, 0.0, 'original', small)
  • os.path.basename : 입력받은 경로의 기본 이름(base name)을 반환합니다.
  • os.path.splitext : 입력 받은 경로를 확장자 부분과 그 외의 부분으로 나눕니다.단순한 문자열 연산이므로 실제 파일의 존재 여부는 확인하지 않습니다.

debug_show를 통해서 DEBUG_LEVEL을 설정했으면 중간 결과물을 file 또는 screen으로 보여줍니다. 여기서는 resize된 결과물을 보여줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def debug_show(name, step, text, display):

if DEBUG_OUTPUT != 'screen':
filetext = text.replace(' ', '_')
outfile = name + '_debug_' + str(step) + '_' + filetext + '.png'
cv2.imwrite(outfile, display)

if DEBUG_OUTPUT != 'file':

image = display.copy()
height = image.shape[0]

cv2.putText(image, text, (16, height-16),
cv2.FONT_HERSHEY_SIMPLEX, 1.0,
(0, 0, 0), 3, cv2.LINE_AA)

cv2.putText(image, text, (16, height-16),
cv2.FONT_HERSHEY_SIMPLEX, 1.0,
(255, 255, 255), 1, cv2.LINE_AA)

cv2.imshow(WINDOW_NAME, image)

while cv2.waitKey(5) < 0:
pass

DEBUG_OUTPUT이 file로 설정되어 있다면 중간 결과물을 file로 저장합니다.

cv2.imwrite는 이미지를 파일로 저장하기 위한 함수입니다. 기본형은 imwrite(filename, img, params=None)입니다.

DEBUG_OUTPUT이 screen으로 설정되어 있다면 중간 결과물을 윈도우창으로 보여줍니다.

cv2.putText은 이미지에 TEXT를 넣습니다. 기본형은 putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)입니다.

  • img : 문자열을 그릴 이미지
  • text : 문자열
  • org : 출력 문자 시작 위치 좌표(좌측 하단)
  • fontFace : 폰트 타입
    • cv2.FONT_HERSHEY_SIMPLEX : normal size sans-serif font
    • cv2.FONT_HERSHEY_PLAIN : small size sans-serif font
    • cv2.FONT_HERSHEY_DUPLEX : normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
    • cv2.FONT_HERSHEY_COMPLEX : normal size serif font
    • cv2.FONT_HERSHEY_TRIPLEX : normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
    • cv2.FONT_HERSHEY_COMPLEX_SMALL : smaller version of FONT_HERSHEY_COMPLEX
    • cv2.FONT_HERSHEY_SCRIPT_SIMPLEX : hand-writing style font
    • cv2.FONT_HERSHEY_SCRIPT_COMPLEX : more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
    • cv2.FONT_ITALIC : flag for italic font
  • fontScale : 폰트 기본 크기에 곱해질 폰트 스케일 팩터(Font scale factor)
  • color : 글자 색
  • thickness : 폰트 두께. 디폴트값 1
  • lineType : 선 종류. 디폴트값 cv2.LINE_8(=8-connected line)
  • bottomLeftOrigin : org 사용 옵션. Ture : 좌측하단, False : 좌측 상단. 디폴트값 false

cv2.imshow(WINDOW_NAME, image)으로 이미지를 screen에 보여줍니다. 기본형은 imshow(winname, mat)입니다.

  • winname : 윈도우 창의 이름을 설정합니다.
  • mat : 보여줄 이미지

masking을 위한 준비

1
pagemask, page_outline = get_page_extents(small)

get_page_extents() 함수를 통해서 making을 위한 그림을 그립니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def get_page_extents(small):

height, width = small.shape[:2]

xmin = PAGE_MARGIN_X #50
ymin = PAGE_MARGIN_Y #20
xmax = width-PAGE_MARGIN_X
ymax = height-PAGE_MARGIN_Y

page = np.zeros((height, width), dtype=np.uint8)
cv2.rectangle(page, (xmin, ymin), (xmax, ymax), (255, 255, 255), -1)

print("page show")
cv2.imshow("page", page)

outline = np.array([
[xmin, ymin],
[xmin, ymax],
[xmax, ymax],
[xmax, ymin]])

return page, outline

height, width = small.shape[:2]를 통해 이미지의 높이와 폭을 구한다. Numpy array에서 shape는 몇행 몇열로 이루어져있는지 차원을 알 수 있습니다.

여기서는 페이지의 마진을 폭에는 50, 높이에는 20을 고정값으로 주고 있습니다.

page = np.zeros((height, width), dtype=np.uint8)를 통해 0으로 채워진 배열을 생성한다. RGB에서 0은 검정을 의미합니다.

cv2.rectangle(page, (xmin, ymin), (xmax, ymax), (255, 255, 255), -1)를 통해 사각형을 그립니다.

cv2.rectangle는 이미지에 사각형을 그리는 함수입니다. 기본형은 rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)입니다.

  • img – 그림을 그릴 이미지
  • start – 시작 좌표(ex; (0,0)) 좌측 상단 기준.
  • end – 종료 좌표(ex; (500. 500)) 우측 하단 기준.
  • color – BGR형태의 Color(ex; (255, 0, 0) -> Blue)
  • thickness (int) – 선의 두께. pixel. 음수일 경우 안의 내용을 가득 채웁니다.

여기서는 사각형은 높이 20, 폭 50의 마진을 가진 흰색 사각형이 만들어 집니다.

mask 이미지

그후 사각형 이미지와 사각형의 4 꼭지점을 저장한 배열을 리턴합니다.

공유하기