7-6. 레이블링

객체 단위 분석

    객체 위치 및 크기 정보, ROI 추출, 모양 분석 등을 통해 객체를 분할하여 특징을 분석하는 방식

    레이블링(Connected Component Labeling)과 외곽선 검출(Contour Tracing) 방식이 있다.

 

레이블링(Labeling)

    동일 객체에 속해 서로 연결되어 있는 모든 픽셀에 고유한 번호를 지정해 레이블 맵(Map) 생성

    영역 기반 모양 분석 방식으로 보통 이진 영상에서 수행

    2가지 연결 관계 판정 방식 사용

     4-이웃 연결 관계(4-neighbor connectivity, 상하좌우) & 8-이웃 연결 관계(8-neighbor connectivity, 상하좌우 대각선 포함)

연결 관계 이해도 (출처:FastCampus)

    OpenCV에서는 3.x 버전 이후로 최신 논문 기반의 레이블링 알고리즘 함수를 제공 중 (외곽선 검출보다 효율적)

    레이블링 함수: cv2.connectedComponents(image, labels, connectivity, ltype) -> retval, labels

     image는 8-bit 1채널 영상

     labels는 레이블 맵 행렬로 입력 영상과 같은 크기의 numpy.ndarray

     connectivity는 이웃 연결 관계. 4(기본값) 또는 8 사용

     ltype는 labels 타입. cv2.CV_32S(기본값) 또는 cv2.CV_16S

     retval는 객체 개수(N). labels에는 [0, N-1]의 레이블이 존재 하며 0에는 배경 정보가 담겨 있다

    객체 단위 정보 포함 반환 레이블링 함수: cv2.connectedComponentsWithStats(image, labels, stats, centroids, connectivity, ltype) -> retval, labels, stats, centroids

     image는 8-bit 1채널 영상

     labels는 레이블 맵 행렬로 입력 영상과 같은 크기의 numpy.ndarray

     stats는 각 객체의 바운딩 박스 및 픽셀 개수 정보를 담은 행렬(numpy.ndarray). shape는 (N,5), 타입은 numpy.int32

     centroids는 각 객체의 무게 중심 위치 정보를 담은 행렬(numpy.ndarray). shape는 (N,2), 타입은 numpy.float64

     connectivity는 이웃 연결 관계. 4(기본값) 또는 8 사용

     ltype는 labels 타입. cv2.CV_32S(기본값) 또는 cv2.CV_16S

     retval는 객체 개수(N). labels에는 [0, N-1]의 레이블이 존재 하며 0에는 배경 정보가 담겨 있다

객체 단위 정보 포함 반환 레이블링 함수 결과 예시 (출처:FastCampus)
(a)는 강의 예제로 제공된 키보드 글자를 레이블링으로 인식한 모습. (b)는 글쓴이가 사용하는 키보드 추출 결과. 글자보다도 원형 키 외곽선 위주로 검출되었음을 볼 수 있다. 다른 방식의 전처리가 필요해 보인다.


7-7. 외곽선 검출

외곽선 검출(Boundary/Contour Tracing)

    각 객체의 외곽선 좌표를 모두 추출하는 작업

    외곽선 기반 모양 분석 방식으로 다양한 외곽선 처리 함수에 활용 가능

    객체의 내-외부 외곽선을 모두 검출 가능하기 때문에 외곽선 연관 관계를 계층 구조로도 표현 가능

    여러 외곽선을 포함하는 영상일 경우 외곽선 하나를 원소로 갖는 리스트(list)로 표현

     외곽선 하나의 경우 numpy.int32 타입을 갖는 (K,1,2) shape의 numpy.ndarray (여기서 K는 외곽선 좌표 개수)

     리스트의 길이가 영상에 포함된 모든 외곽선 개수

    외곽선 검출 함수: cv2.findContours(image, mode, method, contours, hierarchy, offset) -> contours, hierarchy

     image는 입력 영상. non-zero 픽셀을 객체로 간주함

     mode는 외곽선 검출 모드. 아래 그림 참고(외곽선에 할당된 번호는 임의로 지정되었으니 이해하는데만 사용)

     method는 외곽선 근사화 방법. 아래 그림 참고

     contours는 검출된 외곽선 좌표. numpy.ndarray로 구성된 리스트

     hierarchy는 외곽선 계층 정보. shape=(1, N, 4)와 dtype=numpy.int32의 numpy.ndarray로 hierarchy[0,i,0 ~ 3]이 순서대로 next, prev, child, parent 외곽선 인덱스로 해당 외곽선이 없을 경우 -1 값을 갖는다

     offset는 좌표 값 이동 오프셋으로 기본값은 (0,0)

