Open Source Computer Vision의 약자로 영상 처리를 위한 오픈소스 라이브러리이다. 특히 OpenCV는 BSD 라이센스로 배포되어 학술분야 뿐만아니라 상업적인 용도로 사용하는 경우에도 무료로 사용이 가능하다. 또한 해당 소프트웨어는 아무나 개작할 수 있으며, 수정된 소프트웨어를 제한 없이 배포할 수 있다. 즉, OpenCV를 이용하여 제품을 만들어서 수익이 나도 라이센스 비용 지불하지 않아도 되며, 심지어 소스 코드를 공개하지 않아도 된다. 다만, OpenCV를 사용해서 구현된 소프트웨어는 OpenCV를 사용했다는 사실을 반드시 기재해야 한다.
C++, C, Python 및 Java와 같은 다양한 인터페이스를 지원하며 Windows, Linux, Mac OS, iOS 및 Android같은 다양한 OS를 지원하며, 머신러닝 프레임워크를 내장하고 있다.
1.x 버전은 C언어로 2.x 버전은 C++로 작성되었다. 또한 3.x 버전은 라이브러리를 통합하였으며, 4.x 버전 부터는 딥러닝 패키지를 추가하였다.

OpenCV는 좌상단을 기준으로 (0,0)부터 우하단(319, 239) 방향으로 증가하는 형태의 좌표계를 사용한다. 또한 이미지 데이터를 numpy array 타입으로 다루며, 인덱스는 행, 열 순서로 사용된다. 특히 색상의 경우 BGR 순서로 정의하기 때문에 주의하여야 한다.
색상 혹은 명도를 기준으로 하는 색 표현 방법으로 객체를 분할해 내기가 용이하여 이미지 처리에 많이 사용되는 방법 중 하나이다.
H(hue)는 색상, S(saturation)은 채도, 그리고 V(value)는 명도를 의미하며 이 세 가지를 조합하여 색상을 표현한다. 색상은 노란색, 빨간색, 그리고 파란색 등의 색의 질을 나타낸다. 채도는 선명도를 나타내며 원색에 가까울수록 채도가 증가한다. 명도는 밝기를 의미하며, 높을수록 백색, 낮을수록 흑색에 가까워진다. 특히 명도는 도로와 차선을 구분하는데 응용될 수 있다. 이는 직관적으로 생각할 수 있는데 도로는 흑색, 차선은 상대적으로 밝은 색으로 되어있기 때문이다.

import cv2
import numpy as np
img = cv2.imread('img.png')
hsv = cv2.cvtColor(img, cv2_COLOR_BGR2HSV)
lower_white = np.array(0,0,150)
upper_white = np.array(179,255,255)
# H: 0~179, S: 0~255, V: 150~255
mask = cv2.inRange(hsv, lower_white, upper_white)
# 위에서 정의한 영역에 포함되면, 255(흰색)로 그 외의 영역은 0(검은색)으로 치환한다.
cv2.imshow("line", img)
cv2.waitKey(100000)
cv2.line(img, start, end, color, thickness)
img = cv2.line(img, (0,0), (511,511), (255,0,0), 5)
cv2.rectangle(img, start, end, color, thickness)
import cv2
img = cv2.imread("black.png", cv2.IMREAD_COLOR)
img = cv2.rectangle(img, (100,100), (300,400), (0,255,0), 3)
cv2.imshow("black", img)
cv2.waitKey(100000)
cv2.imwrite("new_black.png", img)
cv2.circle(img, centor, radius, color, thickness)
img = cv2.circle(img, (300,400), 100, (0,0,255), 2)
cv2.putText(img, text, org, font, fontScale, color)
img = cv2.putText(img, "Text", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 4, (255,255,255))
이미지 화면 내에서 관심영역을 설정하는 방법이다.

동영상은 하나의 이미지를 연속적을 표현하는 것이다. 영상의 한 장의 이미지는 프레임(frame)이라고 하며, 초당 몇장의 이미지를 보여주는지에 대한 의미로 FPS(Frame Per Second)가 있다.
import cv2
# 파일로 부터 영상을 가져오는 방법
vid = cv2.VideoCapture("video.avi")
# 카메라로 부터 영상을 가져오는 방법
vid = cv2.VideoCapture(0)
while True:
ret, frame = vid.read()
if net ret:
break
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if ret:
cv2.imshow("vedio", frame)
if cv2.waitKey("video", frame)
break
vid.release()
cv2.destroyAllwindows()
Gaussian Blur는 특정 크기를 갖는 윈도우를 두고, 이 윈도우 위에 포함되는 값을 모두 더하여 산술평균을 구하고 윈도우가 위치한 영역의 값들을 산술평균의 값으로 바꿔준다. 즉, 인접한 픽셀들의 크기를 같은 수치로 바꿔주는 것이다. 윈도우의 크기가 클수록 이미지가 전반적으로 부드러워 진다.
