woonadz :)

차량 번호판 가상 데이터 만들기 - 이미지 2차원 회전 본문

프로젝트/인공지능 개발(미완성)

차량 번호판 가상 데이터 만들기 - 이미지 2차원 회전

C_scorch 2021. 11. 25. 03:37
반응형

개발 환경 : 파이썬 3.9.2

 

먼저 번호판의 문자를 이름으로 저장한 가상 이미지 데이터 파일들의 제목을 리스트로 옮기는 작업을 구상했다. 

 

이미지 2차원 회전 코드

import os
import cv2
import random
import numpy as np
import imutils

file_list = os.listdir('C:\\Users\\pc\\OneDrive\\문서\\인공지능\\가상 번호판 PNG 파일') #가상 번호판 파일의 이름을 리스트로 옮김

file_name = []
for file in file_list:
    n_word = file[0:-4] #이름만 옮겨지는 것이 아니기에 (.png 와 같은 확장자가 따라옴) 번호판 문자열만 슬라이싱해주기
    file_name.append(n_word)

for i in range(len(file_name)): #가상 번호판을 모두 2차원 회전해줄 것이기 때문에
    img_array = np.fromfile('C:\\Users\\pc\\OneDrive\\문서\\인공지능\\가상 번호판 PNG 파일\\'+file_list[i], np.uint8)
    img = cv2.imdecode(img_array, cv2.IMREAD_COLOR) //imread와 같은 역할
    height, width, channel = img.shape #높이, 넓이, 채널(색상 정보)
    a = random.randint(-60,60) #2차원 회전을 위한 각도를 -60에서 60 사이에 수 랜덤 선택
    test_rol = cv2.getRotationMatrix2D((width/2, height/2), a, 1) #이미지 중심, 각도
    test_new = imutils.rotate_bound(img,a) #이미지 회전
    #cv2.imshow("Rotated (Correct)", test_new) 만약 윈도우 창을 통해 미리보고 싶다면 입력하기
    #cv2.waitKey(0)
    file_name[i] = file_name[i] + "_" + str(i)
    cv2.imwrite(file_name[i]+'.png', test_new) #저장

 

개발하며 만난 오류와 해결방안들

(1) 

기존 코드

test_img_read = cv2.imread(file_list[i],cv2.IMREAD_COLOR)
print(test_img_read)
height, width, channel = test_img_read.shape

cv2.error: OpenCV(4.5.1) error: (-2:Unspecified error) could not find a writer for the specified extension in function 'cv::imwrite_'

이러한 에러가 계속해서 발생했다. print 명령어로 이미지를 출력해본 이유는 변수 속에 이미지가 제대로 담겼는지 확인해보기 위해서다. print 명령어로 출력해보자 None이 출력되었고 이미지가 변수 안에 담기지않았다는 것을 알 수 있었다.

경로가 잘 설정되었음에도 오류가 발생해 구글링을 해보았다. imread와 imwrite 함수를 사용 할 경우 한글 경로 인식 문제가 발생한다고 한다. 그렇기에 아래처럼 코드를 바꿔주었다.

img_array = np.fromfile('C:\\Users\\pc\\OneDrive\\문서\\인공지능\\가상 번호판 PNG 파일\\'+file_list[i], np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
height, width, channel = img.shape

https://bskyvision.com/1078 자세한 내용은 이 블로그를 참조하면 된다.

 

(2)

저장의 문제

코드를 작성한대로라면 총 50개의 2차원 회전한 이미지가 새롭게 저장되어야한다. 하지만 코드를 한번 실행할 때마다 폴더 안에 이미지는 4개밖에 저장되지 않았다.

쉬운 문제라고 생각해 계속해서 고민해봤지만 아직도 해결하지 못하였다.

 

(3)

이미지 잘림 문제

가장 처음 코드를 작성하였을 때 단순히 회전만 생각했었다. 이미지를 회전 한 후 결과를 보니 기존 이미지 배경 내에서 회전을 했기 때문에 이미지가 잘린 것을 확인 할 수 있었다. 역시 구글링을 해보았다.

import imutils 모듈로 해결이 가능했다. 

test_new = imutils.rotate_bound(img,a)

코드를 추구함으로써 이미지 잘림 없이 회전할 수 있었다.

 

발전시켜야 할 문제

1. 이미지가 회전하였을 때 남는 배경의 문제(합성할 경우 문제가 생김)

 

 

- 3차원 회전에 대한 코드를 완성하지 못하였음. 따라서 데이터 학습에 대한 문제가 생김.

 

반응형