Processor

【OpenCV】 카메라 출력

작성자 임베디드코리아 작성일26-04-16 00:35 조회48회 댓글0건
【OpenCV】 카메라 출력
◆ OpenCV를 이용하면 카메라 출력을 쉽게 사용할 수 있다.
◆ 카메라 출력은 카메라가 스트리밍 형태로 동작할 수 있을 때 사용한다.
  ▶ 즉, 저장된 이미지나 동영상 파일이 아니라 데이터를 실시간으로 받아오고
          분석해야 하는 경우 카메라를 이용해 데이터를 처리한다.
◆ 카메라를 사용해 데이터를 받아오기 때문에 연결된 카메라의 장치 번호를 통해 받아오며,
    사용중인 플랫폼에서 카메라에 대한 접근 권한이 허용되어야 한다.

---<< 함수 >>-----------------------------------------------------------------------------------------------
◈ capture = cv2.VideoCapture(0)
    :  내장 카메라 또는 외장 카메라에서 정보를 받아온다.

  ▶ cv2.VideoCapture(index) 로 카메라의 장치 번호(ID)와 연결한다.
      - index 는 카메라의 장치 번호를 의미한다.
  ▶ 노트북의 경우, 일반적으로 내장 카메라가 존재하므로 노트북 카메라의 장치 번호는 0이 된다.
  ▶ 카메라를 추가적으로 연결하여 외장 카메라를 사용하는 경우, 장치 번호가 1~n까지 순차적으로 할당된다.



---< 예제 : Camera_Read.py >--------------------------------------------
import cv2

capture = cv2.VideoCapture(0)
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

while cv2.waitKey(33) < 0:
    ret, frame = capture.read()
    cv2.imshow("VideoFrame", frame)

capture.release()
cv2.destroyAllWindows()
----------------------------------------------------------------------------------------------------------
◆ capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

  ▶ 카메라 속성 설정 메서드(capture.set)로 카메라의 속성을 설정한다.
  ▶ capture.set(propid, value)로 카메라의 속성(propid)과 값(value)을 설정할 수 있다.
  ▶ propid은 변경하려는 카메라 설정을 의미한다.
  ▶ value은 변경하려는 카메라 설정의 속성값을 의미한다.

◆ while cv2.waitKey(33) < 0:
      ret, frame = capture.read()
      cv2.imshow("VideoFrame", frame)

  ▶ 반복문(While)을 활용하여 카메라에서 프레임을 지속적으로 받아론다.
  ▶ 키 입력 대기 함수(cv2.waitkey)는 지정된 시간 동안 키 입력이 있을 때까지 프로그램을 지연시킨다.
  ▶ cv2.waitkey(delay)로 키 입력을 기다린다.
      - delay는 지연 시간을 의미한다.
      - 밀리초 단위의 시간 동안 키 입력을 기다린다.
      - waitKey의 리턴 값은 입력된 키의 아스키 코드 값을 반환한다.
  ▶ 만약 키 입력이 없을 경우 -1을 리턴합니다. 다음 구문을 실행한다.
  ▶ 위 예제는 어떤 키라도 입력되기 전까지 33ms마다 반복문을 실행한다.
      Tip : delay가 0일 경우, 지속적으로 키 입력을 검사하여 프레임이 넘어가지 않는다(무한대기).
      Tip : while cv2.waitKey(33) != ord('q'):으로 사용할 경우, q가 입력될 때 while문을 종료한다.

◆ cv2.imshow(winname, mat)
    : 윈도우 창의 제목(winname)과 이미지(mat)를 할당한다.

  ▶ winname은 문자열로 표시하며, 할당한 문자열이 변수와 비슷한 역할을 한다.
  ▶ mat은 이미지를 의미하며, 윈도우 창에 할당할 이미지를 의미한다.

◆ capture.release()
    : 메모리 해제 메서드(capture.relase)로 카메라 장치에서 받아온 메모리를 해제한다.

◆ cv2.destroyAllWindows()
    : 모든 윈도우 창을 닫는다.
  - 만약, 특정 윈도우 창만 닫는다면, cv2.destroyWindow(winname)으로 특정 윈도우 창만 닫을 수 있다.

---<< 예제 : Take_picture.py 카메라로 사진찍기>>------------------------------------------------------------------
import cv2

cap=cv2.VideoCapture(0)                        # 0번 카메라에 연결

if cap.isOpened():                 
    while True:
        ret, img=cap.read()                    # 카메라를 읽습니다
        if ret:
            cv2.imshow('camera',img)            # 이미지를 표시합니다
            if cv2.waitKey(10) != -1:          # 10ms동안 키 입력을 대기
                cv2.imwrite('photo.jpg', img)  # 사진을 저장
                break                          # 키가 입력되면 중지합니다

else:
    print("can't open camera")
cap.release()
cv2.destroyAllWindows()
---------------------------------------------------------------------------------------------------------

---<< 예제 :  Record_video.py 카메라로 녹화하기>>------------------------------------------------------------------

import cv2

cap = cv2.VideoCapture(0)
if cap.isOpened:
    file_path = './rec.avi'
    fps =
    fourcc = cv2.VideoWriter_fourcc(*'DIVX')            # 인코딩 포맷
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    size = (int(width), int (height))                  # 프레임 크기
   
    out = cv2.VideoWriter(file_path, fourcc, fps, size)
    while True:
        ret, img = cap.read()
        if ret:
            cv2.imshow('camera-recording', img)
            out.write(img)                            # 화면 저장
            if cv2.waitKey(int(1000/fps)) != -1:
                break
        else:
            print('no file!')
            break
    out.release()                                      # 종료

else:
    print("Can`t open camera!")

cap.release()
cv2.destroyAllWindows()
-------------------------------------------------------------------------------------------