본문 바로가기

딥러닝/영상 처리

cv2 카메라 영상처리

  • OpenCV에서 카메라(웹캠)로부터 영상을 전달받아 처리하기 위해서는 VideoCapture 클래스를 사용한다. VideoCapture 클래스의 인스턴스를 생성할 때, 컴퓨터에 카메라가 여러 개 있을 수 있으므로, 어떤 카메라를 사용할 지를 카메라 아이디로 전달하는데, 일반적으로 0 을 쓰면 첫번째 카메라(디폴트 카메라)를 사용하게 된다. 만약 두번째 카메라를 사용하려면 1을, 세번째 카메라를 사용하려면 2를 사용한다.
  • VideoCapture 클래스 인스턴스를 생성한 후, VideoCapture 클래스의 read() 메서드를 호출하여 카메라 이미지(프레임)을 가져올 수 있다. read() 메서드는 2개의 값을 리턴하는데, 첫번째는 프레임을 성공적으로 읽었는지를 표시하고, 두번째는 프레임 자체를 리턴한다. 프레임을 화면에 출력하기 위해서는 cv2.imshow() 함수를 사용하면 되는데, 이 함수의 첫번째 파라미터로 윈도우 창제목을 적고, 두번째 파라미터에 카메라에서 전달받을 프레임을 넣으면 된다. VideoCapture 클래스의 isOpened() 메서드는 카메라 영상 캡쳐가 초기화되었는지 여부를 리턴하며, 카메라 사용을 종료하기 위해서는 release() 메서드를 사용하면 된다.
cap = cv2.VideoCapture(0)
while cap.isOpened():
    #카메라 프레임 읽기
    succes, frame =cap.read()
    if succes:
        #프레임 출력
        cv2.imshow('Camara window', frame)

        #esc를 누르면 종료
        key = cv2.waitKey(1) & 0xFF
        if (key == 27):
            break
cap.release()
cv2.destroyAllWindows()

1. 동영상 파일 읽어오기

import cv2

#cap = cv2.VideoCapture(0)   # 0: default camera
cap = cv2.VideoCapture("test_img.mp4") #동영상 파일에서 읽기

while cap.isOpened():
    # 카메라 프레임 읽기
    success, frame = cap.read()
    if success:
        # 프레임 출력
        cv2.imshow('Camera Window', frame)

        # ESC를 누르면 종료
        key = cv2.waitKey(1) & 0xFF
        if (key == 27): 
            break

cap.release()
cv2.destroyAllWindows()

2. 웹캠으로 촬영한 영상 avi파일로 저장

import cv2

cap= cv2.VideoCapture(0);
width= cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print('size: {0} x {1}'.format(width, height))

# 영상저장을위한  VideoWriter 인스턴스 생성
fourcc = cv2.VideoWriter_fourcc(*'XVID')

writer =cv2.VideoWriter('test.avi', fourcc, 24, (int(width), int(height)))

while cap.isOpened():
    success, frame= cap.read()
    if success:
        writer.write(frame) # 프레임 저장
        cv2.imshow('video window', frame)

        if cv2.waitKey(1) & 0xFF ==ord('q'):
            break
    else:
        break
cap.release()
writer.release()
cv2.destroyAllWindows()

3. avi파일에 frame 처리후 같은 경로에 다른이름으로 저장

import cv2

video_input_path = 'Night_Day_Chase.mp4'

video_output_path = 'Night_Day_Chase_out.mp4'



cap=cv2.VideoCapture(0)

codec=cv2.VideoWriter_fourcc(*'XVID')

vid_size=(round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

vid_fps=cap.get(cv2.CAP_PROP_FPS)

vid_writer=cv2.VideoWriter(video_output_path,codec,vid_fps,vid_size)

frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('총 Frame 갯수:', frame_cnt, 'FPS:', round(vid_fps), 'Frame 크기:', vid_size)


# 프레임 하나씩 읽고 쓰기
import time

green_color=(0, 255, 0)
red_color=(0, 0, 255)

start = time.time()
index=0
while True:
    hasFrame, img_frame = cap.read()
    if not hasFrame:
        print('더 이상 처리할 frame이 없습니다.')
        break
    index += 1
    print('frame :', index, '처리 완료')

    cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2)
    caption = "frame:{}".format(index)
    cv2.putText(img_frame, caption, (300, 95), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 1)

    vid_writer.write(img_frame)

print('write 완료 시간:', round(time.time()-start,4))
vid_writer.release()
cap.release()

4. 웹캠으로 얼굴인식후 몇명인지 카운트

import cv2

cap =cv2.VideoCapture(0)

#카메라 속성 설정
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 460)

#얼굴인식 . 검출 관력 모델 파일
#
casecade_xml ='haarcascade_frontalface_default.xml' 

#모델 파일 불러오기
face_cascade=cv2.CascadeClassifier(casecade_xml)

#실기간 영상에서 얼굴 검출
def videoDetector(cap, face_cascade):
    faces_cnt= 0
    # 카메라의 프레임 지속적으로 받아오기
    while True:
        #cap.read() 프레임 읽기
        #ret 은 카메러 상태이며 정상 = True,  비정상 = False
        #frame  은 현재 시점의 프레임
        ret, frame = cap.read()



        # #  숫자키 1 입력시 좌우 대칭 변경
        # if cv2.waitKey(1) == 49 :
        #     # 대칭 처리 
        #     # value < 0 상하좌우 대칭
        #     # value = 0 상하 대칭
        #     # value > 0  좌우 대칭
        #     frame = cv2.flip(frame, 1)
        frame = cv2.flip(frame,1) # 좌우대칭 변경

        #영상 이미지를 그레이스케일로 이진화 (검은색 횐색 {True, False})
        gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        #영상 이미지에서 얼굴 검출하기
        #GRAY            #대상이미지행렬
        #,scaleFactor = 1.1  #이미지 피라미드 규모인자 크기(Scale Factor)
        # ,minNeighbors = 5        # 최종 검출영역 확정용 이웃 사각형의 갯수 설정
        faces= face_cascade.detectMultiScale(gray, 1.1, 5)

        #화면에 검출된 얼굴수가 변경될떄마다 출력
        if faces_cnt != len(faces):
            faces_cnt= len(faces)
            if faces_cnt !=0:
                print('현재 검출된 얼굴의 수:',str(faces_cnt))
        # 검출된 안면의 사각형 그리기
        #cv2.rectangle(영상이미지, (X1,Y1),(x2,Y2),(B,G,R),두께, 선형타입)
        #(X1, Y1)죄측 상단 모서리, (X2, X2) 우측 하단 모서리
        if len(faces):
            for x,y,w,h in faces :
                cv2.rectangle(frame,(x,y), (x+w,y+h),(255,255,255),2,cv2.LINE_4)

        #윈도우창 (title, 프레임이미지)
        cv2.imshow('VideoFrame', frame)

        # cv2.waitKey(1) 1은 밀리세컨으로 키입력값 대기 지연시간이다 esc로 멈춤
        if cv2.waitKey(1) ==27:
            cap.release()              #메모리 해제
            cv2.destroyAllWindows()    #모든창 제거, 특정 창 만들을 경우('VideoFrame')
            break;

#실시간 영상에서 얼굴 검출 호출
videoDetector(cap, face_cascade)

'딥러닝 > 영상 처리' 카테고리의 다른 글

딥러닝 이미지 처리  (0) 2022.10.06