Python 으로 사진의 시정거리 파악하기 2편

안녕하세요

생각보다 일찍 개발을 끝내게 되어서 바로 2편을 올리게 되었습니다.

1편에서는 카메라 이미지의 콘트라스트 값을 가져와서 어디까지가 잘 보이는지 체크하는 과정이었다면

2편에서는 잘 보이는 영역이 여기부터 얼마나 떨어져있는지 체크하는 과정입니다.

우선 이미지의 영역마다 이곳이 몇 km 지점인지 맵핑하는 과정이 필요합니다.

사진의 빨간선 오른쪽을 자세히 보면 거리가 적혀있는것을 볼 수 있습니다.

이와 같은 맵핑을 하기 위해서 csv 파일을 만들어서 이미지의 어느 부분이 몇 m 지점인지 맵핑하는 과정을 거쳤습니다.

csv 파일을 예시로 들면 이렇습니다.

3000,10000 – 이미지의 height 를 10000으로 나눈것중 위에서 3000번째 지점이 10,000m 라고 지정해준것입니다.

5000,3000 – 이미지의 height 를 10000으로 나눈것중 위에서 5000번째 지점이 3,000m 라고 지정해준것입니다.

이런식으로 맵핑을 한 뒤 이미지를 분석하면 아래와 같은 결과가 나오게 됩니다.

저 멀리 보이는 산이 6000m 떨어져있고 그 바로 아래에 있는 맵핑 선이 1200m 였기 때문에 그 중간에 있는 Distance Line 이 대략 3631.75m 라고 판단하게 된 것입니다.

카메라의 높이가 낮아서 멀리있는 물체가 잘 보이지 않아 아주 정확하지는 않지만 꽤 쓸만한 정도로 보입니다.

다만 저 멀리있는 산과 오른쪽에 가까이 있는 산과 같은 선 상에 있기 때문에 안개낀날 거리상의 오류가 발생할수 있어서 타겟팅할 영역에서 저 오른쪽 가까이 있는 산을 빼고 타겟팅을 하는것이 옳아보입니다.

여기까지 2편이었습니다.

다음 3편은 실제 비행장에 카메라를 설치하고 시정을 측정하기 위해 셋팅하는 과정을 담아보겠습니다.

Python 으로 사진의 시정거리 파악하기

안녕하세요,

최근 교육받고 있는 항공교육기관의 기상정보시스템을 만들어볼까 해서 여러모로 알아보고 있습니다.

그중에 비행을 할지 말지 결정하는 가장 중요한 정보중 하나인 시정거리(가시거리)에 대해 이야기 해보려 합니다.

경비행기는 보통 비행 시작전 시정거리가 짧아 위험하다고 생각되면 비행을 하지 않습니다. IFR(계기비행/계기판을 보며 비행하는 방식) 로 비행하면 비교적 안전할수는 있겠지만 여객기와 같은 안전장비가 모두 탑재된 환경이 아니기때문에 VFR(시계비행/주변을 눈으로 보며 비행하는 방식) 환경이 충족되지 않으면 비행을 나가지 않는 경우가 많습니다.

따라서 그만큼 중요한 시정거리를 비행장이나 공항을 가기전에 미리 파악할수 있다면 굳이 비행장까지 가지 않아도 되니 편하지만 시정거리를 측정하는 장비의 가격이 대당 1000만원이 넘어 소형 비행장에서는 쉽게 설치하지 못하는 상황입니다.

일반 공항에서 사용하는 시정거리 측정계는 짧은 거리에서 빛을 투과시켜 통과되는 빛의 양을 측정하여 이 정도면 몇 km 까지 보일것이라는 공식을 가지고 측정하는것으로 알고 있습니다.

우리에게는 눈이 있어서 눈으로 보고 이 정도면 몇 km 정도까지 보이는구나 할 수 있지만 컴퓨터로는 쉽지 않습니다.

그래서 영상처리를 이용하여 안개나 해무, 미세먼지 등을 감지하여 가장 멀리 보이는 곳을 파악하는 Python 프로그램을 만들었습니다.

Github 링크 : https://github.com/taylor224/visibility_detection_system

 

이 프로그램은 Contrast 방식으로 제작되었으며, 이미지의 콘트라스트 값을 가지고 가장 콘트라스트 값들이 높은 곳의 위치를 찾는 프로그램입니다.

보통 이미지의 윗부분이 거리가 가장 멀고 아랫부분이 거리가 가깝기 때문에 이 프로그램도 위에서 아래로 내려가며 물체가 보이는 위치를 찾게 제작되었습니다.

본 사진은 맑은 날 촬영된 사진으로 아주 멀리있는 산까지 보이는것을 확인할수 있습니다.

하지만 본 사진의 윗부분 부터 처리를 하게 되면 하늘이 측정범위에 들어가기 때문에 아래와 같은 타겟팅을 해주어 하늘을 제외하고 땅만 처리하도록 해줍니다.

흰색 부분만 분석하도록 프로그램을 제작하였고 선명하게 보이는 곳을 찾기 위해서 콘트라스트 분석을 진행합니다.

해당 분석을 진행한 이미지 결과입니다.

위 사진에서 보시다시피 타겟으로 지정된 땅 부분을 위에서부터 아래로 내려가며 가장 선명한 부분을 찾기 때문에 가장 윗쪽이 선택된 것을 볼 수 있습니다.

그럼 최종 결과값을 보면 이렇게 됩니다.

위 사진을 보면 시정거리가 거의 맞게 표시가 된 것을 볼 수 있습니다.

 

그럼 안개낀 날을 보겠습니다.

