메이커 Maker

기상 위성 사진 디스플레이 코드 수정 방법

지구빵집 2021. 7. 18. 16:08
반응형

 

 

기상 위성 사진 디스플레이 코드 수정 방법 

 

인류가 문명을 건설하고 발전하는 방향을 보면 4가지로 요약할 수 있다. 바로 에너지를 많이 사용하는 방향으로 움직이며, 정보를 디지털화하고, 속도를 빠르게 하여 시간을 아끼게 하고, 마지막으로 손가락만 까닥하면 일이 처리될 정도로 편하게 만들어 주는 방향이다. 늘 강의하면서 나름대로 일관성을 가지고 인류는 이 원칙에서 벗어나지 않고 발전해왔다.

 

우리가 어떤 사업을 하고, 서비스를 제공하고, 부자가 되고, 가치를 창출하고자 할 때는 네 가지 중에 한 가지라도 만족하는 제품과 서비스를 만들면 된다. 에너지 사용, 디지털화, 속도, 편리성은 사업이나 서비스가 크든 작든, 외국이든, 언어가 다르든, 어떤 분야라도 일관성을 가지고 반영되어야 한다. 지금 하는 작업은 바로 편리성을 주도록 하는 작업이다. 누구라도 아래 과정을 거치면 프로그램을 마음대로 수정하고 변경할 수 있기 때문이다. 항상 일을 못해서 문제가 아니라 너무 잘해서 문제였다. 완벽하고 흠집하나 없이 일을 하려고 하는 자체도 욕심이다.

 

지금까지 작업했던 글을 참고로 올린다.

 

창의성은 환상이며 언제나 축적된 시도에서 나온다.

 

창의성은 환상이며 언제나 축적된 시도에서 나온다.

창의성은 환상이며 축적된 시도에서 나온다. 3주 전부터 매주 방문하면서 일을 했지만 오늘에서야 단순하고 창의적인 해결 방법을 찾았다. 미리 준비했다면 오늘 마무리를 할 수 있었을 텐데 시

fishpoint.tistory.com

 

라즈베리파이 부팅과 동시에 영상이나 이미자를 반복재생

 

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

라즈베리파이 부팅과 동시에 영상이나 이미지를 반복 재생하는 코드 솜씨 좋은 사람과 일하는 이야기에 이어지는 포스팅이다. 국가기상위성센터 전시물 리뉴얼 작업으로 정해진 시간에 맞추어

fishpoint.tistory.com

 

 

전체 구현과정과 순서를 요약하면 아래와 같다. 이런 순서로 수정하는 방법을 이해하고 상세한 설명은 이후 이어진다.

 

  1. 라즈베리파이3 B+ 플랫폼으로 한다. 라즈베리파이4 모델 B는 기본적으로 마이크로 HDMI 포트를 사용하므로 케이블을 따로 준비해야 한다. 그냥 일반 표준 HDMI - DVI 모니터 케이블을 사용하기로 한다. 그래야 구형 모니터에도 잘 맞는다.
  2. 라즈베리파이를 공유기로 설정한다. Access Point 로 만든다. SSID는 RPI3wifi 로 한다. 암호는 1234567890 으로 한다. AP로 설정하고 유선 인터넷인 Ethernet 과 무선 인터넷인 WiFi를 동시에 하려고 하면 좋지 않다. 이더넷은 192.168.xxx.xxx 로 IP 주소를 받는다. WiFi는 당연히 공유기로 설정한 10.0.0.5로 잡힌다. 네트워크가 RPI3wifi 네트워크 접속한 상태에서 말이다. 일할 때는 분리해서 작업한다.
  3. 라즈베리파이를 GUI 모드(x-window)로 부팅하며 test3.py 프로그램이 실행되도록 한다. 이 방법에 대한 상세한 설명은 링크를 참고한다. test3.py 프로그램은 OpenCV 환경에서 돌아가니 OpenCV를 가장 쉽게 설치하는 방법 글을 참고한다. 아래는 잘 돌아가는 test3.py 코드다. 코드 설명은 생략한다. 지금은 한 번 부팅하면서 시간에 맞워 영상을 재생하고 종료한다. 이미지를 뿌려주면서 반복적으로 재생하는 기능을 추가한다.
  4. 사용자가 버튼(보드 핀번호 GPIO 11번)을 누르면 스캔 미러의 동작에 맞추어 이미지를 재생한다. 모니터 화면에 맞게 전체 화면으로 이미지를 반복적으로 재생하도록 코드를 수정하기로 한다. 어려운 코드는 아니라서 아래에 코드를 나타낸다.  

 

