반응형

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다.

준비과정이 필요하신 분들은 전 글을 참고하시면 됩니다.

 

maxtime1004.tistory.com/37

 

[PYTHON] tesseract를 이용한 자동차 번호판 인식기 - 1

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다. 저는 아래의 영상을 통해 도움을 얻었고 해당 영상에도 링크에 깃허브 주소가 있으니 참고하실 분들은 아래 링크

maxtime1004.tistory.com

 

 

˙ 코드 및 실행 결과 

 

전체 코드는 더 많은 내용을 담고 있기 때문에 대략적으로 간단히만 설명 드리겠습니다. 전체 코드는 아래 깃허브에서 확인하실 수 있습니다.

github.com/dpwls64/tesseract_project

 

dpwls64/tesseract_project

Contribute to dpwls64/tesseract_project development by creating an account on GitHub.

github.com

 

1. 자동차 번호판 위치 알아내기

 

- 원본 이미지

 

- 이미지 흑백화

gray = cv2.cvtColor(img_ori, cv2.COLOR_BGR2GRAY)

 

- 가우시안 블러 : 노이즈 줄이기

img_blurred = cv2.GaussianBlur(gray, ksize=(5, 5), sigmaX=0)

 

- 스레시 홀드 : 이미지 구별 쉬움 (흑색, 흰색)

img_thresh = cv2.adaptiveThreshold(
    img_blurred, 
    maxValue=255.0, 
    adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
    thresholdType=cv2.THRESH_BINARY_INV, 
    blockSize=19, 
    C=9
)

가우시안 블러를 이용하여 이미지를 흐릿하게 만들어 노이즈를 줄여주고,

스레시 홀드를 이용하여 이미지를 검정색, 흰색으로만 표현하여 컴퓨터가 구별하기 쉽게 만들어 줍니다.

 

 

- 윤곽선 찾기

contours, _ = cv2.findContours(
    img_thresh, 
    mode=cv2.RETR_LIST, 
    method=cv2.CHAIN_APPROX_SIMPLE
)

 

- 윤곽선 중 사각형 찾기

for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(temp_result, pt1=(x, y), pt2=(x+w, y+h), color=(255, 255, 255), thickness=2)

찾은 사각형 중에서 점차적으로 번호판과 가깝다고 생각하는 사각형들을 찾습니다.

 

- 번호판 각도 돌리기

 rotation_matrix = cv2.getRotationMatrix2D(center=(plate_cx, plate_cy), angle=angle, scale=1.0)
 img_rotated = cv2.warpAffine(img_thresh, M=rotation_matrix, dsize=(width, height))

비뚤어져 있는 번호판을 일자로 되도록 돌리고, 이미지를 더 선명하게 해줍니다.

2. 번호판 글자 인식하기 (tesseract)

chars = pytesseract.image_to_string(img_result, lang='kor', config='--psm 7 --oem 0')

result_chars = ''
has_digit = False
for c in chars:
if ord('가') <= ord(c) <= ord('힣') or c.isdigit():
if c.isdigit():
has_digit = True
result_chars += c

숫자와 한글로 이미지를 인식하여 결과를 추출합니다.

반응형
반응형

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다.

저는 아래의 영상을 통해 도움을 얻었고 해당 영상에도 링크에 깃허브 주소가 있으니 참고하실 분들은 아래 링크를 확인하시면 됩니다.

 

www.youtube.com/watch?v=PpTl7xxGXh4

<빵형의 개발도상국 - 자동차 번호판 인식기>

 

 

˙ 준비 과정 

 

- pytesseract 설치

 

anaconda 창이나 cmd창을 이용하여 아래의 명령어를 통해 패키지를 설치합니다.

pip install pytesseract

 

 

- tesseract-OCR 설치

 

github.com/UB-Mannheim/tesseract/wiki

 

UB-Mannheim/tesseract

Tesseract Open Source OCR Engine (main repository) - UB-Mannheim/tesseract

github.com

 

