'전체 글'에 해당되는 글 42건
- 2021.10.28 21OCT28
- 2021.10.10 일요일을 혼자 보내는 방법.
- 2021.09.08 opencv SimpleBlobDetector, blob size 정리
- 스케줄러 사용을 다시 시작해야겠다는 생각을 했다.
학부생 때는 스타벅스 다이어리를 애용했는데 언젠가부터 스타벅스 굿즈가 인기몰이를 시작한 후로 다이어리 구하기가 어려워지자 스케줄러 사용도 같이 그만둬 버렸다. 일정은 구글 캘린더를 사용해 관리를 하고 있지만, 실험 프로젝트를 짜거나 하루 생산성을 되돌아보는 용도로는 턱없이 부족하다. 일전에 프랭클린플래너를 사용해본 적이 있었지만 일정과 스케줄의 경계가 애매해지고 들고다니는 것이 불편해지자 효용이 사라졌다.
프랭클린플래너의 사용법도 회사원이 아닌 나에게는 전혀 맞지 않았고, 일정 관리 관련 자기개발서는 절대 읽고 싶지 않기에 나만의 계획법을 구상하다가 몇 가지 항목들을 생각해보았다.
* Daily
- 오늘 하려고 계획했던 일
- 실제로 오늘 한 일
- 실제로 오늘 했으면 좋았던 일 (우선순위 적으로)
- 계획대로 일을 하지 못한 원인
- 개선방안
* Monthly
- 다가오는 일
- 각각 준비에 걸리는 subgoal과 그 기간
* Yearly
- 취미의 다양성
TRPG에, 악기에, 소설에 너무 다양한 취미들을 누리려 하니 취미가 하나의 일처럼 뭉쳐진것 같다는 느낌을 받았다. 취미 계획(?)도 필요하지 않을까.
일요일을 혼자 보내는 방법.
아침의 늑장은 대게 이유가 있는 법이다. 누군가는 원래 아침은 체질상 약하다고 이야기 할 수 있겠지만, 과연 그도 소풍 전날, 새벽 비행기 타기 전날 보통날처럼 늑장을 부릴까. 약속이 없으며, '쉬는' 일정조차 없는 일요일. 전날 11시에 누웠음에도 불구하고, 8시에 이미 깨어있었음에도 불구하고, 자동 조명 장치가 8시 45분에 맞춰 모든 불을 켰음에도 불구하고, 오후 2시가 되어서야 침대에서 기어 나올 수 있었다.
창문을 너무 오래 닫고 있어서 산소 농도가 떨어졌나 하고 손목의 스마트 워치를 봤지만 디스플레이에는 높은 산소 포화도가 적혀있었고, 바디 배터리 값은 4시간 전부터 100%를 유지하고 있었다. 자취 초반에는 이러한 일이 익숙했다. 그 당시 연애를 하지 않아서도 있었겠다만 통학으로 버려진 시간만큼 하루가 길어져 주말에는 이렇다 할 일이 남아있지 않았다.
세수를 하면서 냉장고 내용물을 기억해내며 아침을 결정, 감동란 두 알과 베이컨, 토마토 주스다. 이정도 메뉴면 평상시 아침에 비해 과하게 호화로운 편. 아 점심이니 딱히 그렇지도 않으려나. 전날에 설거지하다 남긴 식기를 정리하며 아침, 아니 점심을 같이 준비했다.
'늑장의 이유는 역시 커피를 마시지 않았기 때문'이라는 핑계를 막기 위해 식사 후 커피부터 내렸다. 저 우악스러운 커피콩 가는 소리는 알람시계 대용으로 써도 되지 않을까 하는 생각을 하며 필터지와 드리퍼를 준비했다. 핸드드립 주전자는 팔을 끝까지 뻗어야 닫는 위치에 있으니 쓰지 말자. 팔을 반의 반만 뻗은 위치에 있던 전기포트의 물을 바로 담아 아침커피를 내렸다. 그래, 먹은 것은 점심이지만, 커피는 아침커피이다.
어제부터 필터가 막혀 작동을 멈춘 수족관 여과기를 청소하고, 일주일치 옷들의 다림질을 마치고 화장실을 호텔처럼 바꿔두니 3시 50분을 넘어가고 있었다. 오늘을 위해 넣어둔 샴페인을 누구랑 마실까 생각을 하다가 불렀을 때 올 수 있는 사람이 없다는 생각에 미치자 책을 한권 가방에 우겨넣고 무작정 밖으로 나왔다.
일요일을 혼자 보내는 방법. 정말 어려운 주제이다. '일요일을 보내는 방법'과 '혼자 시간을 보내는 방법'의 두 가지가 겹쳐졌으니 말이다. 아이러니하게도 일요일이 아닌 날에는 일요일을 보내고 싶어하며, 약속과 연구 미팅이 잡힌 당일에는 막상 혼자있고 싶어하는데 이 두 가지가 합쳐지니 당혹스럽기 짝이 없다. 마치 민트초코마냥 둘이 섞이니 (사람에 따라 생각이 다르겠지만) 기어오는 혼돈이 탄생했다.
이럴 때에는 무언가 생산적인 일을 하러간다고 변명이 되는 서점이 최고다. 저녁 식사도 같이 외부에서 마칠 생각이었기 때문에 강남 교보문고를 선택했다. 역 근처 일본 스파게티 집에서 리조또를 먹고 서점으로 향했다. 요리에 나왔던 향신료를 찾아보고 싶어서 요리책 코너를 서성이다가 결국 미스테리/스릴러 서적 코너에 종착했다. 얼마 전 배송비를 아끼기 위해서 함께 구매했던 책이 매대 위에 올라와있는 것을 보고 스스로의 탁월한 선택에 실웃음을 짓고 산 책과 죽은 책의 비율을 잠시 생각한 뒤 빈손으로 카페를 찾았다.
마음 같아선 최근 참여하게 된 TRPG모임 사람들과 게임도 하고 맥주도 같이 마시고 싶었는데 지금이 딱 시험기간이라 그런지 다들 여유롭지 않은가보다. 시험 전에 모임을 한번 잡아보려고 운을 띄웠으나 펌블이 나와버렸다. 다음에 시험 끝난 누군가가 방을 살릴 때까지 조용히 있어야겠다.
할일은 많지만 10월 10일 일요일을 다른 무언가를 하기 위한 날이 아니라 순전히 일요일 그 자체로 즐기고 싶었다. 결국 남은 것은 책 세 챕터를 읽은 것과 이 글 뿐이지만 IT 정보만 가득한 죽 같은 블로그에 감정 한 조각을 올렸다는 것으로 만족해야겠다.
'Mind Storage > Short Thoughts' 카테고리의 다른 글
21DEC12 (0) | 2021.12.12 |
---|---|
[키워드 에세이] 즐거움 (0) | 2021.11.25 |
자취방 생필품 리스트 (3) | 2019.03.01 |
1. SimpleBlobDetector
parameter로 넣어준 조건에 따라 blob을 찾아줌.
알고리즘
- source image에 threshold를 적용.
- parameter에 넣은 minThreshold 값(포함)과 maxThreshold 값(불포함) 사이를 thresholdStep으로 나누어 각각의 threshold를 사용해서 binary image로 바꾼다. 처음부터 binary를 넣어주려는 경우 기본 파라미터에서는 minThreshold=50, maxThreshold=220, thresholdStep=10 으로 설정이 되어있기에 이를 만져주어야 한다.
binary image를 0과 255로 구성되도록 설정하고, minThreshold=253, maxThreshold=255, thresholdStep=1로 설정하면 최소한의 threshold 연산만 사용할 수 있다. - 각각의 binary image에 대해서 findContours 함수를 적용해서 center를 계산.
- 각각의 binary image에서 찾은 contour들을 하나로 묶어줌.
이때 minDistBetweenBlobs parameter를 사용한다. - 찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정. 이를 keypoint로 return
예시코드
import cv2 as cv
parameter = cv.SimpleBlobDetector_Params()
parameter.filterByArea = True
parameter.filterByConvexity = True
parameter.filterByCircularity = True
parameter.filterByInertia = False
parameter.filterByColor = False
parameter.minArea = 500 # this value defines the minimum size of the blob
parameter.maxArea = 10000 # this value defines the maximum size of the blob
parameter.minDistBetweenBlobs = 1 # not used in binary image
parameter.minConvexity = 0.3
parameter.minCircularity = 0.3
detector = cv.SimpleBlobDetector_create(parameter)
detected_blob = detector.detect(denoised_mask)
print(len(detected_blob))
2. keypoint size
keypoint는 pt 값과 size 값을 가지고 있는데 (다른 값들도 있지만 이 연산에서는 무의미한 것으로 추정) pt는 blob center의 x, y 좌표를 의미하지만 도무지 size에 대한 이야기가 없다.
내가 원하는 정보는 찾아낸 blob의 크기 (이를 둘러쌀 수 있는 최소한의 원의 반지름 이라던가 실제 blob의 픽셀 수라던가...)인데 나오는 size 값은 blob의 모양에 따라서 제각각이다.
4번째 스텝인 "찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정." 에서 대체 무슨일이 일어나는 것이길래 이런 값이 출력되는지 모르겠다. 원 같은 경우는 그나마 비슷하긴 하지만 실제 위의 그림에서 볼 수 있듯이 지름 100px짜리 원의 blob 크기는 99.0151로 나온다. 여러 contour 들을 합치는 알고리즘을 들여다봐야 알겠지만 SimpleBlobDetector가 return하는 keypoint의 값만 사용해서 실제 blob의 크기를 알아낼 방법은 없는 것으로 보인다.
3. parameter의 minArea / maxArea
한 가지 주목할 점은 parameter로 사용하는 minArea / maxArea의 경우는 실제 blob으로 잡힌 object의 크기를 비교한다는 것이다. 한 변의 길이가 100px인 정사각형에 대한 keypoint의 size 값은 111.8034이지만 filterByArea 옵션을 켜고 minArea를 10000(100 * 100)으로 잡으면 정사각형을 찾지만, 10001을 사용하는 경우 정사각형을 찾지 못한다. circle의 경우는 사용한 radius를 사용해 수학적으로 계산한 넓이와 10 이하로 차이가 나는 것으로 보아 실제 pixel 수를 기준으로 filter 하는 것으로 보인다.
4. findContours 함수를 사용한 정확한 blob detection
때문에 내부에서 찾아낸 blob의 정확한 사이즈를 뽑아낼 수 있을 것이라고 기대했으나 실패했다.
사실 실제 4단계 step 중에서 사용하는 부분이 두 번째 step 뿐이기에 이쯤되면 그냥 findContous 함수를 써서 raw level에서 처리하는 것이 더 나을 것으로 보인다.
cnt = cv.findContours(binary_image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0]
# Some basic features of the contour object
(x,y), radius = cv.minEnclosingCircle(k)
rect = cv.minAreaRect(k) # ((center x, center y), (width, height), rotation)
size = cv.contourArea(k)
뽑아내야 하는 blob의 수를 알고 있다면 area, 둘러싸는 직사각형의 가로 세로 사이즈 등등의 값을 얻은 뒤 단계적으로 filter를 적용하는 방법도 사용할 수 있다.
'취미 > Programming' 카테고리의 다른 글
[Github] Github SSH 연결 완벽 가이드 (0) | 2022.09.22 |
---|---|
Telegram bot을 활용한 코드 실행이 끝나면 핸드폰으로 메시지 보내기 (0) | 2022.05.30 |
Ubuntu TensorFlow(2.6) GPU 설치 (0) | 2021.09.06 |
Matlab과 Python에서의 image 좌표축 한번에 정리! (0) | 2021.06.16 |
Ubuntu setup (Linux setup) (0) | 2021.06.11 |