참고 : https://opencv.org/
오픈 소스 컴퓨터 비전 라이브러리 중 하나로 크로스플랫폼과 실시간 이미지 프로세싱에 중점을 둔 라이브러리이다.
본래 C 언어만 지원했지만 2.x 버전부터 스마트포인터 스타일을 활용하여 C++을 지원하기 시작했고, 현재는 C++11을 공식으로 채택하고 있다. 과거 C 스타일(IplImage)의 코드는 현재 레거시로만 남아 있지만 실행해보면 여전히 잘 돌아간다. Python을 공식적으로 지원한 이래 현재는 관련 라이브러리를 검색하면 C++보다 파이썬이 먼저 나올 만큼 C++을 직접 활용하기보다 파이썬으로 랩핑하여 사용하는 추세이다. 특히 딥러닝 관련 연구가 파이썬으로 진행되면서 파이썬 라이브러리의 사용 빈도가 더욱 늘었다. 픽셀단위의 접근이 빈번하게 이루어진다면 당연히 C++을 써야겠지만, 단순한 매트릭스 연산에 머무는 경우 numpy와 cv2의 궁합을 이용하면 C++에 비해 월등히 편리하다. 버전별로 사용방법과 코딩 스타일이 달라지는 C++에 비해 라이브러리 인터페이스가 안정적인 것도 파이썬만의 장점이다. 그 밖에 C#은 다양한 랩핑 라이브러리가 있지만 OpenCVSharp이 많이 쓰인다. iOS와 Android도 지원하므로 사실상 Java와 Objective-C도 지원하는 셈이다. MATLAB 등의 프로그램들과 연계도 가능하다.
영상 관련 라이브러리로서 사실상 표준의 지위를 가지고 있다. 조금이라도 영상처리가 들어간다면 필수적으로 사용하게 되는 라이브러리. OpenCV 이전에는 MIL 등 상업용 라이브러리를 많이 사용했으나 OpenCV 이후로는 웬만큼 특수한 상황이 아니면 OpenCV만으로도 원하는 영상 처리가 가능하다. 기능이 방대하기 때문에 OpenCV에 있는 것만 다 쓸 줄 알아도 영상처리/머신러닝의 고수 반열에 속하게 된다. 조금 써봤다는 사람은 많지만 다 써봤다는 사람은 별로 없으며, 최신 버전의 라이브러리를 바짝 따라가는 사람은 영상 전공자 중에서도 드물다.
인공지능과 다른 분야들 컴퓨터비전 이런 등등에서 서로 흡수 가고 있다. 알아둬야한다.
인공지능 기본은 텍스트를 인식하는 것 word count, 알고리즘을 알고 응용하는 것이다.
참고 : https://hello-bryan.tistory.com/124
참고2 : https://hoony-gunputer.tistory.com/entry/OpenCv-python-%EA%B8%B0%EC%B4%88-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%9D%BD%EA%B3%A0-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0
참고3 : https://opencv-python.readthedocs.io/en/latest/doc/01.imageStart/imageStart.html
conda install -c conda-forge opencv
pip install opencv-python
이미지 불러오기
import cv2
fname = 'pengsu.jpg'
original = cv2.imread(fname, cv2.IMREAD_COLOR)
gray = cv2.imread(fname, cv2.IMREAD_GRAYSCALE)
unchange = cv2.imread(fname, cv2.IMREAD_UNCHANGED)
cv2.imshow('Original', original)
cv2.imshow('Gray', gray)
cv2.imshow('Unchange', unchange)
cv2.waitKey(0)
cv2.destroyAllWindows()
이미지 다른이름으로 저장하기
cv2.imwrite('lenagray.png', gray)
import cv2
fname = 'pengsu.jpg'
gray = cv2.imread(fname, cv2.IMREAD_GRAYSCALE)
cv2.imshow('Gray', gray)
cv2.imwrite('pengsugray.jpg', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
cvWirte |
---|
이미지 크기 자르기
참고 :
import cv2
from sympy.physics.quantum.pauli import SigmaX
fname = 'image/pengsu.png'
gray = cv2.imread(fname, cv2.IMREAD_GRAYSCALE)
cv2.imshow('Gray', gray)
# numpy 배열이었다 ':'로 구분되는 걸 보니
crop = gray[100:300, 100:300]
cv2.imshow('Crop', crop)
cv2.waitKey(0)
cv2.destroyAllWindows()
이미지 각도 변경하기
참고 : https://enjoyimageprocessing.tistory.com/entry/OpenCV%EC%9D%98-%EA%B8%B0%EC%B4%88-Image-ProcessingTransition-Rotation?category=737464
import cv2
import numpy as np
fname = 'image/pengsu.png'
gray = cv2.imread(fname, cv2.IMREAD_GRAYSCALE)
cv2.imshow('Gray', gray)
M = np.float32([[0.7, -0.7, 0], [0.7, 0.7, 0]])
shifted = cv2.warpAffine(gray, M, (gray.shape[1], gray.shape[0]))
cv2.imshow("Shifted Down and Right", shifted)
cv2.waitKey(0)
cv2.destroyAllWindows()
imutils 패키지
pip install imutils
imutils 이용하여 위치이동, 회전
import cv2
import numpy as np
import imutils
fname = 'image/pengsu.png'
gray = cv2.imread(fname, cv2.IMREAD_GRAYSCALE)
cv2.imshow('Gray', gray)
# X 방향으로 50, Y 방향으로 50 이동할때
shifted = imutils.translate(gray, 50, 50) # translate는 이해하기 쉬운 용어
cv2.imshow("Shifted Down and Right", shifted)
rotated = imutils.rotate(gray, 45)
cv2.imshow("Rotated by 180 Degrees", rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
imutils 이미지 축소
검색어 : opencv imutils 축소
참고 : https://webnautes.tistory.com/1251
import cv2
import numpy as np
import imutils
fname = 'image/pengsu.png'
gray = cv2.imread(fname, cv2.IMREAD_GRAYSCALE)
cv2.imshow('Gray', gray)
# 2배 이미지
img_result = cv2.resize(gray, None, fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
cv2.imshow("x2", img_result)
cv2.waitKey(0)
cv2.destroyAllWindows()
컴퓨터가 단순하기 때문에 정확한 정보를 줘야한다 그래서 그레이색으로 보내는것 흑백으로 간단하고 확실하게
동영상 이미지 보여주기
동영상을 프레임 단위 이미지로 출력해준다.
참고 : https://076923.github.io/posts/Python-opencv-4/
import cv2
capture = cv2.VideoCapture("video/video.mp4")
while True:
if(capture.get(cv2.CAP_PROP_POS_FRAMES) == capture.get(cv2.CAP_PROP_FRAME_COUNT)):
break
# capture.open("video/video.mp4")
ret, frame = capture.read()
cv2.imshow("VideoFrame", frame)
if cv2.waitKey(33) > 0: break
capture.release()
cv2.destroyAllWindows()
흑백으로 동영상 저장하기
참고 : http://blog.naver.com/PostView.nhn?blogId=rhrkdfus&logNo=221401081261&from=search&redirect=Log&widgetTypeCall=true&directAccess=false
import cv2
capture = cv2.VideoCapture("video/video.mp4")
width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("재생할 파일 넓이, 높이 : %d, %d"%(width, height))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
# fourcc = cv2.VideoWriter_fourcc(*'FMP4')
# out = cv2.VideoWriter('video/video_gray.mp4', fourcc, 30.0, (int(width), int(height)))
out = cv2.VideoWriter('video/video_gray.mp4', -1, 30.0, (int(width), int(height)))
while(capture.isOpened()):
ret, frame = capture.read()
if ret == False:
break;
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
out.write(gray)
if cv2.waitKey(33) & 0xFF == ord('q'):
break
out.release()
capture.release()
cv2.destroyAllWindows()
동영상 180도 돌려서 저장하기
참고 : https://note.nkmk.me/en/python-opencv-numpy-rotate-flip/
import cv2
capture = cv2.VideoCapture("video/video.mp4")
width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
print("재생할 파일 넓이, 높이 : %d, %d"%(width, height))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
# fourcc = cv2.VideoWriter_fourcc(*'FMP4')
# out = cv2.VideoWriter('video/video_gray.mp4', fourcc, 30.0, (int(width), int(height)))
out = cv2.VideoWriter('video/video_flip.mp4', -1, 30.0, (int(width), int(height)))
while(capture.isOpened()):
ret, frame = capture.read()
if ret == False:
break;
ud = cv2.flip(frame,0)
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',ud)
out.write(ud)
if cv2.waitKey(33) & 0xFF == ord('q'):
break
out.release()
capture.release()
cv2.destroyAllWindows()
우리 사진을 메트 플롯으로 그레이 색상으로 해보기
참고 : https://velog.io/@bangsy/Python-OpenCV2
import cv2
import os
from matplotlib import pyplot as plt
fname = 'image/123.jpg'
if os.path.isfile(fname):
imgBGR = cv2.imread(fname)
else:
print("파일이 존재하지 않습니다.")
plt.axis('off')
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()