위의 링크로 들어가서 자신의 PC의 맞는 파일을 다운로드 합니다. 저는 64bit를 다운받았고, 설치 경로는 바꾸지 않고 기본 경로로 설치합니다.

<다운로드 파일 선택>

 

 

- kor.traineddata 넣기

 

파일을 다운받아 아래의 경로에 추가합니다. 파일과 전체코드는 아래 깃허브에서 다운받으실 수 있습니다.

github.com/dpwls64/tesseract_project

 

dpwls64/tesseract_project

Contribute to dpwls64/tesseract_project development by creating an account on GitHub.

github.com

[ 파일경로 ]  C:\Program Files\Tesseract-OCR\tessdata

 

 

- 환경변수 설정

제어판 - 시스템 및 보안 - 시스템
고급시스템 – 환경변수 – 시스템변수 – Path 맨 위에 C:\Program Files\Tesseract-OCR 추가

 

준비과정은 여기까지입니다. 코드 설명 및 실행 결과는 다음 글에서 확인하실 수 있습니다!

maxtime1004.tistory.com/38

 

[PYTHON] tesseract를 이용한 자동차 번호판 인식기 - 2

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다. 준비과정이 필요하신 분들은 전 글을 참고하시면 됩니다. maxtime1004.tistory.com/37 [PYTHON] tesseract를 이용한 자동차 번

maxtime1004.tistory.com

 

반응형
반응형

※ 본 내용은 완전한 정답이 아닐 수 있고 개인의 기준에 맞춰 작성한 코드입니다. 참고만 해주세요 ! 

 

▶  문제 설명  ◀

 

사용언어 : ORACLE

 

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. 

ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

 

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요.

이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

<ANIMAL_INS TABLE>
<테이블 예시>

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME;

 

반응형
반응형

※ 본 내용은 완전한 정답이 아닐 수 있고 개인의 기준에 맞춰 작성한 코드입니다. 참고만 해주세요 ! 

 

▶  문제 설명  ◀

 

사용언어 : ORACLE

 

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.

 ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는

각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

 

보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다.

동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요.

이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.

 

<ANIMAL_INS TABLE>
<테이블 예시>

 

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE LOWER(NAME) LIKE ('%el%') AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME;
반응형
반응형

안녕하세요! 오늘은 selenium을 이용한 간단한 웹 크롤링입니다.

 

 사전 준비 

 

- selenium 설치

   selenium이 설치가 안되신 분들은 pip install selenium 으로 먼저 설치합니다.

 

- chromedriver 설치

크롬 - 더보기 - 도움말 Chrome 정보에 가시면 자신의 Chrome 버전이 나와있습니다.

버전에 맞게 chromedriver를 설치합니다.

 

 

 크롤링 

 

- 원하는 페이지로 들어갑니다. 저는 아래의 기사를 이용하였습니다.

news.v.daum.net/v/20210329142236043

 

삼성 '갤럭시S21' 국내 판매 100만 대 돌파.. "가격 인하책 통했다"

삼성전자 '갤럭시S21' 시리즈의 국내 판매량이 출시 57일 만에 100만 대를 돌파했다. 이는 전작인 '갤럭시S20'의 판매 기록을 한 달가량 앞당긴 것이다. 갤럭시S21은 삼성전자 5세대(5G) 스마트폰 가운

news.v.daum.net

 

- 가져올 내용을 아래와 같이 copy 합니다 (selector 사용)

<기사 본문 Copy>

 

- 해당 기사의 주소와 Copy selector를 넣어주면 기사 본문을 가져오게 됩니다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('chromedriver') 
driver.implicitly_wait(1)

driver.get("https://news.v.daum.net/v/20210329142236043") #기사 주소
driver.implicitly_wait(1)

elem = driver.find_element_by_css_selector("#harmonyContainer") # Copy한 selector

print(elem.text)

반응형
반응형

안녕하세요! 오늘은 JAVA로 만든 숫자야구 게임입니다.

 

˙ 숫자야구 규칙 

 

