2020-12-09 python

jsbak·2020년 12월 9일
0

PYTHON

목록 보기
22/24

OpenCV

참고 : 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, 알고리즘을 알고 응용하는 것이다.

opencv 설치

참고 : 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()
profile
끄적끄적 쓰는곳

0개의 댓글