라벨이 python인 게시물 표시

python input timeout 설정

 Python에서 키 입력을 받을때 timeout을 주어 주어진 시간만 입력을 기다리게 하는 방법이다. 이 방법은 windows 환경에서 테스트하고 사용되었다. 다른 환경에서는 사용해보지 못했다. pip install inputimeout 사용 예는 아래와 같다. timeout인자로 timeout을 원하는 시간(초)를 설정하면 된다. from inputimeout import inputimeout, TimeoutOccurred try:     key= inputimeout(' >> ', timeout=10) except TimeoutOccurred:     key='input timeout'      print(key)

python OpenCV UI 마우스 이벤트 예제

 폰 포스트는 python에서 OpenCV.setMouseCallback를 사용하여 마우스 이벤트를 사용하는 예제코드를 싣고 있다.  OpenCV.setMouseCallback는 지정된 윈도우에 마우스 이벤트 콜백 함수를 등록하는데 사용된다. https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga89e7806b0a616f6f1d502bd8c183ad3e 콜백 함수는 다음과 같은 형식을 가진다. typedef void(* cv::MouseCallback) (int event, int x, int y, int flags, void *userdata) 마우스의 이벤트는 클릭, 더블클릭, 휠 및 마우스 이동 등을 지원한다.  cv.EVENT_MOUSEMOVE cv.EVENT_LBUTTONDOWN cv.EVENT_RBUTTONDOWN cv.EVENT_MBUTTONDOWN cv.EVENT_LBUTTONUP cv.EVENT_RBUTTONUP cv.EVENT_MBUTTONUP cv.EVENT_LBUTTONDBLCLK cv.EVENT_RBUTTONDBLCLK cv.EVENT_MBUTTONDBLCLK cv.EVENT_MOUSEWHEEL cv.EVENT_MOUSEHWHEEL https://docs.opencv.org/master/d0/d90/group__highgui__window__flags.html#ga927593befdddc7e7013602bca9b079b0 마우스 이벤트 처리 예제 코드는 아래와 같다. 특정 폴더내의 이미지 파일 리스트를 생성하고, 마우스 클릭하면 다음 이미지로 넘어가며 화면에 출력하는 예제이다. import cv2 as cv import os class show_imgs(object):   ...

numpy.einsum을 이용한 빠른 2d convolution 연산 (conv2d)예제 코드