전시물 리뉴얼에 사용한 라즈베리파이3 Model B+는 이미 엑세스 포인트(인터넷 공유기)로 설정했다. 라즈베리파이를 AP(Access Point)로 설정하는 방법은 다음 포스팅을 참고하기 바란다. 라즈베리파이 AP로 만들기 1, 라즈베리파이 AP로 만들기 2. 라즈베리파이를 AP 모드로 설정하고 개발할 때 편리한 점은 어떤 환경에서도 원격 접속이 가능하다는 점, 삼바 서버가 작동할 경우 윈도우 환경에서도 수정이 가능하다는 점이다.

 

코드 수정 방법

 

방법은 두 가지가 있는데 하나는 원격 접속 프로그램인 Putty를 이용하는 방법과 윈도우에서 이미 라즈베리파이에 설치된 삼바 서버를 이용하여 윈도우 탐색기에서 직접 라즈베리파이를 네트워크로 접속하는 방법이 있다. Putty 원격접속 프로그램을 이용하면 번거롭기는 하지만 접속하여 실행중인 test3.py 프로그램을 강제로 종료하고 코드를 수정하면 더 빠르게 진행되는 장점이 있지만 이미지 파일을 카피하는 것은 불가능하므로 코드 수정은 Putty를 이용하고 이미지 복사는 두 번째 설명하는 윈도우에서 하는 방법이 있다.

 

다 귀찮고 불편하면 그냥 윈도우에서 하는 방식으로 약간 느리고 네트워크가 끊기는 점이 있지만 코드 수정도 하고 이미지 카피도 지원 되므로 윈도우에서 실행하면 된다. putty 프로그램은 다운로드 링크를 클릭하여 노트북 사양에 맞는 버전을 포터블 형식(설치하지 않아도 실행할 수 있는)으로 다운 받아 실행하면 된다. Putty를 실행하여 아래 입력 부분에 IP 주소를 입력하고 하단의 Open을 클릭하면 접속화면이 나온다. 

 

개발중인 라즈베리파이 전원을 넣으면 30초 후에 부팅이 된다. 노트북 전원을 켜고 와이파이를 검색하면 아래 이미지와 같이 SSID가 RPI3wifi 인 AP(Access Point)가 보인다.  

 

1. Putty를 이용하여 수정하는 방법

 

노트북에서 아래와 같이 네트워크 연결 환경에서 아래 SSID를 찾는다. putty 프로그램은 다운로드 링크를 클릭하여 노트북 사양에 맞는 버전을 포터블 형식(설치하지 않아도 실행할 수 있는)으로 다운 받아 실행하면 된다. Putty를 실행하여 아래 입력 부분에 IP 주소를 입력하고 하단의 Open을 클릭하면 접속화면이 나온다.  

 

네트워크 연결 환경

 

암호는 1234567890 을 입력하여 연결한다. 물론 인터넷은 연결되지 않으므로 데이터와 상관없이 일단 연결을 한다. 아래 이미지처럼 검은 화면이 뜨면 login as: 에는 사용자 이름인 "pi"를 입력한다. 아래 pi@10.0.0.5’s password: 에는 암호인 "raspberry"를 입력하는데 암호라서 입력하는 도중에 보이지 않아도 틀리지 않게 입력한다. 아래는 제대로 입력하여 성공적으로 로그인을 완료한 화면이다. 

 

Putty를 실행

 

~ $ ls 명령으로 파일 이름이 모두 나오는데 수정이 필요한 파일은 test3.py 파일과 앞으로 설명할 이미지 파일이다. 아래 이미지의 파일 이름을 참고한다. 

 

수정이 필요한 파일은 test3.py 파일

 

실행 파일인 test3.py 코드를 수정하면 된다. 코드는 맨 아래 실었다. 참고로 잊히기 전에 다시 저장하기 위해 간혹 네트워크가 끊기거나 실행이 늦은 점을 해결하기 위해 라즈베리파이가 부팅하면서 실행하는 test3.py 프로그램을 갖에로 종료하는 방법을 설명한다. 현재 라즈베리파이가 실행하고 있는 프로세스 리스트를 보기 위해 $ps -ax 를 실행하면 아래와 같은 리스트가 나오는데 test3.py 실행파일의 맨 앞에 있는 프로세스 ID인 PID 번호를 찾는다. 아래 이미지처럼 말이다.

 

프로세스 ID인 PID 번호

  

PID를 찾았으면 $sudo kill -9 895 명령으로 test3.py 프로세스를 강제로 종료한다. 다시 $ps -ax 로 보면 보이지 않는다. 이렇게 하면 연결이 끊기거나 속도가 늦은 문제를 해결하는데 꼭 할 필요는 없다. 참고삼아 알아두기 바란다.

 

