본문 바로가기
공부기록

6월 29일 라즈베리파이 - Open CV

by project100 2023. 6. 29.
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

 

[python/OpenCV] cv2.Canny():Canny방법을 이용하여 물체의 외곽선(엣지) 추출하기

외곽선(엣지)란 물체간 혹은 배경과의 경계를 일컫는 것으로, 외곽선(엣지) 검출이란 일반적으로 이미지 안의 화소치의 변화, 휘도의 변화가 커다란 부분을 검출하여 엣지를 추출하는 이미지 처

engineer-mole.tistory.com