티스토리 뷰

1. python glob를 활용해 사진 이름 통일하여 변경하기


여러 장의 사진을 파이썬에서 불러와서 다루려면 사진 파일명이 통일하는 것이 편하다.

1.jpg, 2.jpg 이런식으로 한번에 이름을 바꿀 수 있다면 편한데, 쉽지가 않다. 

우선 복잡한 사진이름을 윈도우 폴더 상에서 한번에 변경해보자.



이미지들을 전체 선택한 후, 마우스 오른쪽 마우스 - 이름바꾸기 또는 폴더 상단 이름 바꾸기를 선택한다.

하나의 사진을 선택한 후 , 이름을 selfie 로 변경한다.




selfie (1).jpg, selfie (2).jpg 처럼 사진에 번호가 매겨져서 수정된 것을 확인할 수 있다.



하지만 이렇게 사진 파일명을 변경하면 앞에 단어가 있어서 파이썬에서 다루기 조금 까다롭다. 

따라서 사진 파일 명에 숫자만 순차적으로 들어가도록 파이썬 glob함수를 활용해서 일괄적으로 변경해보도록 하겠다.




우선 해당 폴더에서 jupyer notebook을 실행하고 python을 연다.


1
2
3
4
5
6
7
8
import os
import glob
 
fpath = "E:\\selfie\\*.jpg"  #해당 폴더안에 jpg 확장자 모두 불러오기
for fpath in glob.glob(fpath):
    fpath_r = fpath.replace('selfie (','('#selfie (27).jpg => (27).jpg로 변경
    os.rename(fpath, fpath_r)
    
cs



해당 코드 실행 시 selfie(27).jpg 이미지가 (27).jpg로 변경된다.

selfie( 를 (로 변경한 코드다.


괄호를 없애려면, 

위 코드에서


1
2
3
4
5
6
7
8
9
fpath = "E:\\selfie\\*.jpg"  #해당 폴더안에 jpg 확장자 모두 불러오기
for fpath in glob.glob(fpath):
    fpath_r = fpath.replace('(',''#(27).jpg => 27).jpg로 변경
    os.rename(fpath, fpath_r)
 
fpath = "E:\\selfie\\*.jpg"  #해당 폴더안에 jpg 확장자 모두 불러오기
for fpath in glob.glob(fpath):
    fpath_r = fpath.replace(')',''#27).jpg => 27.jpg로 변경
    os.rename(fpath, fpath_r)
cs

요걸 추가로 실행해주면 된다.




럼 모든 v파일이름이 숫자.jpg로 변경된다.







<




출처 :: http://spicyblue.tistory.com/11





2. OpenCV로 사진의 눈과 얼굴 인식해서 크롭한 이미지 저장하기



파일명이 이쁘게 저장됐다.

그럼 이제 얼굴 인식해서 인식한 부분만 크롭을 해보자..


참고 사이트 : 

https://zetastring.tistory.com/307 (얼굴만 인식)

http://blog.naver.com/PostView.nhn?blogId=cosmosjs&logNo=220934659282&categoryNo=0&parentCategoryNo=56 (눈 인식후 크롭)





코드를 조금 수정해야 잘돌아감



1
2
3
4
import cv2
 
face_cascade = cv2.CascadeClassifier('C:\\Users\\CES\Anaconda3\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml')
eye_cascade = cv2.CascadeClassifier('C:\\Users\\CES\\Anaconda3\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml')
cs



이부분에서 에러가 제일 많이 뜨는데 처음에는 haarcascade xml파일을 해당 폴더에 그냥 넣고 돌렸더니 에러가 많이떴다.

해당 파일이 있는 경로를 찾아 넣는게 제일 낫다.

아 경로 사이사이에 \만 넣으면 안되고 \를 두개넣어줘야함 \\요렇게




3
4
5
6
7
 
imgnum = 45
img = cv2.imread(str(imgnum)+".jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3,5)
cs



이미지이름+.jpg로 하기 위해서 imgnum 이란 변수를 선언하고 아무 숫자나 넣었다.





4
5
6
7
8
9
10
11
12
13


for (x,y,w,h) in faces:
    cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0),2)
    cropped = img[y - int(h/4):y + h + int(h/4), x - int(w/4):x + w + int(w/4)]
    cv2.imwrite("cropped"+str(imgnum)+".png", cropped)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh),(0,255,0),2)
cs



요 코드까지 실행하면 해당 폴더에 얼굴을 인식한 후 인식된 얼굴을 크롭해 cropped45.png 이렇게 저장이 된다.






짜자잔~





<전체코드>



[얼굴 인식하고 크롭+눈포함]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
 
face_cascade = cv2.CascadeClassifier('C:\\Users\\CES\Anaconda3\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml')
eye_cascade = cv2.CascadeClassifier('C:\\Users\\CES\\Anaconda3\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml')
 
imgnum = 45
img = cv2.imread(str(imgnum)+".jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3,5)
 
for (x,y,w,h) in faces:
    cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0),2)
    cropped = img[y - int(h/4):y + h + int(h/4), x - int(w/4):x + w + int(w/4)]
    cv2.imwrite("cropped"+str(imgnum)+".png", cropped)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh),(0,255,0),2)
cs




[얼굴만 인식]


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
import cv2
import sys
 
imgnum = 34
image_file = (str(imgnum)+".jpg")
cascade_file = "./haarcascade_frontalface_alt.xml"
image = cv2.imread(image_file)
image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cascade = cv2.CascadeClassifier(cascade_file)
print(image_gs)
face_list = cascade.detectMultiScale(image_gs,
    scaleFactor=1.1,
    minNeighbors=1,
    minSize=(150,150))
if len(face_list) > 0:
    print(face_list)
    color = (00255)
    for face in face_list:
        x,y,w,h = face
        cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=8)
    cv2.imwrite("test-output.PNG", image)
else:
    print("no face")
 
 
 
cs




참고로 인식이 잘안되면 실행이 안되는 이미지가 생성이 되거나 아예 실행이 안된다.


이제 여러 이미지를 한번에 불러와서 for문 이용해서 1씩 증가시키고

파일을 한번에 인식하고 크롭하여 저장하는 일만 남았당

댓글