[AI배울랑교] 컴퓨터 비전

2024. 11. 27. 10:20컴퓨터비전&AI

반응형

  1. 영상 보여주기

cap = cv2.VideoCapture(0)

if not cap.isOpened():

print("Camera open failed!")

exit()

print('Frame width:', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))

print('Frame height:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

print('Frame count:', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))

print('FPS:', cap.get(cv2.CAP_PROP_FPS))

cv2.namedWindow("frame", cv2.WINDOW_NORMAL)

cv2.resizeWindow("frame", 640, 480)

while True:

ret, frame = cap.read()

if ret == False:

break

cv2.imshow('frame', frame)

if cv2.waitKey(10) == 27:

break

cap.release()

cv2.destroyAllWindows()

 

 

 

2. 영상 프레임 보여주고 저장

cap = cv2.VideoCapture(0)

if not cap.isOpened():

print("Camera open failed!")

exit()

def put_string(frame, text, pt, value, color=(120, 200, 90)):

text += str(value)

shade = (pt[0] + 2, pt[1] + 2)

font = cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(frame, text, shade, font, 2, (0, 0, 0), 2)

cv2.putText(frame, text, pt, font, 2, (120, 200, 90), 2)

cv2.namedWindow("frame", cv2.WINDOW_NORMAL)

cv2.resizeWindow("frame", 640, 480)

while True:

ret, frame = cap.read()

if ret == False:

break

W = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

H = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

C = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

F = round(cap.get(cv2.CAP_PROP_FPS), 3)

put_string(frame, "Width: ", (250, 50), W)

put_string(frame, "Height: ", (250, 100), H)

put_string(frame, "Count: ", (250, 150), C)

put_string(frame, "FPS: ", (250, 200), F)

cv2.imshow('frame', frame)

if cv2.waitKey(10) == 27:

break

cap.release()

cv2.destroyAllWindows()

 

 

 

3. 영상 파일에 저장

cap = cv2.VideoCapture(0)

if cap.isOpened():

file_path = 'images/record001.avi'

fps = 25.40

fourcc = cv2.VideoWriter_fourcc(*'DIVX')

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)

height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

size = (int(width), int(height))

out = cv2.VideoWriter(file_path, fourcc, fps, size)

else:

print("Camera open failed!")

exit()

print('Frame width:', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))

print('Frame height:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

print('Frame count:', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))

print('FPS:', cap.get(cv2.CAP_PROP_FPS))

cv2.namedWindow("frame", cv2.WINDOW_NORMAL)

cv2.resizeWindow("frame", 640, 480)

while True:

ret, frame = cap.read()

if ret == False:

break

cv2.imshow('frame', frame)

out.write(frame)

if cv2.waitKey(10) == 27: #esc의 아스키 코드로 esc 누르면 꺼지게 코드

break

out.release()

cv2.destroyAllWindows()

4. 행렬처리

image = cv2.imread("images/flip_test.jpg",cv2.IMREAD_COLOR) # color 영상 읽기

if image is None:

raise Exception("영상파일읽기 오류발생") # 예외 처리

x_axis = cv2.flip(image, 0) # 0 → x축 기준 상하 뒤집기

y_axis = cv2.flip(image, 1) # 1 → y축 기준 좌우 뒤집기

xy_axis = cv2.flip(image, -1) # -1 → x, y축 기준 모두 뒤집기

rep_image12 = cv2.repeat(image, 1, 2) # 1 × 2 반복 복사

rep_image21 = cv2.repeat(image, 2, 1) # 2 × 1 반복 복사

trans_image = cv2.transpose(image) # 행렬 전치

titles = ['image', 'x_axis','y_axis', 'xy_axis',

'rep_image12','rep_image21' ,'trans_image']

for title in titles:

cv2.imshow(title, eval(title)) # eval()

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

 

 

 

 

 

5. 컬러채널 분리 및 합성

image = cv2.imread( "images/logo.jpg", cv2.IMREAD_COLOR)

if image is None:

raise Exception("영상 파일 읽기 오류 발생")

if image.ndim != 3:

raise Exception("컬러 영상 아님")

b, g, r = cv2.split(image)

print(image.shape)

zeros = np.zeros((image.shape[:2]), # (360, 480, 3)

dtype="uint8")

b = cv2.merge([b, zeros, zeros])

g = cv2.merge([zeros, g, zeros])

r = cv2.merge([zeros, zeros, r])

cv2.imshow("image", image)

cv2.imshow("Blue channel" , b)

cv2.imshow("Green channel", g)

