파이참 검색 후 다운
파이썬 IDE임
아나콘다 실행
conda update conda
입력
y
입력
conda update --all
입력
y
입력
python
입력하고 3.9.7기억
hello 잘 프린트 됨
exit()
입력하고 나가기
conda create --name meta python=3.9.7
입력하여 가상 환경 구성
name이라는 옵션을 줘서 meta라는 이름의 python3.9.7을 사용하는 가상환경임
y
누르면 아래와 같이 명령어 사용방법이 나온다.(base)를 보면 기본환경임을 알 수 있다.
conda activate meta
입력하여 (meta)로 변경
이제 환경이 바뀌어서 import cv2
는 안된다.
pip install opencv-python
입력하여 opencv 설치
그리고 python으로 진입하여 import cv2하니 정상적으로 되는 것을 알 수 있다.
conda env list
설치된 가상환경 확인 가능
파이참 설치 진행
파이참 실행
new project
클릭
바탕화면에 pycharm 폴더 생성후 경로 넣기
아까 환경구성한 이름 meta가 맞으면 이대로 create
example1 정도로 생성
run 실행은 ctrl + shift + F10 누르면 run가능
ctrl + F5 도 가능
# 이미지 반환 함수
def createImage(h_red):
dst = cv2.bitwise_and(hsv, hsv, mask=h_red)
# hsv 이미지와 hsv 이미지를 bitwise_and 연산 할것임, 연산 결과는 dst 변수에 담김
# bitwise_and 연산의 마스크는 h_red (and 연산 할 부분)
dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
# hsv 연산이 끝난 이미지를 BGR 채널 이미지로 변경함
return dst # 이미지 반환
src = cv2.imread("tomato.jpg") # 이미지 가져옴
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV) # 색상 검출을 위해 HSV 채널로 변환
h, s, v = cv2.split(hsv) # hue값 쓰기 위해 hsv 채널 이미지를 분리함
cv2.namedWindow("Palette") # Palette 이름의 윈도우(창) 생성
# Palette 윈도우에 Hue 이름의 트랙바 생성, 최소값 0, 최대값 179, lambda x:x 이건 뭐지? -> 아무것도 안하는거
cv2.createTrackbar("Hue", "Palette", 0, 179, lambda x: x)
while True:
# Palette 윈도우의 Hue 트랙바 움직일 때마다 값을 가져옴
hue_val = cv2.getTrackbarPos("Hue", "Palette")
h_red = cv2.inRange(h, 0, hue_val) # hue_val 사용하여 h_red 마스크 생성
cv2.imshow("Palette", createImage(h_red)) # Palette 윈도우에 createImage 함수 반환 결과(이미지)를 보여줌
if cv2.waitKey(33) & 0xFF == ord('q'): # 33미리세컨드마다 키입력 대기, q입력 받으면 종료
break
cv2.destroyAllWindows() # 모든 윈도우 release(메모리 헤제)
커널과 고정점
커널: 특정 픽셀과 해당 픽셀 주변을 포함한 작은 크기의 공간, 신호 처리에서는 필터 라고도 함
고정점: 컨벌루션된 값을 할당한 지점
컨벌루션: 원 픽셀을 특정 커널(필터)를 이용해 연산 하여 새로운 픽셀을 만들어 내는 것
단순흐림
dst = cv2.blur(src, ksize, anchor = None, borderType = None)
중간값
dst = cv2.medianBlur(src, ksize)
가우시안
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY = None, borderType = None)
import cv2
src = cv2.imread("crescent.jpg")
dst = cv2.GaussianBlur(src, (7,7), 0, 0, borderType = None)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
양방향 필터
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst = None, BorderType = None)
날카롭게.. sharpening
src = cv2.imread("Car.png")
cv2.imshow('src', src)
sharpening_mask = np.array([[0,-1,0], [-1,5,-1],[0,-1,0]])
dst = cv2.filter2D(src, -1, sharpening_mask)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
src = cv2.imread("ferris-wheel.jpg")
dst = src.copy()
for i in range(3):
dst = cv2.pyrDown(dst)
#피라미드는 무조건 2배 규칙이 있어서 여러번 호출 해야 한다.
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destoyAllWindows()
dst = cv2.resize(src, dsize, fx = None, fy = None, interpolation = None)
src = cv2.imread("car.png")
dst = src[280:310, 240:405]
dst = cv2.resize(dst, dsize=(256,256), interpolation = cv2.INTER_NEAREST)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
# 이미지 반환 함수
import numpy as np
def createImage(h_red):
dst = cv2.bitwise_and(hsv, hsv, mask=h_red)
# hsv 이미지와 hsv 이미지를 bitwise_and 연산 할것임, 연산 결과는 dst 변수에 담김
# bitwise_and 연산의 마스크는 h_red (and 연산 할 부분)
dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
# hsv 연산이 끝난 이미지를 BGR 채널 이미지로 변경함
return dst # 이미지 반환
# 컬러 이미지
src = cv2.imread("tomato.jpg") # 이미지 가져옴
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV) # 색상 검출을 위해 HSV 채널로 변환
# print('hsv: ',hsv.shape)
# 그레이 이미지
gray_src = cv2.imread("tomato.jpg",0)
# print('gray_src: ',gray_src.shape)
h, s, v = cv2.split(hsv) # hue값 쓰기 위해 hsv 채널 이미지를 분리함
x, y = 0,0
cv2.namedWindow("Palette") # Palette 이름의 윈도우(창) 생성
# Palette 윈도우에 Hue 이름의 트랙바 생성, 최소값 0, 최대값 179, lambda x:x 이건 뭐지? -> 아무것도 안하는거
cv2.createTrackbar("Hue", "Palette", 0, 179, lambda x: x)
while True:
# Palette 윈도우의 Hue 트랙바 움직일 때마다 값을 가져옴
hue_val = cv2.getTrackbarPos("Hue", "Palette")
val_Val = round(cv2.getTrackbarPos("Hue", "Palette") / 358)
# val_Val = 179 - cv2.getTrackbarPos("Hue", "Palette")
#
# _, binary = cv2.threshold(gray_src, val_Val, 255, cv2.THRESH_BINARY) #OTSU
h_red = cv2.inRange(h, 0, hue_val) # hue_val 사용하여 h_red 마스크 생성
# print('h_red: ', h_red.shape)
CCC = (createImage(h_red))
# print('CCC: ', CCC.shape)
gray_src = h_red
binary = cv2.adaptiveThreshold(gray_src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 33, val_Val)
# print('binary: ', binary.shape)
gray = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)
# print('gray: ',gray.shape)
# CCC = (createImage(h_red))
c = np.vstack((CCC, gray))
cv2.imshow("Palette", c) # Palette 윈도우에 createImage 함수 반환 결과(이미지)를 보여줌
cv2.moveWindow("Palette", x, y)
key = cv2.waitKey(33) # 키보드 입력을 무한 대기, 8비트 마스크 처리
if key == ord('a'): # 'a' 키이면 좌로 이동
x -= 100
elif key == ord('s'): # 's' 키이면 아래로 이동
y += 100
elif key == ord('w'): # 'w' 키이면 위로 이동
y -= 100
elif key == ord('d'): # 'd' 키이면 우로 이동
x += 100
elif key == ord('q') or key == 27: # 'q' 또는 'esc'이면 종료
break
cv2.moveWindow("Palette", x, y) # 새로운 좌표로 이동
if cv2.waitKey(33) & 0xFF == ord('q'): # 33미리세컨드마다 키입력 대기, q입력 받으면 종료
break
elif cv2.waitKey(33) & 0xFF == 27: # 33미리세컨드마다 키입력 대기, ESC입력 받으면 종료
break
cv2.destroyAllWindows() # 모든 윈도우 release(메모리 헤제)
강사님 코드
import cv2
import numpy as np
def createImage(lower_mask, upper_mask, threshold):
complete_mask = cv2.addWeighted(lower_mask, 1.0, upper_mask, 1.0, 0.0)
dst = cv2.bitwise_and(hsv, hsv, mask=complete_mask)
dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)
binary = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)
dst = np.vstack((dst, binary))
return dst
src = cv2.imread("tomato.jpg")
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
window_x, window_y = 0, 0
cv2.namedWindow("Palette", flags=cv2.WINDOW_NORMAL)
cv2.createTrackbar("lower_mask_min_value", "Palette", 0, 179, lambda x: x)
cv2.createTrackbar("lower_mask_max_value", "Palette", 5, 179, lambda x: x)
cv2.createTrackbar("upper_mask_min_value", "Palette", 170, 179, lambda x: x)
cv2.createTrackbar("upper_mask_max_value", "Palette", 179, 179, lambda x: x)
cv2.createTrackbar("threshold", "Palette", 127, 255, lambda x: x)
while True:
lower_mask_min_value = cv2.getTrackbarPos("lower_mask_min_value", "Palette")
lower_mask_max_value = cv2.getTrackbarPos("lower_mask_max_value", "Palette")
upper_mask_min_value = cv2.getTrackbarPos("upper_mask_min_value", "Palette")
upper_mask_max_value = cv2.getTrackbarPos("upper_mask_max_value", "Palette")
threshold = cv2.getTrackbarPos("threshold", "Palette")
lower_mask = cv2.inRange(h, lower_mask_min_value, lower_mask_max_value)
upper_mask = cv2.inRange(h, upper_mask_min_value, upper_mask_max_value)
cv2.imshow("Palette", createImage(lower_mask, upper_mask, threshold))
key = cv2.waitKey(33)
if key == ord('a'):
window_x -= 10
elif key == ord('s'):
window_y += 10
elif key == ord('w'):
window_y -= 10
elif key == ord('d'):
window_x += 10
elif key == ord('q') or key == 27: # 'q' 이거나 'esc' 이면 종료
break
cv2.destroyAllWindows()
cv2.moveWindow("Palette", window_x, window_y) # 안배움
cv2.destroyAllWindows()
import math
import cv2
src = cv2.imread("glass.jpg")
height, width, _ = src.shape
center = (width / 2, height / 2)
angle = 90
scale = 0.5 # 이미지 회전 후 비율 조정
matrix = cv2.getRotationMatrix2D(center, angle, scale)
radians = math.radians(angle)
sin = math.sin(radians)
cos = math.cos(radians)
bound_w = int((height * scale * abs(sin)) + (width * scale * abs(cos)))
bound_h = int((height * scale * abs(cos)) + (width * scale * abs(sin)))
matrix[0, 2] += ((bound_w / 2) - center[0])
matrix[1, 2] += ((bound_h / 2) - center[1])
dst = cv2.warpAffine(src, matrix, (bound_w, bound_h))
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
인위적으로 확대, 축소, 위치 변경, 회전, 왜곡 등 형태 변환
import numpy as np
import cv2
src = cv2.imread("clouds.jpg")
cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
height, width, _ = src.shape # height, width = src.shape[:2]
pts1 = np.float32([[0,0], [0, height], [width,0], [width,height]])
pts2 = np.float32([[300,300], [0, height-200], [800,200], [width-100,height-100]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(src, matrix, (width, height))
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
import cv2
src = cv2.imread("clouds.jpg")
cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
height, width, _ = src.shape # height, width = src.shape[:2]
cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
cv2.namedWindow('src', flags = cv2.WINDOW_NORMAL)
cv2.circle(src, (0,0), 10, (255,0,0), 10) # B
cv2.circle(src, (0,height), 10, (0,255,0), 10) # G
cv2.circle(src, (width,0), 10, (0,0,255), 10) # R
cv2.circle(src, (width,height), 10, (0,255,255), 10) # Y
cv2.imshow('src', src)
pts1 = np.float32([[0,0], [0, height], [width,0], [width,height]])
pts2 = np.float32([[300,300], [0, height-200], [800,200], [width-100,height-100]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(src, matrix, (width, height))
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
구조요소 생성 함수는 커널의 형태(shape)를 설정할 수 있으며, 직사각형 십자가 타원 모양으로 구조 요소를 생성한다.
import cv2
src = cv2.imread("dandelion.jpg", cv2.IMREAD_GRAYSCALE)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5), anchor=(-1,-1))
# 타원, 사이즈, 고정점
dst = cv2.erode(src, kernel, iterations=1) #침식 반복 횟수
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()