나의 여행과 일상 일기장

(6) 캡스톤디자인 6강_조도센서, 초음파센서, 번호판인식 수정 및 프로토타입 본문

일상일기

(6) 캡스톤디자인 6강_조도센서, 초음파센서, 번호판인식 수정 및 프로토타입

똥글똥글 2022. 4. 25. 00:42
반응형

1. 파이썬 코드에서 파일 자동실행 코드( 모듈, import하여 다른 파이썬 코드의 함수 사용가능)

 

https://offbyone.tistory.com/106 블로그 참고

 

 1) serialard.py(조도센서)

import serial
import sys
from picamera import PiCamera
from time import sleep

camera = Picamera()

port = "dev/ttyACM0"
serialFromArduino = serial.Serial(port, 9600)
serialFromArduino.flushInput()

while True:
    input_s = int(serialFromArduino.readline())

    if input_s < 150 :
        camera.start_preview()
        sleep(3)
        camera.rotation = 180
        camera.capture("/home/pi/CarLicensePlate?test_img/pic.jpg")
        camera.stop_preview()
        sleep(2)
        import imgprocess2
        imgprocess2.parking_classfication("/home/pi/CarLicensePlate/test_img/pic.jpg)
    else:
        continue

serialard.py(imgprocess2.py와 결합) 조도센서, 카메라 모듈, imgprocess2.py 연동

초음파센서와 imgprocess2.py 결합 <- 이 방법은 데이터베이스 입력 에러 발생

imgprocess2.py, serialard.py, serialmicro.py를 결합하여야 한다.

https://korbillgates.tistory.com/94 블로그 참고

 

https://python-forum.io/Thread-not-supported-between-instances-of-int-and-str 비교하는 인자가 int형인지 str형인지 판단해야 한다.

 

초음파센서가 안될 때는 아두이노를 다시 컴파일하면 실행된다.

 

<<<<<<<<중간 정리>>>>>>>>

 1) 조도센서로 진입하는 차량을 인식하고 파이카메라로 사진을 찍는다.

 2) 차량이 다시 되돌아갈 수도 있기 때문에 초음파센서로 일정거리까지 올때까지 대기

 3) 차량이 일정거리로 오게 되면 주차했다고 인식하고 아까 파이카메라로 찍은 사진을 CNN과 컴퓨터비전을 이용해서 텍스트를 추출하고 데이터베이스에 저장까지 완료한다.

 

2. 라즈베리파이와 외부PC에 데이터베이스 결합

https://cccding.tistory.com/97 블로그 참고(현재 라즈베리파이ip는 xxx.xxx.xxx.xxx)

 

pc에서 라즈베리파이 서버 접속하기

아이디: pi

패스워드:1234

외부pc에서 라즈베리파이 local데이터베이스 접근이 아닌 라즈베리파이가 외부 데이터베이스에 접근할 수 있어야 한다.

 1) con_test.py(외부데이터베이스 연동)

import pymysql

conn = pymysql.connect(host='xx.xx.xxx.xxx', user='xx', password='xx', db='test_db', charset='utf8')

curs = conn.cursor()

sql = "select * from game1"
curs.execute(sql)
data = curs.fetchall()
print(data[0])
conn.close()

  //라즈베리파이와 외부데이터베이스를 연결하여 외부데이터베이스에 번호판인식으로 나온 결과값을 넣을 수 있게 하였다.

 

3. 파이썬코드에서 파일 자동실행 코드( 모듈, import하여 다른 파이썬 코드의 함수 사용가능)ver2

- 파이썬 코드에서 import를 이용해서 다른 파이썬 코드의 함수를 실행하면서 시스템의 자동화를 실현해야 한다.

- 라즈베리파이 1대가 조도센서 값, 초음파센서 값, 카메라촬영, 번호판인식을 담당하다보니 프로그램이 과부하 되는 현상이 발생했다. 그래서 sys모듈을 import한 후에 exit(1)함수를 이용해서 다음 파이썬 코드로 이동한 후에 현재의 파이썬 코드를 종료시키도록 구현해야 한다.

- 라즈베리파이 1대가 조도센서 값, 초음파센서 값, 카메라촬영, 번호판인식을 감당하다 보니 프로그램이 중간에 멈추는 현상이 발생 <- 각 파이썬 파일에 exit(1)문장을 삽입하여 다른 파이썬 프로그램이 실행될 때는 종료되도록 설정

https://hashcode.co.kr/questions/3048/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%EC%A4%91%EA%B0%84%EC%97%90-%EC%A2%85%EB%A3%8C 에러 해결

 

 1) serialard.py(조도센서&카메라 ->  초음파센서) ver2

import serial
import sys
from picamera import PiCamera
from time import sleep

camera = Picamera()

port = "dev/ttyACM0"
serialFromArduino = serial.Serial(port, 9600)
serialFromArduino.flushInput()

while True:
    input_s = int(serialFromArduino.readline())

    if input_s > 900 :
        camera.start_preview()
        sleep(3)
        camera.rotation = 180
        camera.capture("/home/pi/CarLicensePlate/test_img/pic.jpg")
        camera.stop_preview()
        sleep(2)
        import serialmicro  //조도센서-> 초음파센서
        sys.exit(1)
    else:
        continue

// 아두이노에서 라즈베리파이로 조도센서값을 받는 코드이다.

//카메라 모듈을 import하여 조도값이 900이 넘게 되면 카메라가 자동으로 촬영하고 초음파센서 인식 프로그램을 실행한다.

