목표
1. Python에서 OpenCV 모델 가져오기
2. 이미지 로드
3. 이미지 표시
4. 이미지 저장
5. 이미지 치수 가져오기
저번에 github에 업로드했던 OpenCV의 첫 챕터의 시작
- Python에서 OpenCV 모델 가져오기
개방형 CV 기능을 사용하기 전에CV를 라이브러리를 가져와야한다.
import cv2를 입력하고 실행하고나서 실제로 잘 설치가 됐는지 cv2의 version을 출력 해본다.
4.8.0 으로 정상적으로 설치가 됐다.
다음은 EC2에 업로드돼있는 이미지 파일을 다운로드
다운로드를 실행하니까 aws EC2 서버가 닫혀있어서 자료에 나와있는 Google Drive에 직접 다운로드한다.
--2024-04-03 11:18:56-- https://moderncomputervision.s3.eu-west-2.amazonaws.com/images.zip
Resolving moderncomputervision.s3.eu-west-2.amazonaws.com (moderncomputervision.s3.eu-west-2.amazonaws.com)... 52.95.148.138, 3.5.244.113, 52.95.149.82, ...
Connecting to moderncomputervision.s3.eu-west-2.amazonaws.com (moderncomputervision.s3.eu-west-2.amazonaws.com)|52.95.148.138|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2024-04-03 11:18:56 ERROR 403: Forbidden.
unzip: cannot find or open images.zip, images.zip.zip or images.zip.ZIP.
다운로드 후 압축 해제 한 파일이 images 폴더안에 많은 jpg,jpeg 의이미지 파일들이 생겼다.
- 이미지 로드
다운로드하고 나서 이미지를 load할건데 images 폴더안에 castara라는 이미지를 오픈할것이다.
우선 castara의 이미지는 아래와 같다.
- 이미지 표시
이제 image라는 변수 안에 위의 사진을 담았는데 이걸 컴퓨터가 이해하게 하기 위해 픽셀단위로 나눠야한다.
픽셀로 표현하기위해 이미지를 우선 출력을 해야하는데, plt의 imshow, show 를 사용을 했다.
그런데 여기서 안에 dv2.cvtColor, BGR2RGB 이런것들이 뭘까해서 안에 OpenCV 관련된 내용을 삭제해봤다.
삭제를 하게 되면 원본과 색상이 달라지는것을 확인할수있다.
여기서 이유는
이미지를 imshow() 함수에 직접 전달했는데, 이 경우 이미지의 색상 체계가 기본적으로 BGR(BLUE-GREEN-RED) 형식으로 해석된다.
그러나 Matplotlib은 기본적으로 RGB(RED-GREEN-BLUE) 형식을 사용하기 때문에, 이러한 차이가 색상을 이상하게 보이게 할 수 있다.
cv2.cvtColor() 함수를 사용하여 이미지의 색상 체계를 BGR에서 RGB로 변환한 후에 Matplotlib에 전달한다. 따라서 이미지가 올바른 색상으로 표시된다.
Matplotlib으로 이미지를 표시할 때는 일반적으로 이미지의 색상 체계를 RGB로 변환하는 것이 좋아보인다.
하지만 매번 imshow 안에 COLOR... BRG2RGB 를 매번 달아주기에는 번거롭기 때문에 function을 하나 정의해준다.
그러고 imshow에 맞게 작성을 해주면 정상적으로 출력이된다.
- 이미지 저장
이미지를 담고 출력하고 까지 했으니 이제 이미지를 저장해보자.
파일이 생겼다.
확인해보면 알던 그 맛이다.
PNG로 저장한다 해도 된다.
- 이미지 치수 가져오기
2D 이미지를 확인했으니, 이제 이미지 면적을 확인해보는데,
이미지 차원으로 들어가기 전에 이미지가 어떻게 생성되고 배열에 저장되는지 확인해보자.
이미지는 BGR과 RGB가 있다는걸 알아야한다.
NEO LED를 제어했을때 BGR를 봣을때 신버전 구버전의 느낌으로 RGB가 가장 최신것이라 대중적으로 RGB를 사용한다고 느꼇는데, 얼추 비슷했다.
옛날의 비디오 캡처 카드나 디지털 카메라, 그리고 일부 컴퓨터 비전 라이브러리는 BGR 순서를 사용했고, 많은 그래픽 디스플레이와 웹 표준은 RGB 순서를 사용하게 되면서 각자 기술적인 요인으로 인해 갈라지게 됐고, 컴퓨터를 어려서 부터 많이 접한 사람들이 흔히 RGB를 많이 보게된 이유였다.
모든 색을 표현을 할땐 빨강, 초록, 파랑 세가지 색상이 필요하다.
위에 나온 그림처럼 RGB가 각 좌표에 어떻게 구성돼있는가를 저장한것이 이미지이다.
그래서 내 이미지를 numpy를 통해 shape를 체크를 해보면
아래가 나오게 된다.
(1280, 960, 3)
첫번째 1280이 높이이고, 960이 넓이, 3이 RGB 세개가 있다는 뜻이다.
이렇게 보니 위에 큐브같이 생긴것이 어떻게 생긴건지 이해가 된다.
지금 사진을 보면 (0.0)의 좌표에 RGB(34,145,234) 라는 색상이 있다는 뜻이고 이 색상을 RGB Color Hex를 통해 확인해보면 아래와 같은 색상을 가진다는 뜻이다.
이렇게 나눠서 출력을 할수도있다, 이렇게 되면 나중에 가로 세로 길이를 구하고 곱할때와 같이 크기를 결정할때 사용할수있다.
이거를 사용자에게 표현한 것처럼 수정을 해보면
이렇게 출력을 하면 사용자에게 image라는 것이 어떤 크기에 어떤 표현방식으로 형성돼있는지 알려줄수있다.