import tkinter
import cv2
import time
import PIL.Image, PIL.ImageTk
# 전체 프로그램 정보관련
class App:
def __init__(self, window, window_title, video_source=0):
self.window = window # 멤버변수 = 매개변수
self.window.title(window_title) # 타이틀문구
self.window.geometry('640x520+100+100') # 이미지 크기값
self.video_src = video_source # 비디오 소스
class MyVideoCapture:
def __init__(self, video_src=0):
self.vid = cv2.VideoCapture(video_src)
self.vid.set(3, 640)
self.vid.set(4, 480)
# 카메라 연결이 잘 된 경우 T, 잘 안 될 경우 F
if not self.vid.isOpened():
raise ValueError('Video open False!')
self.width = 640 # 가로
self.height = 480 # 세로
def get_frame(self):
if self.vid.isOpened():
ret, frame = self.vid.read()
if ret:
return ret, cv2.cvtColor(frame, cv2.COLOR_BFR2RGB)
else:
return ret, None
else:
return ret, None
def __del__(self):
if self.vid.isOpened():
self.vid.release()
라즈베리에 이미지 불러와서 작업폴더에 저장
Open CV 사용
이미지를 불러오는 메소드
cv2.imread('경로/파일명', 옵션), 같은 경로에 있을 경우 경로를 안 적어도 됨.
옵션 : 이미지의 모드 설정, cv2를 옵션 앞에 붙여서 사용
1) 기본값, 원색 : IMREAD_COLOR, 아무것도 안 적어주면 이 옵션으로 적용됨
2) 회색 : IMREAD_GRAYSCALE
3) 원색, 1/2크기 : IMREAD_REDUCED_COLOR_2
4) 원색, 1/4크기 : IMREAD_REDUCED_COLOR_4
5) 원색, 1/8크기 : IMREAD_REDUCED_COLOR_8
6) 회색, 1/2크기 : IMREAD_REDUCED_GRAYSCALE_2
7) 회색, 1/4크기 : IMREAD_REDUCED_GRAYSCALE_4
8) 회색, 1/8크기 : IMREAD_REDUCED_GRAYSCALE_8
9) 이미지의 깊이값이 있을경우 16bit / 32bit로 이미지 반환, 없을 경우 8bit로 처리 : IMREAD_ANYDEPTH
10) 모든 색상 형식을 활용, 이미지 불러옴 : IMREAD_ANYCOLOR
11) 이미지 읽어올때 GDAL 드라이버 사용 : IMREAD_LOAL_GDAL
이미지 사이즈 변경 메소드
cv2.resize(img, (x-size, y-size)) : 이미지 크기 변경
이미지 컬러 변경 메소드
cv2.cvtColor(img, 컬러상수)
컬러상수 : cv2를 옵션 앞에 붙여서 사용
GRAY : COLOR_BGR2GRAY, COLOR_GRAY2BGR
COLOR_RGB2GRAY, COLOR_GRAY2RGB
HSV : COLOR_BGR2HSV, COLOR_GRAY2BGR
COLOR_RGB2HSV, COLOR_GRAY2RGB
YCrCb : (Y는 휘도, Cb와 Cr은 색차 성분)
COLOR_BGR2YCrCb, COLOR_YCrCb2BGR
COLOR_RGB2YCrCb, COLOR_YCrCb2RGB
Luv : COLOR_BGR2Luv, COLOR_Luv2BGR
COLOR_RGB2Luv, COLOR_Luv2RGB
컴퓨터 - 빛의 삼원색
프린터 - 색의 삼원색
import cv2
img = cv2.imread('/home/pi/work/camera_work/up.jpg') # 불러올 이미지 위치
img = cv2.resize(img, (가로, 세로)) # 이미지 크기 조절
if img is not None:
cv2.imshow('Image Viewer', img) # 제목, 이미지 보이기
cv2.waitKey() # 키 입력까지 무한정 대기, 수치를 입력하면 수치만큼 대기 time.sleep과 비슷
cv2.destroyAllWindows()
else:
print('No Image!') # 이미지가 없을 경우 문구출력
# 이미지 회색으로 불러오기
img = cv2.imread('/home/pi/work/camera_work/up.jpg', cv2.IMREAD_GRAYSCALE)
# 두 개 이상의 이미지 붙여서 한 창에 띄우기
import cv2
img1 = cv2.imread('up.jpg')
img2 = cv2.imread('up.jpg')
img3 = cv2.hconcat([img1, img2]) # 가로
img4 = cv2.vconcat([img2, img2]) # 세로
cv2.imshow('hconcat', img3)
cv2.imshow('vconcat', img4)
cv2.watiKey()
cv2.destroyAllWindows()
import cv2
img = cv2.imread('up.jpg', cv2.IMREAD_REDUCED_COLOR_2)
img1 = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
cv2.imshow('Image Viewer', img1)
cv2.waitKey()
cv2.destroyAllWindows()
영상 + 캡쳐
import cv2
pic_number = 0
def main():
camera = cv2.VideoCapture(0)
camera.set(3, 640) # video width setting
camera.set(4, 480) # video height setting
while camera.isOpened():
ret, frame = camera.read()
cv2.imshow('camera test', frame)
if cv2.waitKey(1) == ord('c'): # capture
global pic_number
pic_number += 1
img_cap = cv2.imwrite(f'img_0629_{pic_number}.png', frame)
if cv2.waitKey(1) == ord('q'): # quit
break;
camera.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
tkinter와 opencv 연동
PIL모듈
opencv의 프레임 이미지를 tkinter에서 사용하기 위해 python 이미지 처리용 모듈이 필요
모듈설치
sudo apt-get install python3-pil python3-pil.imagetk
import tkinter
import cv2
import PIL.Image, PIL.ImageTk
import time
class App:
def __init__(self, window, window_title, video_source=0):
self.window = window
self.window.title(window_title)
self.window.geometry('640x520+10+50')
self.video_src = video_source
self.vid = MyVideoCapture(self.video_src)
self.screen = tkinter.Canvas(self.window, width=640, height=480)
self.screen.grid(row=0, column=0)
self.btn_capture = tkinter.Button(self.window, text='Capture', width=50, command=self.capture)
self.btn_capture.grid(row=1, column=0)
self.delay = 15
self.update()
self.window.mainloop()
def capture(self):
ret, frame = self.vid.get_frame()
if ret:
cv2.imwrite('snap' + time.strftime('%Y-%m-%d_%H-%M-%S')
+'.png', cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))
def update(self):
ret, frame = self.vid.get_frame()
if ret:
self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
self.screen.create_image(0, 0, image=self.photo, anchor=tkinter.NW)
self.window.after(self.delay, self.update)
class MyVideoCapture:
def __init__(self, video_src=0):
self.vid = cv2.VideoCapture(video_src)
self.vid.set(3, 640)
self.vid.set(4, 480)
if not self.vid.isOpened():
raise ValueError('Video open False!')
self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
def get_frame(self):
if self.vid.isOpened():
ret, frame = self.vid.read()
frame = cv2.Canny(frame, 50, 150)
if ret:
return ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
else:
return ret, None
else:
return ret, None
def __del__(self):
if self.vid.isOpened():
self.vid.release()
App(tkinter.Tk(), 'Camera View')
Canny
'공부기록' 카테고리의 다른 글
11월 11일 java - eclipse(설치 및 프로젝트 연동) (0) | 2023.11.11 |
---|---|
6월 28일 라즈베리파이 - 카메라연결 (0) | 2023.06.28 |
6월 27일 라즈베리파이 - 서보모터, 아날로그신호처리 (0) | 2023.06.27 |
6월 26일 라즈베리파이 - 네트워크 (0) | 2023.06.26 |
6월 22일 라즈베리파이 - 온습도, 초음파거리, PWM장치 (0) | 2023.06.22 |