//다음 프로그램으로 넘긴 후 메모리 과부하를 막기 위해 프로그램을 exit한다.

 

 2) serialmicro.py(초음파센서 -> 번호판인식) ver2

import serial
import sys

ser = serial.Serial('/dev/ttyUSB0',9600)

while True:
    dustval = int(ser.readline())

    if dustval > 15 : 
        import imgprocess2    //초음파 값이 15 이상이면 초음파센서-> 번호판 인식함
        imgprocess2.parking_classfication("/home/pi/CarLicensePlate/test_img/pic.jpg") //인식한 값 저장
        sys.exit(1)
    else:
        continue

// 아두이노에서 라즈베리파이로 초음파 센서값을 받는 코드이다.

// 초음파센서값이 15보다 작으면 CNN과 컴퓨터비전을 이용한 번호판인식 프로그램을 실행시킨다.

// 다음 프로그램으로 넘긴 후 메모리 과부하를 막기 위해 프로그램을 exit한다.

 

 3) Imgprocess2.py(CNN과 컴퓨터비전을 활용한 번호판인식 후 데이터베이스에 입력)ver2

#최종 번호판 추출 함수

if __name__ == "__main__":
    parking_classfication("/home/pi/CarLicensePlate/test_img/pic.jpg")  #경로 수정가능

// 외부에서 함수 실행할 수 있게 해준다. 

 

4. 파이썬코드에서 파일 자동실행 코드( 모듈, import하여 다른 파이썬 코드의 함수 사용가능)ver3

https://eve24.tistory.com/13 블로그 참고(카메라가 2번째부터 실행 안되는 에러 해결)

 

 1) 조도센서로 인식해서 사진만 찍히고 주차하지 않고 뒤로 돌아간다면?

  -> 다시 serialard.py로 가야한다.

  -> 초음파 값이 serialmicro.py에 계속 남아있는 현상이 있다

  -> 그래서 while문이 시작할 때마다 시리얼포트를 계속 열어주는 방식으로 해결 완료하고 숫자 출력대신 한글 출력으로 가독성을 높임

 

 2) serialard.py(조도센서&카메라 -> 초음파센서) ver3

import serial
import sys
from picamera import PiCamera
from time import sleep

def sensor():
    FromArduino = serial.Serial("/dev/ttyACM0" , 9600)   #통신포트 open
    FromArduino.flushInput()
    while True:
        light = int(FromArduino.readline())
        
        if light > 900:      #자동차가 출입했을 때
            print("자동차가 출입했습니다")
            camera = PiCamera()
            camera.start_preview()
            sleep(3)
            camera.rotation = 180      #180도 회전
            sleep(3)
            camera.capture("/home/pi/CarLicensePlate/test_img/pic.jpg")   #사진 저장 경로
            camera.stop_preview()
            camera.close()
            sleep(1)
            import serialmicro
            serialmicro.micro()    #초음파로 인식 시작
            sys.exit(1)
        else:                #아무것도 없을 때
            print("현재 아무것도 들어오지 않았습니다")
            sleep(1)
            continue
        
sensor()

//코드를 함수화하여 코드에서 파일이 호출되고 종료될 때 sys.exit(1)코드를 이용해서 실행파일이 메모리에 남지 않게 하였다.

// 인식하는 중에 한글이 출력됨으로써 가독성을 높혔다.

 3) serialmicro.py(초음파센서 -> 번호판인식) ver3

import serial
import sys
from time import sleep
import os

def micro():
    while True:
        ser = serial.Serial('/dev/ttyUSB0',9600)   #while문이 계속 돌면서 통신포트 open
        microval = int(ser.readline())   #값을 아두이노에서 하나씩 받아온다.
        
        if microval < 25:  #주차완료
            print("차가 주차완료했습니다 ")
            import imgprocess2
            imgprocess2.computervision()
            #imgprocess2.parking_classfication("/home/pi/CarLicensePlate/test_img/pic.jpg")  #경로 수정가능
            sys.exit(1)    #이건 필수로 있어야 함
            return False
        elif microval >= 25 and microval < 160:   #주차중
            print("차가 주차중입니다")
            continue
        else:                             #차가 다시 뒤로 나가면 조도센서로 처음부터 다시 인식
            print("차가 나갔습니다")
            import serialard
            serialard.sensor()
            sys.exit(1)   #이것도 필수
            
micro()

// if~elif~else문을 사용하여 차가 주차중일 때의 경우를 추가하여 좀 더 유연하게 대처할 수 있도록 하였다.

// serialard.py와 마찬가지로 코드를 함수화하여 코드에서 파일이 호출되고 종료될 때 sys.exit(1)코드를 이용해서 실행파일이 메모리에 남지 않게 하였다.

//아두이노 초음파센서 코드, 조도센서 코드, CNN과 컴퓨터비전을 이용한 번호판인식 코드는 전 주와 동일하다

4) imgprocess2.py(번호판 인식) ver3

def computervision():   //함수처리
    //
    //
    //
    //
    //
 
    #최종 번호판 추출 함수

    parking_classfication("/home/pi/CarLicensePlate/test_img/pic.jpg")  #인식을 하려는 사진 (경로 수정가능)
    os.remove("/home/pi/CarLicensePlate/test_img/pic.jpg")   #찍힌 사진 삭제
    
    sleep(3)
    import serialard  //번호판 인식하고 다시 조도센서로 이동
    serialard.sensor()
    sys.exit(1)
    
computervision()

5. 간단한 프로토타입 외관 만들기ver1

 

6. 동영상

 

반응형