이미지
 본 포스트는 numpy.einsum을 사용하여 2차원 합성곱 연산을 수행하는 예제 코드를 싣고 있다. 단순 연산을 사용한 2차원 합성곱 단순히 for loop를 사용하여 아래처럼 2차원 합성곱 연산을 수행할 수 있다. import numpy as np def conv2d(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel     output = np.zeros(np.subtract(image.shape, kernel.shape))          for y in range(output.shape[1]):         for x in range(output.shape[0]):             output[x, y] = (kernel * image[x: x + kernel.shape[0], y: y + kernel.shape[1]]).sum()     return output 하지만, 위 경우 image의 크기가 커지면 연산양이 많아져 수행 속도가 느려지게 된다.  numpy.einsum을 사용한 2차원 합성곱  빠른 속도의 합성곱 연산을 원한다면, numpy.lib.stride_tricks.as_strided와 numpy.einsum을 사용하면 빠른 속도로 2차원 함성곱 연산을 수행할 수 있다. import numpy as np def conv2d_np(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel        ...

OpenCV를 사용한 간단한 차선 인식 예제

이미지
본 포스트에는 OpenCV에서 제공하는 이미지 프로세싱 API들을 사용한 차선 인식하는 Python 예제 코드를 싣고 있다.  차선인식은 허프 변환(Hough Transform) 을 사용하여 도로의 차선을 구분하도록 하였다. 차선 인식을 위해 다음과 같은 이미지 처리과정이 필요하다.  - 이미지 컬러를 흑백으로 변환 - 노이즈를 제거하기 위한 blurring - 이미지에서 경계면 검출 - 허프 변환을 통해 이미지에서 선 위치 검출 - 검출된 선 위치데이터를 사용해 차선 필터링 차선 필터링은 간단하게 검출된 선의 각도만을 계산하여 필터링 하였다. 예제 코드는 다음과 같다. import math import cv2 as cv def LaneFiltering(lines):          if lines is None:         return None          Lanes = []          for i in range(0,len(lines)):         l = lines[i][0]         x1,y1,x2,y2 = l[0],l[1],l[2],l[3]         if x1 == x2:             Lanes.append([x1,y1,x2,y2])             continue         angle = math.atan((y2-y1)/(x2-x1))*180/mat...

이미지 blur와 양방향 필터링(Bilateral Filtering)

이미지
노이즈를 줄이거나 이미지를 부드럽게 보이기 위해 blurring을 사용한다.  일반적으로 커널 윈도우를 이미지 전체에서 슬라이딩하여 필터링하며 blurring한다.    많이 사용되는 필터(커널)의 형태는 다음과 같다. 1. 커널 영역 픽셀의 평균값을 사용 2. 커널 영역 픽셀의 가우스 분포 가중 평균을 사용 3. 커널 영역 픽셀의 중앙값을 사용 import cv2 as cv # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 def Blur(img, ksize=(1,1), title='Blur'):     if img is None:         return     dst = cv.blur(img,ksize)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1 def GaussianBlur(img, ksize=(1,1), title='GaussianBlur'):     if img is None:         return     dst = cv.GaussianBlur(img,ksize,0)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f...

CA-CFAR 예제 코드

이미지
 이전 포스트에서 CFAR의 원리 에 대해 알아본 적이 있다. 본 포스트에서는 Python으로 CA-CFAR에 대해 간단하게 구현한 예제를 수록하고 있다. 구현된 CA-CFAR은 아래 그림과 같이 구현되었다.   ca-cfar 코드 import numpy as np class cacfar(object):     def __init__(self, window_size, guard_size,pfa = 0.01, scale=1.0):         self.pfa = pfa         self.scale = scale         self.window_size = window_size         self.guard_size = guard_size              def cal_threshold(self, left, right):                n = len(left)+len(right)         s = np.sum(np.square(left))+np.sum(np.square(right))                  if n > 0:             T= np.power(self.pfa,(-1.0 /n)) - 1             average = s/n ...

Python OpenCV를 사용한 간단한 얼굴 위치 인식 예제 코드

이미지
 Face ID와 같은 보안이나, SNOW 같은 카메라 app에서 얼굴을 변형하거나 이미지를 보정하는 분야까지 얼굴 인식은 현재 많은 분야에 사용되고 있다. 본 포스트는 Python에서 OpenCV를 사용하여 얼굴의 위치를 감지하고, 그 위에 다른 이미지를 그리는 예제를 담고 있다.  OpenCV 튜토리얼 중 카메라 haar cascade classifier를 사용해 영상에서 사람의 얼굴 위치를 감지하는 예제가 있다.  https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html  Haar feature-based cascade classifier를 사용한 객체 감지는 Paul Viola와 Michael Jones의 논문 “Rapid Object Detection using a Boosted Cascade of Simple Features”에서 제안한 객체 감지 방법이라고 한다. 이는 검출하고자 하는 객체 이미지와 그 객체가 없는 이미지를 훈련시킨 후 다른 이미지에서 원하는 객체를 감지하는 일종의 머신 러닝의 방식이라고 한다. OpenCV를 사용하여 얼굴 위치를 인식하는 순서는 다음과 같다.  1. cv.CascadeClassifier를 사용하여 cascade classifier를 생성한다. 2. cv.CascadeClassifier.load를 사용하여 훈련된 모델의 xml파일을 로드 한다. 3. Cv.CascadeClassifier.detectMultiScale을 사용하여 이미지에서 얼굴의 위치를 감지한다. 객체 검출 모델은 훈련을 통해 만들 수 있다. ( https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html ) OpencCV에서는 이미 학습된 얼굴 감지 모델을 제공하고 있고,...

Python OpenCV를 사용하여 동영상에서 움직이는 물체 검출 예제

이미지
 본 포스트에서는 background subtraction을 사용하여 동영상에서 움직이는 물체를 검출하는 예제를 싣고 있다. 배경 제거 (background subtraction)의 원리는 아래 포스트를 참조하자. 신호에서 배경 제거(background subtraction)를 통한 움직이는 물체의 위치 검출 OpenCV에는 Background Subtractor가 구현되어 있으므로 이를 사용하였다. https://docs.opencv.org/3.4/de/de1/group__video__motion.html 코드는 아래와 같다. import cv2 as cv import numpy as np def main():          cap = cv.VideoCapture('20201110_113359.mp4')          bgs = cv.createBackgroundSubtractorKNN(dist2Threshold =500,detectShadows=False)          while cap.isOpened():         ret, frame = cap.read()                  if not ret:             break                  frame = cv.resize(frame,None,fx=0.2,fy=0.2,interpolation = cv.INTER_CUBIC) ...

Python opencv 설치와 이미지 출력 및 카메라 영상 캡쳐 예제 코드

이미지
◼ python환경 opencv 설치 anaconda conda install -c conda-forge opencv https://anaconda.org/conda-forge/opencv pip pip install opencv-python 설치 버전 확인 import cv2 as cv print(cv.__version__) 4.1.0 ◼ opencv 동작 예제 코드 OpenCV-Python Tutorials 페이지에 python에서 opencv를 사용하는 예제 코드들이 수록되어 있다. 위 예제 중 간단한 몇 가지를 실행해 봤다. 이미지 디스플레이 예제 참조 :  https://docs.opencv.org/master/db/deb/tutorial_display_image.html import cv2 as cv img = cv.imread('14793554227.jpg') if img is not None:     cv.imshow('display', img) cv.waitKey(0) cv.destroyAllWindows() 카메라 영상 캡쳐 예제 참조 :  https://docs.opencv.org/master/dd/d43/tutorial_py_video_display.html import cv2 as cv cap = cv.VideoCapture(0) while cap.isOpened():     # Capture frame-by-frame     ret, frame = cap.read()     # if frame is read correctly ret is True     if not ret:         print("Can't ...

python으로 만든 간단한 srt 자막 싱크 조절 코드

srt 파일의 싱크 조절이 필요해 간단하게 python으로 코드를 만들어 봤다. 테스트를 많이 해보진 못했지만, 싱크 조절하려 했던 파일들은 잘 동작하는 것을 확인했다.  코드는 다음과 같다. import os def srt_gettimems(line,offset):     while(line[offset].isdecimal() == False):         offset += 1         if line[offset] == '\r' or line[offset] == '\n':             return 0     hh = int(line[offset:offset+2])     mm = int(line[offset+3:offset+5])     sec = int(line[offset+6:offset+8])     ms = int(line[offset+9:offset+12])     return (hh*360+mm*60+sec)*1000+ms def srt_conv2timestr(time_ms):     ms = time_ms%1000     time_sec = int(time_ms/1000)     sec = time_sec%60     mm = int(time_sec/60)     hh = int(mm/60)     mm = mm%60     return '%02d:%02d:%02d,%03d'%(hh,mm,sec,ms) def srt_modi...

python으로 만든 wav 파일 parser 예제 코드

wav 파일 포맷에 대해 알아보면서 python으로 wave file parser를 만들었다. wave파일에 들어있는 chunk의 내용을 알아보기 위함이다. wav 파일 포맷에 대해 알아보자 python code는 아래 링크에서 받을 수 있다. wave_parser.py wave 파일은 아래 사이트에서 다운받아 테스트했다. https://en.wikipedia.org/wiki/WAV http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html 다만 표준 문서에 있는 chunk이 다 들어있는 wave 파일은 찾을 수 없어 테스트해보지 못했다.  아래는 테스트해본 sample 파일 중 stereofl.wav을 분석한 결과다. wave file path : wav/stereofl.wav chunkID: RIFF  cksize: 234270   format: WAVE hunkID: fmt   cksize: 18   wFormatTag : 3   wChannels : 2   dwSamplePerSec : 22050   dwAvgBytesPerSec : 176400   wBlockAlign : 8   wBitsPerSample : 32   cbsize : 0 chunkID: fact  cksize: 4   dwSampleLength : 7254 chunkID: PEAK  cksize: 24   version : 1   timestamp : 926175195   value : 0.5   position : 282   value : 0.44161987304687...

python winsound를 이용한 윈도우 환경에서 소리 재생 예제

 본 포스트에는 윈도우 환경에서 python의 winsound라이브러리를 이용한 사운드 재생의 예제를 싣고 있다. import winsound 특정 주파수 톤 재생 Beep를 사용하여 특정 주파수의 소리를 정해진 시간동안 재생할 수 있다. winsound.Beep(frequency, duration) 파라미터 frequency : Hz 단위며, 범위는 37Hz~32,767Hz duration : milliseconds 단위이다. example code import winsoind winsound.Beep(370,2000) wave 재생 지정된 파일, 윈도우 레지스트리에 등록된 사운드 혹은 오디오 데이터(bytes-like object)를 재생한다. 만약 sound 리소스가 없는 경우 시스템 디폴트 사운드를 재생한다.  winsound.PlaySound(sound, flags) 파라미터 sound : 파일 이름, 시스템 사운드 별명, 오디오 데이터 flags : winsound.SND_FILENAME : sound 파라미터는 wave file 이름 이며, SND_ALIAS와 함께 사용하면 안된다.  winsound.SND_ALIAS : sound 파라미터는 시스템 사운드 별명이며, SND_FILENAME와 함께 사용하면 안된다. ex) 'SystemAsterisk', 'SystemExclamation', 'SystemExit', 'SystemHand', 'SystemQuestion' winsound.SND_LOOP : 반복 재생한다. 테스트해보니 SND_ASY...

python에서 파일 읽고 쓰기 예제

이미지
python에서 파일을 읽고 쓰는 간단한 예제다. 파일 open & close open(filename, mode) 지원하는 mode는 다음과 같다. 'r' : 읽기 모드 'w' : 쓰기 모드 'x' : 파일 독점 모드로 생성, 만약 같은 이름의 파일이 있으면 'FileExistsError'에러 발생 'a' : 쓰기 모드, 파일 존재 시 새로운 쓰기는 파일 맨 끝에 추가  'b' : 바이너리 모드 't' : 텍스트 모드 '+' : 업데이트 모드 (읽기/쓰기) 파일이 없을 때 'FileNotFoundError' exception이 발생한다. 파일 열기를 성공하면, file object 를 반환한다.  파일 open은 다음과 같이 사용할 수 있다.  try:     f = open('hello.txt','r')     f.close() except FileNotFoundError:     print('FileNotFound') open에서 반환되는 file object를 사용하고 마지막 파일을 닫을 때 close()를 사용하여 파일을 닫는다. with 구문을 사용하여 파일을 open할수 있으며, with 구문을 사용할 경우 별도의 close를 수행할 필요는 없다.  with open('hello.txt','r') as f:     print(f.read()) 파일 쓰기 파일에 데이터를 쓰기위해서는 file object의 write(string)를 사용하면 된다. write(string) 파일 open시 텍스트 모드로 설정한 경우는 문자열을 입력 파라메터로 사용하고, 바이너리 모드로 설정한 경우 ...

JSON 과 python JSON encoder decoder 예제

이미지
1. What is JSON?  JSON (JavaScript Object Notation)은 경량의 DATA-교환 형식이다. 이 형식은 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하다. https://www.json.org/json-ko.html 언어에 독립적인 포멧이라 인터넷에서 자료를 주고받을 때 그 자료를 표현하는 방법으로 알려져 있다고 한다. https://ko.wikipedia.org/wiki/JSON JSON의 형식은 요약하면 다음과 같다. object  -> { "name" : value , ... } array -> [ value or array or object , ... ] value -> number, string, true, false, null, object, array JSON은 알게 모르게 많이 사용되고 있다.  예를 들어 StarCraft의 설정파일도 JSON으로 되어 있고, {     "General settings": {         "Starcraft-Active Hotkey Profile": "$device",         "Starcraft-Custom Type": "Melee"     },     "selectedSkins": "",     "selectedConsole": "",     "ShowTurnRate": false,     "MatureLanguageFilter": true,     "GameTimer": false,     "apm_Showing": false,   ...

python crc32와 polynomial과 c로 구현한 crc32

python crc32 파이썬의 standard library에서 crc32를 지원한다. zlib.crc32와 binascii.crc32 두가지가 있다.  import binascii import zlib print('binascii.crc32(\'123456789\') = ',hex(binascii.crc32('123456789'.encode('UTF-8'))&0xffffffff)) print('zlib.crc32(\'123456789\') = ',hex(zlib.crc32('123456789'.encode('UTF-8'))&0xffffffff)) 입력데이터는 bytes-like object를 사용해야 하며, 위 코드의 결과는 아래와 같다.  binascii.crc32('123456789') =  0xcbf43926 zlib.crc32('123456789') =  0xcbf43926 온라인 사이트에서 crc32 계산 결과와 같다. https://www.lammertbies.nl/comm/info/crc-calculation

python html.parser example URL에서 이미지 크롤링

이미지
 python에서 html parser가 필요해 자료를 찾아보다. 테스트를 겸해 URL에서 이미지 파일을 크롤링하는 코드를 만들어 봤다.  python에서 url의 html 가져오기  python의 urllib.request를 사용하면 특정 URL의 html을 쉽게 받아올 수 있다. https://docs.python.org/3.7/library/urllib.request.html#urllib.request.Request import urllib.request with urllib.request.urlopen('https://ryanclaire.blogspot.com') as f:         print(f.read(100).decode('utf-8')) python의 html.parser  html.parser.HTMLParser는 HTML 및 XHTML 형식의 구문을 분석하기 위해 만들어진 class이다.  https://docs.python.org/3.7/library/html.parser.html from html.parser import HTMLParser class MyHTMLParser(HTMLParser):     def handle_starttag(self, tag, attrs):         print("Encountered a start tag:", tag)     def handle_endtag(self, tag):         print("Encountered an end tag :", tag)     def handle_data(self, data):       ...

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

이미지
 band pass filter 코드가 필요해 인터넷을 검색을 해봤지만, 쓸 만한 코드와 자료가 별로 없어 그냥 만들어 쓰기로 했다. 필요한 공식은 위키피디아에 나와있다. https://en.wikipedia.org/wiki/Finite_impulse_response 1. filter 크기 FIR filter를 만들 때 filter의 크기(tpas의 크기)를 결정할 때 도움될 수식이 있다.   N=A㏈Fs / 22*Δf A㏈ : 감쇄될 db Fs : Sampling Frequency Δf : frequency bandwidth 출처 :  https://www.allaboutcircuits.com/technical-articles/design-of-fir-filters-design-octave-matlab/ def estimatefilterlen(fl,fh,fs,db):     N = int(np.round(db * fs / (22 * (fh-fl)))-1)     return N 2. Low Pass Filter [ python code ] def lowpassfilter(f,fs,N):     taps = np.zeros(N)          fc = f / fs     omega = 2*np.pi*fc     middle = int(N/2)     for i in range(N):         if i == middle:             taps[i] = 2*fc         else:    ...

python gui wxPython을 사용한 사용자 입력 다이얼로그(Dialog) 만들기

이미지
python의 gui 툴킷인 wxPython은 mfc와 유사하게 일반 wx.Frame 윈도우와 wx.Dialog 윈도우 두 종류의 윈도우를 생성할 수 있다. 본 포스트는 wx.Dialog를 기반으로 사용자 입력을 받기 위한 다이얼로그 박스를 만드는 예제를 싣고 있다. wxPython의 설치 방법은 아래 포스트를 참조하자. python gui wxPython 설치 common Dialogs - TextEntryDialog wxPython에는 몇 가지 일반적으로 필요한 다이얼로그 박스들을 제공한다. 색상 선택, 파일 선택, 메시지 다이얼로그 등이 있다. [ https://docs.wxpython.org/common_dialogs_overview.html ] 그 중 TextEntryDialog을 사용하면 간단하 사용자의 text 입력을 받을 수 있다. import wx def get_text():     data = None     dlg = wx.TextEntryDialog(parent=None,message='input text')     try:         if dlg.ShowModal() == wx.ID_OK:             data = dlg.GetValue()             print(data)     finally:         dlg.Destroy()          return data if __name__ == '__main__':     app = wx.App()   ...