openCV_part (1)
이번 포스팅은 open cv의 주요 기능을 python을 통해서 코드 및 설명하는 시간이 되겠습니다~!
사실,, 중간고사가 19일 토요일 11시여서,,ㅋㅋㅋ 겸사겸사 공부할겸 쓰는거인데 쉽지않네용 그래도 꾸준히 해보겠습니다!!
(제 생각 및 개념을 기준으로 작성했습니다.)
동영상: 일련의 정지 영상을 압축하여 파일로 저장한 형태
프레임(Frame): 저장되어 있는 일련의 정지영상
이때 동영상은 여러장의 프레임이 합쳐진 느낌으로 이해하면 좋을 것 같아요
동영상을 처리하는 작업순서로는
프레임 추출, 이후 각각의 프레임에 영상 처리 기법을 적용하면 됨.
카메라와 동영상 파일을 다루는 작업은 연속적인 프레임 영상을 받아와서 처리를 합니다!
OpenCV에서는 VideoCapure라는 하나의 클래스를 이용하는데
이때 카메라 혹은 동영상 파일로 부터 정지영상 프레임을 받아올 수 있어요!
C++의 경우에는 open 함수를 써야하지만 python을 사용하기 때문에 VideoCapture()만 사용해 보려고 합니다.
VideoCapture()에서 0번은 기기에 연결된 카메라의 연결을 의미하는데 저는 맥북을 사용하고있어서 맥북기준 0번이
해당 노트북 카메라에 연결되는 번호입니다.
또한 해당하는 비디오에 대해 제대로 불러왔는지 확인을 하려고 cap.isOpend()함수를 써서 확인했습니다!
이후 cap.get() 함수에 WIDTH, HEIGHT를 통해 결과를 보게되면 이때 각 너비와 높이의 픽셀 수를 출력해 줍니다!
그럼 너비의 경우 1280개의 픽셀, 높이의 경우 720개의 픽셀인걸 느낌쓰로 알 수 있어요!
filename인자에는 당연히 .avi, .mpg, .mp4 등의 확장자를 갖는 파일을 넣어야겠죠? 저흰 영상을 읽기 떄문에 ..ㅎㅎ
다음은 앞서 진행한 카메라를 읽어드린 뒤에 반전된 영상을 직접 화면으로 나타내는 실습을 진행 해보겠습니다.
다음의 경우 카메라에 대한 정보를 우선 VideoCapture(0)로 설정 해준 이후
cap.read() 함수를 통해 카메라 혹은 동영상 파일로부터 다음 프레임을 읽어올게요
또한 ret를 통해 제대로 프레임을 받아 왔는지도 확인해 보겠습니다.
이후 ~frame을 통해 해당 프레임을 255 - frame과 동일한 의미를 띄는 inverse를 통해 반전해 본이후
waitKey()를통해 키입력 대기시간을 10초로 저장하거나, ESC인 경우 저 while문을 벗어나 볼게요!
놀랍게도 실습을 진행하다가 0번이 노트북 카메라가 아닌 맥북과 아이폰 연동 상태에서는
아이폰이 먼저 열리게 되는 경우가 생겼네요,, 역시 연동하나는 애플이 짱인거 같습니다ㅋㅋㅋ
혼자 실습하다가 깜짝 놀랐네요 ㅋㅋㅋ;
다음과 같이 카메라 0번이 켜져있는 상태에서 계속해서 프레임에 대한 정보를 넘겨주며 그 프레임 값에 화면 반전을 나타낸이후
cv.imshow() 를 통해서 일반 출력영상과 반전영상 두개가 나오게 됩니다! ( 사진의 경우 겹쳐져있어서 하나만 보임)
다음은 get함수를 통해 얻어올 수 있는 여러 정보입니다
저는 주로 WIDTH, HEIGHT 뭐 등등을 쓸 것같아요! (뭘 쓸지 아직 모름)
다음은 동영상 파일을 처리해야 하는데
대부분의 동영상 파일은 코덱(codec)을 이용해 압축된 형태로 저장한다고 하는데
이때 코덱이란 코더와 디코더의 합성어로 비디오와 오디오 스트림을 압축하고 해제하는 기술이라고 하네요!
사용의 목적으로는 데이터를 더 작은 용량으로 변환해 저장 및 전송할때 사용하여 파일크기를 줄여 효율성을 높여준다고 합니다!
마찬가지로 VideoCapture 클래스를 통해 동영상 파일을 불러오면 됩니다!
이때 한가지 알아야 하는 점은 동영상의 경우 초당 프레임 수값을 가지고 있어서 FPS값을 고려하지 않으면
동영상이 너무 빨리 재생되거나, 느리게 재생이 된다고 합니다. 따라서 cap.get함수의 cv.CAP_PROP_FPS를 통해서
프레임 수를 가져오고 매프레임 사이의 간격을 계산하면 좀 더 자연스럽게 화면이 나오게 됩니다!
너무 말이 많았으니 코드를 통해 설명해 보겠습니다.
우선 제가 읽고자 하는 비디오를 cv.VideoCapture(‘원하는경로’)로 읽어드리고,
각 너비와 높이를 읽어드리고, 프레임을 읽어왔습니다!
이후 VideoWriter_fourcc 함수를 통해 4-문자코드로 구성된 코덱을 표현하는 문제로 생성해 줍니다!
+ fourcc 함수를 통해 정수값으로도 생성할 수 있습니다.
VideoWriter(‘경로’, force, 프레임값, (w, h))로 설정하여 나가는 비디오를 설정해 줍니다!
————————여기 까지가 동영상 파일 저장하는 방법이구여 ———————————
이후 아까 읽어드린 cap을 통해 프레임을 가지고 반전된 영상과 함께 출력해주는 코드를 입력하여
frame 값과 반전된 frame 값을 동시에 출력해 주겠습니다!
이때 delay를 써주는 이유는 앞서 말한 것과 같이 프레임을 한장 한장씩 옮겨주며, 자연스러운 출력을 위해
넣어주는것이라고 생각했습니다. (아니라면 말씀 부탁드립니다 ㅎㅎ)
imshow로 각각 비교해 본다면 다음과 같은 결과가 나옵니다!
피드백 필요한게 있다면 언제든지 말씀 부탁드립니다.
'컴퓨터 비전' 카테고리의 다른 글
파이썬으로 배우는 openCV (2) (도형, 텍스트 그리기) (3) | 2024.10.13 |
---|---|
파이썬을 이용한 openCV and Matrix (0) | 2024.10.12 |
컴퓨터 비전 개요 (9) | 2024.10.11 |