mode와 method에 사용되는 상수에 대한 설명 (출처:FastCampus)

    외곽선 그리기 함수: cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset) -> image

     image는 입출력 영상

     contours는 cv2.findContours 함수로 구한 외곽선 좌표 정부

     contourIdx는 외곽선 인덱스. -1로 정할 경우 모든 외곽선을 그린다

     color는 외곽선 색상, thickness는 외곽선 두께

     lineType는 외곽선 그리는 라인 타입(cv2.LINE_4, LINE_8, LINE_AA)

     hierarchy는 외곽선 계층 정보

     maxLevel는 그리기를 수행할 최대 외곽선 레벨. 0일 경우 counterIdx로 지정된 외곽선만 그린다.

외곽선 검출 mode에 따른 그리기 결과 영상. 계층의 최상위 외곽선 선색을 따라간다


7-8. 다양한 외곽선 함수

외곽선 관련 함수

함수 인자 설명 함수 설명
cv2.arcLength(curve, closed) -> retval curve는 외곽선 좌표
closed는 True의 경우 폐곡선
retval는 외곽선 길이
외곽선 길이 구하기
cv2.contourArea(contour, oriented) -> retval contour는 외곽선 좌표
oriented는 True의 경우 외곽선 진행 방향에 따라 부호 있는 면적을 반환 (기본값은 False)
retval는 외곽선으로 구성된 영역의 면적
면적 구하기
cv2.boundingRect(array) -> retval array는 외곽선 좌표
retval는 사각형 정보 (x,y,w,h)의 튜플
바운딩 박스(외곽선을 외접하여 둘러싸는 가장 작은 사각형) 구하기
cv2.minEnclosingCircle(points) -> center, radius points는 외곽선 좌표
center는 바운딩 서클의 중심 (x,y) 튜플
radius는 바운딩 서클의 반지름 (실수)
바운딩 서클(외곽선을 외접하여 둘러싸는 가장 작은 원) 구하기
cv2.approxPolyDP(curve, epsilon, closed, approxCurve) -> approxCurve curve는 입력 곡선 좌표
epsilon는 근사화 정밀도 조절 (입력 곡선과 근사화 곡선간의 최대 거리)
closed는 폐곡선 여부
approxCurve는 근사화된 곡선 좌표
외곽선 근사화
(더글라스-포이커 알고리즘 참고)
cv2.isContourConvex(contour) -> retval contour는 입력 곡선 좌표
retval는 Convex일 경우 True
Convex(볼록 다각형, 두 점을 잇는 내부 모든 대각선이 도형을 벗어나지 않음. 내부 각도의 합이 180도보다 작거나 같고 도형을 가로지르는 직선을 그을 때 두 선만을 지난다) 확인

소개된 함수 포함 그 외 외곽선 관련 함수 (출처:FastCampus)

다각형 검출 프로그램

    다양한 다각형 객체 영상에서 삼각형, 사각형, 원 찾기

    구현 순서:

     1) 영상 이진화

     2) 외곽선 찾기

     3) 외곽선 근사화

     4) 너무 작은 개체와 컨백스가 아닌 객체 제외

     5) 꼭지점 개수 확인

       1] 삼각형, 사각형 검출

       2] 원 검출

           정해진 외곽선 길이(P)에 대한 넓이(A) 비율이 가장 큰 형태가 원으로 도형의 넓이와 외각선 길이의 비율로 검사

비율 수식. 수식 결과 값이 1에 가까울수록 원으로 판단된다. (출처:FastCampus) 
도형 검출 프로그램 수행 결과. 왼쪽 영상은 강의 예제, 오른쪽은 글쓴이가 임의로 그린 도형 영상으로 수행해본 결과이다.


7-9. 실전 코딩

