개발자/라즈베리파이4

라즈베리파이 부팅과 동시에 영상이나 이미지를 반복 재생하는 코드

지구빵집 2021. 7. 5. 15:24
반응형

 

 

라즈베리파이 부팅과 동시에 영상이나 이미지를 반복 재생하는 코드 

 

솜씨 좋은 사람과 일하는 이야기에 이어지는 포스팅이다. 국가기상위성센터 전시물 리뉴얼 작업으로 정해진 시간에 맞추어 영상을 모니터로 출력하는 작업이다. 라즈베리파이를 Hotspot, 다른 말로 하면 access point 로 만들어 놓고 작업하면 한결 쉬워진다. 영상을 만들었으나 19인치 4:3 모니터에 맞추기가 여간 어려워서 다시 이미지를 시간에 맞춰 반복적으로 뿌려주는 작업을 하기로 한다. 간단한 일은 없고, 사소한 작업은 없다. 작소 사소하게 보이는 일이 쌓여 큰 일이 되고 는 결정으로 이어진다. 사자는 토끼를 잡을 때도 집중한다.

 

솜씨 좋은 사람은 하는 일을 돌아보고, 기록하고 계획을 짠다. 우선 순위를 정하고, 무슨 일을 하지 않아야 하는 지 안다. 경계를 확실히 정하고, 한 번에 한 가지 일만 한다. 닮아가기로 한다. 훌륭한 사람과 일하는 자격을 갖추기 위해 기본적으로 훌륭하게 일하는 방법을 습득하고 능숙해지기 위해 노력한다.

 

전체 과정을 요약한다.

 

1. 라즈베리파이3 B+ 플랫폼으로 한다. 라즈베리파이4 모델 B는 기본적으로 마이크로 HDMI 포트를 사용하므로 케이블을 따로 준비해야 한다. 그냥 일반 표준 HDMI - DVI 모니터 케이블을 사용하기로 한다. 그래야 구형 모니터에도 잘 맞는다.

 

2. 라즈베리파이를 공유기로 설정한다. Access Point 로 만든다. SSID는 RPI3wifi 로 한다. 암호는 1234567890 으로 한다. AP로 설정하고 유선 인터넷인 Ethernet 과 무선 인터넷인 WiFi를 동시에 하려고 하면 좋지 않다. 이더넷은 192.168.0.11로 IP 조소를 받는다. WiFi는 당연히 10.0.0.5로 잡힌다. 네트워크가 RPI3wifi 네트워크하에서 말이다. 일할 때는 분리해서 작업한다. 아이피 주소 할당 상황은 아래 코드를 참고한다. 

 

3. 라즈베리파이를 GUI 모드(x-window)로 부팅하며 test3.py 프로그램이 실행되도록 한다. 이 방법에 대한 상세한 설명은 다음 링크를 참고한다. test3.py 프로그램은 OpenCV 환경에서 돌아가니 OpenCV를 가장 쉽게 설치하는 방법 글을 참고한다. 아래는 잘 돌아가는 test3.py 코드다. 코드 설명은 생략한다. 지금은 한 번 부팅하면서 시간에 맞워 영사을 재생하고 종료한다. 이미지를 뿌려주면서 반복적으로 재생하는 기능을 추가한다.

 

import cv2

video_file = './bongmov1280.mp4'

cap = cv2.VideoCapture(video_file)
if cap.isOpened():
    while True:
        ret, img = cap.read()
        if ret:
            cv2.imshow(video_file, img)
            cv2.waitKey(33)
        else:
            break
else:
    print('cannot open the file')

cap.release()
#cv2.destroyAllWindows()

 

4. 사용자가 버튼(보드 핀번호 GPIO 11번)을 누르면 스캔 미러의 동작에 맞추어 이미지를 재생한다. 모니터 화면에 맞게 전체 화면으로 이미지를 반복적으로 재생하도록 코드를 수정하기로 한다. 많이 어려운 코드는 아니라서 아래에 코드를 나타낸다.

 

import cv2
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)

button_in = 11
GPIO.setup(button_in, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

img1 = cv2.imread('orginimage01.png', cv2.IMREAD_COLOR)
img2 = cv2.imread('orginimage02.png', cv2.IMREAD_COLOR)
img3 = cv2.imread('orginimage03.png', cv2.IMREAD_COLOR)
img4 = cv2.imread('orginimage04.png', cv2.IMREAD_COLOR)
img5 = cv2.imread('calib01.png', cv2.IMREAD_COLOR)
img6 = cv2.imread('calib02.png', cv2.IMREAD_COLOR)
img7 = cv2.imread('calib03.png', cv2.IMREAD_COLOR)
img8 = cv2.imread('calib04.png', cv2.IMREAD_COLOR)
img9 = cv2.imread('lastimage.png', cv2.IMREAD_COLOR)

while True:
    buttonstate = GPIO.input(button_in)
	
    if buttonstate == False:
        print("LOW")
        cv2.imshow('미러 스캔 이미지', img9)
        cv2.waitKey(500)
        
    else: 
        print("HIGH")
        
        cv2.imshow('미러 스캔 이미지', img1)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img2)
        cv2.waitKey(4000)
        cv2.imshow('미러 스캔 이미지', img3)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img4)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img5)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img6)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img7)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img8)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img9)
        cv2.waitKey(5000)
        cv2.destroyAllWindows()

 

아래 코드는 윈도우 테두리 없이 전체 화면 으로 이미지가 출력되는 코드다. 달라진 부분은 6~11 라인이 추가된 부분이다. 참고로 올려둔다.

 

import cv2
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)

# 전체 화면으로 'image' 창 생성
cv2.namedWindow('미러 스캔 이미지', cv2.WINDOW_NORMAL) # WINDOW_NORMAL 로 만들어야 전체화면 가능
# cv2.setWindowProperty 함수를 사용하여 속성 변경
# cv2. WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN을 이용하여 전체화면 속성으로 변경
cv2.setWindowProperty('미러 스캔 이미지', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)


button_in = 11
GPIO.setup(button_in, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

img1 = cv2.imread('orginimage01.png', cv2.IMREAD_COLOR)
img2 = cv2.imread('orginimage02.png', cv2.IMREAD_COLOR)
img3 = cv2.imread('orginimage03.png', cv2.IMREAD_COLOR)
img4 = cv2.imread('orginimage04.png', cv2.IMREAD_COLOR)
img5 = cv2.imread('calib01.png', cv2.IMREAD_COLOR)
img6 = cv2.imread('calib02.png', cv2.IMREAD_COLOR)
img7 = cv2.imread('calib03.png', cv2.IMREAD_COLOR)
img8 = cv2.imread('calib04.png', cv2.IMREAD_COLOR)
img9 = cv2.imread('lastimage.png', cv2.IMREAD_COLOR)

while True:
    buttonstate = GPIO.input(button_in)
	
    if buttonstate == False:
        print("LOW")
        cv2.imshow('미러 스캔 이미지', img9)
        cv2.waitKey(500)
        
    else: 
        print("HIGH")
        
        cv2.imshow('미러 스캔 이미지', img1)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img2)
        cv2.waitKey(4000)
        cv2.imshow('미러 스캔 이미지', img3)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img4)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img5)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img6)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img7)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img8)
        cv2.waitKey(3000)
        cv2.imshow('미러 스캔 이미지', img9)
        cv2.waitKey(5000)
        cv2.destroyAllWindows()

 

 

 

기상 위성 이미지

 

 

반응형