cv2.imshow("Red channel" , r)

cv2.waitKey()

cv2.destroyAllWindows()

 

 

 

 

6. 행렬 비트 연산

image1 = np.zeros((300, 300), np.uint8)

image2 = image1.copy()

h, w = image1.shape[:2] # 300, 300

cx,cy = w//2, h//2 # 150, 150

cv2.circle(image1, (cx,cy), 100, 255, -1)

cv2.rectangle(image2, (0, 0, cx, h), 255, -1) # (pt, w, h)

image3 = cv2.bitwise_or(image1, image2)

image4 = cv2.bitwise_and(image1, image2)

image5 = cv2.bitwise_xor(image1, image2)

image6 = cv2.bitwise_not(image1)

cv2.imshow("image1", image1)

cv2.imshow("image2", image2)

cv2.imshow("bitwise_or", image3)

cv2.imshow("bitwise_and", image4)

cv2.imshow("bitwise_xor", image5)

cv2.imshow("bitwise_not", image6)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

 

6-1 행렬 비트 연산

import cv2

import numpy as np

image = cv2.imread("images/bit_test_star.jpg", cv2.IMREAD_COLOR)

logo = cv2.imread("images/logo.jpg", cv2.IMREAD_COLOR)

if image is None or logo is None:

raise Exception("영상 파일 읽기 오류")

image2 = image.copy() # image를 image2로 복사

# cv2.THRESH_BINARY → 이진화

masks = cv2.threshold(logo, 220, 255, cv2.THRESH_BINARY)[1] # 220보다 작으면 0, 220보다 크면 255masks = cv2.split(masks) # 3채널 컬러 행렬을 분리

masks = cv2.split(masks) # 3 채널 컬러 행렬을 분리

fg_pass_mask = cv2.bitwise_or(masks[0], masks[1]) # b채널 or g채널

fg_pass_mask = cv2.bitwise_or(masks[2], fg_pass_mask) # (b채널 or g채널) or r채널

bg_pass_mask = cv2.bitwise_not(fg_pass_mask) # not (b채널 or g채널 or r채널)

(H, W), (h, w) = image.shape[:2], logo.shape[:2] # image, logo → height, width

x, y = (W-w)//2, (H - h)//2 # 시작좌표(x, y) 계산

roi = image[y:y+h, x:x+w] # 관심영역 설정

roi2 = image2[y:y+h, x:x+w].copy() # roi를 roi2로 복사

foreground = cv2.bitwise_and(logo, logo, mask=fg_pass_mask)

background = cv2.bitwise_and(roi , roi , mask=bg_pass_mask)

bfa = cv2.add(background, foreground)

image2[y:y+h, x:x+w] = bfa

cv2.imshow("image", image)

cv2.imshow("logo", logo)

cv2.imshow("roi", roi)

cv2.imshow("roi2", roi2)

cv2.imshow("fg_pass_mask", fg_pass_mask)

cv2.imshow("bg_pass_mask", bg_pass_mask)

cv2.imshow("background", background)

cv2.imshow("forground", foreground)

cv2.imshow("bfa", bfa)

cv2.imshow("image2", image2)

cv2.waitKey()

cv2.destroyAllWindows()

 

 

 

 

 

6-2 행렬 비트 연산

import cv2

import numpy as np

img = cv2.imread('images/girl.jpg')

if img is None:

raise Exception("영상 파일 읽기 오류 발생")

mask = np.zeros_like(img) # np.zeros_like(img) → img와 같은 shape로 0 행렬

cv2.circle(mask, (150,140), 100, (255,255,255), -1) #cv2.circle(img, (x, y), radius, (color), thickness)

masked = cv2.bitwise_and(img, mask)

cv2.imshow('original', img)

cv2.imshow('mask', mask)

cv2.imshow('masked', masked)

cv2.waitKey()

cv2.destroyAllWindows()

 

 

 

 

6-3 행렬 비트 연산

fore = cv2.imread('images/airplane.bmp', cv2.IMREAD_COLOR)

mask = cv2.imread('images/mask_plane.bmp', cv2.IMREAD_GRAYSCALE)

back = cv2.imread('images/field.bmp', cv2.IMREAD_COLOR)

if fore is None or mask is None or back is None:

raise Exception("영상 파일 읽기 오류 ")

cv2.imshow('fore', fore)

cv2.imshow('mask', mask)

cv2.imshow('back', back)

final = cv2.copyTo(fore, mask, back)

cv2.imshow('final', final)

cv2.waitKey()

cv2.destroyAllWindows()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형