명함 인식 프로그램

    영상에서 명함을 검출하고, 명함 안의 텍스트를 인식하는 프로그램

    가정(Assumption) 사항:

     1) 명함의 배경은 흰색이다

     2) 명함은 각진 사각형 모형이다

    구현 방식:

     1) Otsu로 명함이 포함된 영상을 자동 이진화

     2) 외곽선 검출 -> 다각형 근사화 -> 사각형 검출

     3) 명함의 네 모서리 점을 직사각형 네 모서리로 매핑 (일반적인 명함 비율인 9:4로 투시 변환)

         * 이 때 모서리 좌표가 왼쪽 상단이 첫 좌표 기준 반시계로 정렬되어 있지 않을 수도 있으니 lexsort함수를 사용해서 정렬이 필요

     4) 광학 문자 인식(OCR) 라이브러리인 Tesseract를 사용하여 명함에 있는 글자 인식

프로그램 구현 방식 (출처:FastCampus)

    Tesseract 설치 및 사용하기

     1) Windows Pre-built 설치 파일 다운로드 (링크) -> 실행

     * 강의에서는 20200328 버전으로 다운로드 하라고 했지만 글쓴이는 20220118 버전으로 다운로드 받았다.

     2) 설치 시 "Additional Script Data" 항목에 "Hangul Script", "Hangul vertical script" 항목 체크 & "Additional language data" 항목에 "Korea" 항목 체크

     3) 설치 후 시스템 환경변수 PATH에 Tesseract 설치 폴더 추가 (PATH 확인 방법?)

     4) 설치 후 시스템 환경 변수에 TESSDATA_PREFIX를 추가하고, 변수 값을 <Tesseract-DIR>\tessdata로 설정 (Optional, 안될 경우)

     5) <Tesseract-DIR>\tessdata\script 폴터에 있는 Hangul.traineddata, Hangul_vert.traineddata 파일을 <Tesseract-DIR>\tessdata\ 폴더로 복사

     6) Tesseract 파이썬 패키지 설치 (패키지 링크 - Installation 부분은 보면 사용 조건이 나와있다.) 아래는 명령 프롬포트 설치 지령

         pip intall pytesseract (관리자가 아닐 경우 뒤에 --user를 붙여줘야 한다)

         conda install -c conda-forge pytesseract (콘다 프롬포트 사용 시 관리자 권한으로 열어야 한다)

     7) 사용해보기: 패키지 import 후 pytesseract.image_to_string(grayscale image)

 

설치 마법사 첫 4 단계. 모두 다음 단계로 가도록 눌러주면 된다.
설치 마법사 5,6단계. 설치 설명 2) 옵션을 선택해주어야 한다. (글쓴이는 궁금해서 다른 언어도 추가적으로 더 받았다)
설치 마법사 마무리 단계. 설치가 완료되면 Next, Finish로 설치를 마무리한다.
시스템 환경 변수 PATH에 추가하는 방법
데이터 파일 옮기기
명령 프롬포트에 tesseract 입력 후 설치 확인 (--version을 붙이면 설치 버전도 확인 가능하다)
VS에서 import시 package로 인식하면 설치 완료
pytesseract를 사용한 명함 내용 인식 결과. 버전이 업데이트 됬음에도 불구하고 IT는 17으로 읽혀서 업데이트 부분은 확인해 보아야할 점이다.


인증 타임

저번 수업부터 배웠던 내용이 빌드업되어 명함 인식 프로그램까지 구현하는 것이 매우 신기했다. 오픈 소스 OCR이 제공되고 있다는 점도 처음 알았는데 이를 활용한 흥미로운 프로그램 아이디어가 무엇이 있을지 고민해 봐야겠다.

수업적으로는 Tesseract Pre-built 파일이 Window 운영체제 기반이기 때문에 MAC 시스템 사용자가 공부를 했다면 난감했을거 같다. 이에 대한 대응방안도 같이 제안해줬으면 좋았을거 같다.

7-6. 공부 인증 사진
7-7. 공부 인증 사진
7-8. 공부 인증 사진
7-9. 공부 인증 사진


#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

 

패스트캠퍼스(FastCampus) 강의 둘러보러 가기 

   

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.


 

+ Recent posts