이미지 파일

- 이미지 학습시에 너무 용량이 큰 사진이여서 resizer.py를 이용하여 사진 크기를 줄이는 작업을 실행하였다.

- 작업 실행 후 확인하여 보니 사진 크기는 줄어 들었으나 .xml 파일의 box의 크기와 위치는 는 수정 되지 않고 그대로 유지되어 엉뚱한 곳에 있는 것을 확인하였다.
(왼쪽위의 resize된 사진과 위치 정보가 그대로인 box)
(아무 생각 없이 사진 올렸다 혹시 몰라 제품 샘플 사진은 지웠다.)

- resizer.py의 파일을 확인하면 opencv를 이용하여 사진의 크기를 줄이는 함수만 정의되어 있는 것을 확인 할 수 있다.
- 그래서 개인적으로 임의의 함수를 만들어 파일을 수정하여 주었다.

- 우선 파일의 내용을 불러오는 방법은 f.read() 방식을 이용하였다.
f.readlines()를 이용하여

f = open(filename, 'r+')
lines = f.readlines()
for line in lines:
    print(line)

위의 방식으로 수정을 하려 하였으나, 필요한 부분만 내용을 바꾸고 다시 저장하는 방식을 실현하는데에 좀 시간이 걸릴것 같아 그냥 무식하게 구현을 하였다.

data = f.read()
를 사용하여 파일 안의 내용 모두를 그냥 한 변수안에 선언하였다.

- 그 후 find()를 이용하여 필요한 부분을 잘라내고 필요한 값으로 변경하는 작업을 하였다.

box의 정보를 얻기위해 find()와 rfind()를 이용하여 box의 x,y 좌표값을 알아내고 정정할수 있게 하였다.

value = data[data.find('<xmin>')+6 : data.rfind('</xmin>')]
value = float(value) * 0.5
value = int(value)
data = data[ : data.find('<xmin>')+6] + str(value) + data[data.rfind('</xmin>') : ]

find와 rfind는 똑같은 기능을 하나 다른 점 하나는 rfind는 문자열 뒤에서부터 검색작업을 실시한다.

현재는 표시된 박스가 사진 하나당 하나씩 되어 있어 괜찮지만 나중에 2개 이상이 되면 rfind()를 이용한 방법은 문제가 생길 것으로 보인다.

- 수정이 다 끝나게 되면 write()를 이용하여 data를 저장한다.
f.write(data)


- 위의 작업을 진행하는 코드

- 수정한 resizer.py를 실행하여 보면 이상없이 같이 수정이 되는 것을 확인 할 수 있다.


- 추후 수정이 필요함
1. 박스가 2개 이상이 될 경우 필요한 부분을 잘라내는 과정에 문제가 생길 수 있으니 rfind() 대신 find()를 사용하게 해야함
2. rfind()대신 find()를 쓴다고 하여도 find()를 이용해 필요한 부분을 찾을 때 똑같은 자리만 읽어낼 가능성이 있을 것으로 보인다.
한줄씩 읽어내어 수정이 가능하게 하는 방법으로 바꾸어야 할 듯 하다.

댓글

이 블로그의 인기 게시물

python 에서 resize 이벤트 만들기

PLC와 아두이노 그리고 온도 센서를 이용하여 램프 점등

C언어로 로또 프로그램 만들기