본 사진의 윗부분은 안개와 미세먼지로 가려져 잘 보이지 않는것을 볼 수 있습니다.

그럼 본 사진을 콘트라스트 분석을 통해 분석하면 아래와 같은 결과가 나오게 됩니다.

눈으로 보일락말락 하는 정도의 수준에서 시정거리를 측정한것을 볼 수 있습니다.

그럼 실제 이미지에 합성한 최종사진을 보겠습니다.

아주 정확하진 않지만 대략적으로 맞는것을 볼 수 있습니다.

카메라 성능과 위치, 주변환경에 따라 시정거리 측정 감도가 달라질수 있으므로 해당 프로그램에서는 해당 감도를 조절할수 있도록 구현해놓았습니다.

보통 시정거리를 측정하는 카메라는 고정되어 설치되기 때문에 처음 한번만 셋팅해주면 건들일 일은 별로 없을것으로 보입니다.

 

지금까지 구현된것은 이미지를 영상처리 하여 보이는 곳까지를 표시하는 것이었고 앞으로 구현해야 될 것은 이미지의 위치들을 실제 거리와 맵핑하여 해당 위치가 현재 위치에서 몇 km 떨어진 곳인지를 알 수 있도록 하여 최종적으로 오늘의 시정거리가 몇 km 인지 파악할수 있도록 하는 것 입니다.

그건 2편으로 찾아뵙겠습니다!

 

본 프로그램은 본 Github 를 참고하여 제작되었습니다.https://github.com/ZhengPeng7/detect_visual_limits

시프티 연장근로수당 계산기

안녕하세요

제가 근무하고 있는 회사에서 최근 근무관리시스템으로 시프티(Shiftee) 라는 시스템을 도입하였습니다.

주 52시간제를 도입하면서 같이 도입하게 되었는데 이와함께 연장근로수당이 생겼습니다.

그래서 연장근로수당을 쉽게 계산할수 있는 시프트 연장근로수당 계산기 크롬 익스텐션을 만들었습니다.

시프티에 한번 로그인 하신 이후에 불러오기를 누르시면 해당 월의 연장근로수당을 자동으로 계산하여 보여주게 됩니다.

연봉 정보와 시급 정보는 해당 사용자의 컴퓨터에만 저장되며 별도로 전송되거나 수집되지 않습니다.

사용하시면서 문제가 있을 경우 개발자 이메일로 문의 부탁드립니다.

참고로 제 연봉은 1억이 아니오니 놀라지 마시기 바랍니다.

 

https://chrome.google.com/webstore/detail/%EC%8B%9C%ED%94%84%ED%8B%B0-%EA%B3%84%EC%82%B0%EA%B8%B0/hcdhhcfinhjpdedhlkeaafncegehjbce?hl=ko&authuser=0

 

Solve media file streaming issue with Python Flask

This is how to solve mobile file streaming issue with Python Flask.

If you serve video file with Python Flask, Flask serve the media file with 206 Partial Content, but Connection is set to Close. If you want to serve media file like streaming service, Python Flask cannot serve to iOS or Android media file like streaming.

On iOS or Android phone, browser said can not play this media file like this image.

To solve this problem, you should serve media file with Connection: Keep-Alive.

But Python Flask does not support this feature.

So Here is a solution.
It needs Nginx and Gunicorn.
Nginx will serve the media file, but it will prevent to access from not authorized access using “internal” function in Nginx.
“internal” function allows you to accept traffic only from the Python Flask code(not direct access).

The media file serving flow
User -> Nginx -> Gunicorn -> Authentication check and redirect to serve media file -> Response Media Data from Nginx

Nginx Config

server {
listen 80;
server_name yourserver.com;

location /download_file/ {
internal; # Receive only internal redirect
alias /file/path/in/your/server/;
}

# For Gunicorn Serving Gateway
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

if (!-f $request_filename) {
proxy_pass http://localhost:12345;
break;
}
}
}

Python Code

@app.route('/download/')
def download(filename):
if not authentication():
abort(404)

redirect_path = '/download_file/' + filename

response = make_response("")
response.headers["X-Accel-Redirect"] = redirect_path
response.headers["Content-Type"] = mimetypes.guess_type(filename)
return response

Then iOS and Android browser can play the media file served from your server.

Reference :
1. http://stackoverflow.com/questions/19421014/error-occurred-in-mobile-when-send-video-using-send-file-in-python-flask
2. http://mattspitz.me/2013/11/20/serving-authenticated-media-with-nginx.html

티스토리에서 워드프레스로 이전하기

티스토리가 2016년 12월 부터는 백업기능의 지원을 중단하여 블로그 백업을 할 수 없게 되었습니다.
저 또한 워드프레스로 블로그를 이전하면서 이 영향을 받았는데요, 기존에 받아놓은 백업파일이 전혀 없어 다른 방법을 찾아야 했습니다.
Github 나 Gist 를 검색을 해보아도 아직까지 다른 방법을 올려놓은 분들이 계시지 않아 직접 만들게 되었습니다.
아마 다른 방법을 찾을수 있는 분들은 이미 워드프레스로 옮기셨거나 블로그를 접으신것 같습니다.

티스토리에서 워드프레스로 블로그를 이전하는 방법은 Github Gist 에 작성해서 올려놓았습니다.
아래 주소에서 확인하실수 있습니다.

다만 개발에 대한 지식이 없으시면 진행하기 많이 힘듭니다.
Python 과 SQL 과 웹서버에 대한 이해가 필요합니다.

https://gist.github.com/taylor224/5eef306afaef7a7a136c66daecba6e41

본 글에 대한 별도의 문의는 받지 않습니다.