(1) 사용자의 입력숫자 4개에 대해서 숫자와 위치를 체크하여 결과 반환

      (숫자만 일치 : Ball / 숫자와 위치 둘다일치 : Strike)

 

(2) 스트라이크가 4개이면 우승으로 판정 

 

(3) 게임의 시도횟수가 10번 초과하면 실패(게임오버) 판정

 

 

˙  코드 

 

게임의 정답을 생성하는 메서드(임의의 중복되지 않은 4개의 숫자)

public ArrayList<Integer> random(){
      HashSet<Integer> ans = new HashSet<>();
      int cnt = 0;
      while(ans.size() < 4){
    	  if(cnt == 0){
    		  ans.add((int)(Math.random() * 9 + 1));
    		  continue;
    	  }
    	  ans.add((int)(Math.random() * 10));
         cnt ++;
      }
      ArrayList<Integer> answer = new ArrayList<>(ans);
      return answer;
   }

 

user로부터 4개의 입력을 받는 메소드 

   public String input(){
      System.out.println("------------------------------------");
      System.out.println("정답을 입력해 주세요.(숫자 4자리)");
      Scanner sc = new Scanner(System.in);
      while(true){
    	  int cnt = 0;
    	  String input = sc.next();
    	  Set<Character> unique = new HashSet<>();
    	  for(int i=0; i<input.length(); i++){
    		  if(!unique.add(input.charAt(i))){
    			  cnt++;
    		  }
    	  }
    	  
    	  if(input.length() != 4){
    		 System.out.println("0~9 사이의 숫자 4자리를 입력해 주세요.");
    	  }else if(input.charAt(0) == '0'){
    		  System.out.println("첫번째 자리에는 0이 올 수 없습니다. 다시 입력해 주세요.");
    	  }else if(cnt != 0){
    		  System.out.println("중복된 숫자가 존재합니다. 다시 입력해 주세요.");
    	  }else{
    		  try{
    			  Integer.parseInt(input);
    			  return input;
    		  }catch(Exception e){
    			  System.out.println("숫자만 입력해 주세요.");
    		  }
    	  }
      }

   }

 

정답 판별 메서드

   int chk(ArrayList<Integer> answer){
      int ball = 0;
      int strike = 0; 
      int cnt = 1;
      
      
      while(true){
    	  ArrayList<Integer> userInput = new ArrayList<>();
    	  
    	  if(cnt > 10){
    	      System.out.println("***********************************");
    		  System.out.println("시도 횟수 초과 !! Game Over T^T");
    	      System.out.println("***********************************");

    		  return -1;
    	  }
    	  
    	  
    	  String input = input();
    	  
    	  System.out.println("===================================");
    	  System.out.println(cnt + "번째 시도" + "\t");
    	  System.out.println("===================================");

    	  System.out.println("내가 입력한 정답 : " + input);
    	  for(int i=0; i<input.length(); i++){
        	  userInput.add(input.charAt(i)-'0');
          }
	      for(int i=0; i<answer.size(); i++){
	         if(answer.contains(userInput.get(i))){
	        	 if(answer.get(i) == userInput.get(i)){
	    		  strike++;
	    		  continue;
	        	 }
	         ball ++;   
	         }
	      }
	      if(strike == 4){
	    	  System.out.println();
	    	  System.out.println("♬  정답입니다 :) ♬");
	    	  System.out.println();

	    	  return cnt;
	      }
	      System.out.println(ball + " Ball");
	      System.out.println(strike + " Strike");
	      ball = 0;
	      strike = 0;
	      cnt++;
	   }
   }

 

전체 코드는 아래 깃허브에 올려놓았으니 필요하신 분들은 확인하시면 됩니다.

github.com/dpwls64/baseballgame

 

dpwls64/baseballgame

Contribute to dpwls64/baseballgame development by creating an account on GitHub.

github.com

 

반응형

'코딩 기록 > JAVA' 카테고리의 다른 글

[JAVA] SVN LOCK 해제 방법  (0) 2022.05.09
반응형