모두 수정했다면 $sudo reboot 명령으로 다시 부팅을 해준다. 이때 당연히 연결이 끊기게 된다. 다음으로 윈도우 환경에서 수정하는 방법을 설명한다.

 

2. 윈도우에서 수정하는 방법

 

여기서 에디터를 사용하고 실행하고 하는 과정은 어려우니 윈도우에서 설명하는 것으로 넘어가기로 한다. 

 

 

다음 윈도 탐색기 프로그램을 실행하여 프로그램 주소 줄에 \\10.0.0.5 를 입력한다.(\슬래쉬는 원자 표시임에 주의하라.) 아래 이미지처럼 나오면 pi 컴퓨터가 나오는데 이 라즈베리파이가 우리가 작업해야 할 컴퓨터다.

 

pi 컴퓨터

 

pi 컴퓨터를 두 번 클릭하면 아래와 같이 자격 증명을 요구하는 창이 뜨면

사용자 이름은 pi

비밀번호는 raspberry 를 넣어 연결한다.

 

자격 증명을 요구

 

연결하면 아래와 같은 파일 목록을 볼 수 있는데 부팅과 함께 실행하는 파일은 test3.py 프로그램이다.

 

파일 목록

 

 

이미 만들어둔 지구 이미지의 파일 이름을 아래 형식에 맞게 수정하여 라즈베리파이로 카피한다. 이미지의 해상도는 구형 19인치 모니터에 맞는 1280 * 1024 크기로 맞추어야 한다.

 

편집한 이미지 파일 이름 라즈베리파이로 카피할 이미지 파일 이름
원시영상01.jpg
원시영상02.jpg
원시영상03.jpg
원시영상04.jpg
orginimage01.jpg
orginimage02.jpg
orginimage03.jpg
orginimage04.jpg
보정과정1-1.jpg
보정과정1-1.jpg
보정과정1-1.jpg
보정과정1-1.jpg
calib01.jpg
calib02.jpg
calib03.jpg
calib04.jpg

대국민서비스영상-1.jpg
대국민서비스영상-2.jpg
대국민서비스영상-3.jpg
대국민서비스영상-4.jpg
service01.jpg
service02.jpg
service03.jpg
service04.jpg
대국민서비스영상.jpg lastimage.jpg

 

소스코드 수정은 test3.py 프로그램을 수정하고, 수정된 이미지가 있다면 파일 이름을 아래와 같이 정확히 같게 하여 pi 컴퓨터에 덮어쓰기로 수정한다.

 

아래는 처음  원시 이미지, 보정 이미지, 대국민서비스 이미지를 알기 쉽게 변환 이미지를 보여준다.

 

       

 

부팅하면서 실제 동작하는 test3.py 파이선 코드는 아래에 전체를 옮긴다. 약간 더 좋은 아이디어로 변경한 코드는 필요한 분은 연락주시기 바랍니다.  

 

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.jpg', cv2.IMREAD_COLOR)
img2 = cv2.imread('orginimage02.jpg', cv2.IMREAD_COLOR)
img3 = cv2.imread('orginimage03.jpg', cv2.IMREAD_COLOR)
img4 = cv2.imread('orginimage04.jpg', cv2.IMREAD_COLOR)
img5 = cv2.imread('calib01.jpg', cv2.IMREAD_COLOR)
img6 = cv2.imread('calib02.jpg', cv2.IMREAD_COLOR)
img7 = cv2.imread('calib03.jpg', cv2.IMREAD_COLOR)
img8 = cv2.imread('calib04.jpg', cv2.IMREAD_COLOR)
img9 = cv2.imread('service01.jpg', cv2.IMREAD_COLOR)
img10 = cv2.imread('service02.jpg', cv2.IMREAD_COLOR)
img11 = cv2.imread('service03.jpg', cv2.IMREAD_COLOR)
img12 = cv2.imread('service04.jpg', cv2.IMREAD_COLOR)
img13 = cv2.imread('lastimage.jpg', cv2.IMREAD_COLOR)

while True:
    buttonstate = GPIO.input(button_in)
	
    if buttonstate == False:
        print("LOW")
        cv2.imshow('미러 스캔 이미지', img13)
        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)
        #original image
        cv2.imshow('미러 스캔 이미지', img5)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img6)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img7)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img8)
        cv2.waitKey(2000)
        #colibration image
        cv2.imshow('미러 스캔 이미지', img9)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img10)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img11)
        cv2.waitKey(2000)
        cv2.imshow('미러 스캔 이미지', img12)
        cv2.waitKey(2000)
        #perfect image
        cv2.imshow('미러 스캔 이미지', img13)
        cv2.waitKey(1000)
        #cv2.destroyAllWindows()

 

 

 

반응형