안녕하세요! 오늘은 카카오페이 API 사용법에 대해 소개해 드리겠습니다.

저는 Flask를 활용하여 단건 결제를 구현해보았습니다.

카카오개발자 홈페이지에 들어가면 API 종류 별 설명을 보실 수 있습니다.

카카오 개발자 홈페이지에서 자세한 정보를 보고 싶은 분들은 아래 링크를 통하여 보시면 되고, 전체코드는 아래 깃허브에 올려놓겠습니다.

 

https://developers.kakao.com/docs/latest/ko/kakaopay/common

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

github.com/dpwls64/KAKAO-API

 

dpwls64/KAKAO-API

Contribute to dpwls64/KAKAO-API development by creating an account on GitHub.

github.com

 

˙  실행 과정 

 

 

˙  코드 설명 

 

해당 URL로 필수 요소들을 적어 보내주면 필요한 정보들을 받게 되고,  상태에 따라 approval_url / cancel_url / fail_url 로 이동하게 됩니다.

 

˙  실행 화면 

 

<QR 코드 또는 카톡 메시지로 결제가 가능합니다.>

 

<결제 화면>


 

<결제 완료>


사용자가 결제 도중 창을 닫게 되면 결제 취소가 됩니다.

<결제 취소>


결제하기 버튼을 누른 후 15분이 경과하면 결제 만료가 됩니다.

<결제 만료>

반응형
반응형

˙ 이미지의 가로, 세로 크기를 지정 

img{
	width : 100px;
	height : 200px;
}

 

˙ div 태그의 테두리를 지정 

div{
	border : 2px solid red;
}

 

˙ p태그의  글자크기와 글자색을 지정 

p{
	font-size : 1.5em;
	color : red;
}

 

˙ a링크 태그의 밑줄이 나타나지 않도록 설정 

a{
	text-decoration: none;
}

 

˙ 여러개의 div 옆으로 배치 

div{
	display : inline-block;
}

 

˙ id가 aa 인 요소의 글자 정렬을 가운데 로 지정 

#aa{
	text-align : center;
}

 

˙ pre 태그의 위쪽과, 아래쪽 테두리를 지정 

pre{
	border-top : 2px solid blue;	
	border-bottom : 2px solid red;
}

 

˙ span 태그를 검정색 배경에 하얀색 글자로 지정 

span{
	background : black;
	color : white;
}

 

˙ table의  안쪽 각 셀의 테두리를 합치기 

table{
	border-collapse : collapse;
}

 

˙ table의 각 셀간의 여백(공백)을 지정 

table{
	border-spacing : 10px;
}

 

˙ div의 안쪽여백과 줄간격을 지정 

div{
	padding : 10px;
	line-height : 1em;
}

 

˙ div와 div사이의 여백을 지정 

div{
	margin : 20px;
}

 

˙ button의 배경색과 둥근 테두리를 지정 

button{
	background : red;
	border : 3px solid gray; 
	border-radius : 55%;
}

 

˙ p태그의 글자를 굵게 지정 

p{
	font-weight : bold;
}

 

˙ 아이디가 tab1인 table 의  후손 td의 문자열를 가운데로 정렬 

#tab1 td{
	text-align : center;
}

 

˙ 클래스가 tta인 요소의 테두리의 폭은 10px  테두리의 색상은 green 으로 지정 

.tta {
	border : 10px solid green;
}

 

˙ div의 안쪽여백과 바깥쪽여백을 지정, 내용이 테두리 밖으로 벗어났을때 scrollbar가 생기도록 설정 

div{
	margin : 10%;
	padding : 10%;
	overflow : auto;
}

 

˙ p태그와 span태그를 동시에  글자크기 지정 

p,span{
	font-size : 2.0em;
}

 

˙ ul  리스트 스타일을 검정 사각형으로 변경 

ul{
	list-style-type : square;
}

 

˙ a 태그의 글자간격을 지정 

a{
	 letter-spacing : 10px;
}
반응형

+ Recent posts