[OpenCV 팁] 이미지 창을 여러개 띄우면서 키보드 메시지 처리하기

프로그래밍/opencv 2015. 8. 15. 23:08

흔히 발생하는 상황은 아니지만 혹시 필요한 분도 있을 것 같아서 적어봅니다.


opencv에서는 imshow로 이미지를 띄운 후에는 반드시 waitKey를 호출해 주어야만 정상적으로 이미지가 보여집니다.


그런데, 단순히 이미지를 디스플레이하기 위한 목적으로만 waitKey를 사용하는 경우에는 관계가 없지만, 키보드 메시지도 같이 처리하기 위해 waitKey를 사용할 경우에는 출력할 이미지가 여러 개일 경우 조금 미묘한 문제가 발생합니다.


일단, 제 경우에는 아래와 같이 알고리즘을 테스트하는 중간 중간에 스페이스 키를 이용해서 프로그램을 pause시키고 또 esc 키를 이용해서 프로그램을 종료하는 형태를 즐겨 사용하는 편입니다.


VideoCapture vc(0);

Mat frame;

while(1)

{

vc >> frame;

...

imshow("result", frame);

char ch = waitKey(10);

if(ch == 27) break;       // 27 == ESC key

if(ch == 32)                // 32 == SPACE key

{

while((ch = waitKey(10)) != 32 && ch != 27);

if(ch == 27) break;

}

}


그런데, 디스플레이하고 싶은 이미지가 2개 이상일 경우에 아래와 같이 코드를 작성하는 것은 키보드 메시지 처리가 정상적으로 동작하지 않는 문제가 발생합니다 (첫 번째 waitKey를 실행하는 도중에 키보드가 눌려지게 되면 그 키보드 메시지는 그대로 날아가기 때문에 프로그램에 반영이 되지 못함). 즉, 어떤 때는 키보드가 먹히고 어떤 때는 키보드가 먹히지 않는 현상이 나타납니다.


imshow("result1", frame1);

waitKey(10);

...

imshow("result2", frame2);

char ch = waitKey(10);

if(ch == 27) break;

...


그렇다고 아래처럼 waitKey를 한번만 호출하면 이번엔 이미지 출력에 문제가 발생합니다. 키보드는 잘 먹히지만 imshow마다 waitKey가 호출되지 않았기 때문에 일부 이미지들이 정상적으로 갱신되지 않는 현상이 나타납니다. 


imshow("result1", frame1);

imshow("result2", frame2);

char ch = waitKey(10);

...


이 문제로 종종 불편함을 겪다가 최근에 해결책을 하나 찾았는데 그것은 아래와 같이 매 waitKey 호출마다 키 값을 따로 저장해 두었다가 나중에 한꺼번에 처리하는 것입니다.


char key = -1;

imshow("result1", frame1);

char ch = waitKey(10); if(ch != -1) key = ch;

...

imshow("result2", frame2);

char ch = waitKey(10); if(ch != -1) key = ch;

...

if(key == 27) break;

if(key == 32) ...


그리고 이 방법을 좀더 확장하여, 만일 여러 함수 또는 파일에 걸쳐서 imshow가 필요한 경우에는 아래와 같이 imshow에 대한 wrapper 함수를 하나 만드는 것도 방법입니다.


class ShowImage

{

public:

    static void show(const char* winname, const cv::Mat& img, int delay = 1);

    static char getKey();


protected:

    static char key;

};


char ShowImage::key = -1;


void ShowImage::show(const char* winname, const cv::Mat& img, int delay)

{

    imshow(winname, img);

    char ch = waitKey(delay);

    if (ch != -1) key = ch;

}


char ShowImage::getKey()

{

    char ret = key;

    key = -1;

    return ret;

}


그리고 이미지 출력이 필요한 곳에서는 어디서나 ShowImage::show("result", frame)과 같은 식으로 이미지를 출력하고, 키보드 메시지가 필요한 곳에서는 char ch = ShowImage::getKey()를 호출하면 됩니다.


by 다크 프로그래머


Stop Trying to Create a Killer Resume

잡기장 2015. 6. 24. 12:15

최근에 받은 IEEE 메일 내용중 "Stop Trying to Create a Killer Resume"라는 문구가 눈에 띄어서 무심코 링크를 클릭하였다. 들어가보니 Brazen Careerist 라는 Job사이트에서 운영하는 블로그 글이었다.



조금 읽어보았는데 내용이 흥미로운 것 같아서 잘 안되는 영어로 낑낑대며 번역을 해 보았습니다. 영어로 된 블로그 원문 위치는 아래와 같습니다.


http://www.brazencareerist.com/blog/2015/06/15/stop-trying-to-create-a-killer-resume-and-do-this-instead/ 


아래 내용은 위 블로그 글 내용을 그대로 한글로 번역한 것입니다.


----------


Stop Trying to Create a Killer Resume and Do This Instead

(죽여주는 이력서를 쓰려는 노력은 이제 그만하라)


Your resume isn’t much different than your social media profile. While it may omit some embarrassing pictures, your resume represents a carefully curated persona. It reduces your complex virtues into shiny marketing collateral.


당신의 이력서는 당신의 social media profile(페이스북 등 인터넷 매체를 통해 보여지는 당신의 모습)과 크게 다르지 않다. 당신의 이력서는 신중하게 큐레이트된(재단된) 자신의 보여지는 모습이며 당신의 복잡한 장점들을 마케팅 포인트로 축약한 것이다.


But the problem with resumes isn’t that we brand and sell ourselves — it’s that the experiences we tout on our resumes often don’t reflect what we want to do with our lives. They represent a bunch of things we thought we should do.


그런데 이러한 이력서에서의 문제점은 우리가 (진정한) 자기 자신을 브랜드화하고 팔고 있는 것이 아니라는 것이다. 우리가 이력서에서 내세우고 있는 경험들은 종종 우리가 우리 삶에서 진정 원하는 것들을 반영하지 못한다. 그것들은 단지 우리가 그렇게 해야만 한다고 생각하고 있는 것들일 수 있다.


A resume is no longer just bullet points in Arial font. It’s become a totalitarian dictator, coercing us into chasing things that conflict with our hopes and dreams just because those things look nice on paper.


이력서는 이제 더이상 에어리얼 폰트에 있는 불렛 포인트 정도가 아니다. 그것은 이제 우리가 단지 종이 위에서 그럴 듯하게 보인다는 이유로 우리의 꿈과 상충되는 것들을 뒤쫓도록 강요하는 전체주의 독재자가 되어가고 있다.


But it doesn’t have to be this way. We can build lives we want to live. And by pursuing career goals that excite us, we’ll end up building impressive resumes in the process.


그러나 이것이 이런 식으로 진행되도록 두어서는 안된다. 우리는 우리의 삶을 우리가 원하는대로 세울 수 있다. 그리고 우리를 (진정으로) 흥분시키는 경력 목표를 추구함으로써, 그 결과로서 인상적인 이력서를 만들어낼 수 있다.


Here’s how.


여기 그 방법이 있다.



Shed expectations and listen to your gut

(기대는 버리고 자신의 내면에 귀를 기울여라)


There’s a soundtrack to the world we live in. It’s an ambient, barely discernable noise that constantly tells us who we should be and what we should want. From Photoshopped ads showing us what to strive for, to Instagram posts that make us feel inadequate, to articles on the highest-paying careers — we’re immersed in propaganda that pressures us to follow other people’s ideas of success.


우리가 살고 있는 세상에는 하나의 사운드트랙(녹음된 부분)이 있다. 그것은 은밀하고 간신히 알아들을 수 있을 정도의 노이즈이지만 우리가 어떤 사람이 되어야 하고 우리가 무엇을 원해야 하는지를 끊임없이 말해준다. 우리가 무엇을 추구해야 하는지를 보여주는 사진화된 광고부터 우리가 부족함을 느끼게 해주는 인스타그램(Instagram) 글까지, 그리고 고연봉 경력자에 대한 기사까지, 우리는 다른 사람들의 성공에 대한 생각을 따르도록 우리를 압박하는 선전문구 속으로 빨려들게 된다.


These external ideas often overpower our internal aspirations and push us down paths that aren’t our own choosing. We’re pressured to attend medical school (even though we love design); to take that prestigious job offer (despite having no interest in the field); to scale back our “impractical” dreams. Either way, blindly heeding this noise is a ticket to career disillusionment and spending your work days covertly browsing websites until you’ve read and watched the entire Internet.


이러한 외적인 생각들은 종종 우리의 내면의 열망을 누르고 우리 자신이 선택하지 않은 길을 따르도록 우리를 밀어 내린다. 우리는 의과대를 다니고 (실제로는 디자인을 좋아함에도), 일류의 일자리 제안을 받아들이고 (그 분야에 아무런 관심이 없음에도 불구하고), 우리의 "불가능한" 꿈을 축소시키도록 압박받는다. 어느 쪽이든, 이 노이즈에 맹목적으로 귀를 기울이는 것은 직장에 환멸을 느끼게 하는 지름길이며 당신의 근무시간을 몰래 웹사이트를 검색하면서 낭비하게 하는 지름길이다.


Analyze the advice you’re hearing and determine whether it matches what you really want. If you follow it, will you be bored with your work? Will you be living for weekends and Netflix binges? Will you have been true to yourself? If all signs are pointing to “I’m going to be a zombie,” mute outside influences and listen to yourself.


당신이 듣게 되는 조언을 분석하고 그것이 정말 당신이 원하는 것과 일치하는지를 결정하라. 만일 그것을 따른다면 당신의 일에 지루함을 느낄 것인가? 진탕한 시간을 보내기 위해 주말만을 기다리며 살게 될 것인가? 자신에게 진실되게 될 것인가? 만일 모든 신호가 "나는 지금 좀비가 되려 한다"를 가리킨다면 외부에서 오는 소리들을 꺼버리고 자기 자신에게 귀를 기울여라.



Define what success means to you

(성공이 당신에게 무엇을 의미하는지를 정의하라)


We tend to think of success as a flaunt-worthy factoid you can slip into dinner party conversation or trot out on social media. It’s the fancy title on your business card. The purse plastered with brand symbols. The open-concept house with his-and-hers sinks that every couple in the history of House Hunters demands. However, the greatest myth of success is that it can be defined the same way for everyone.


우리는 성공을 저녁 식사 파티에서 꺼내놓거나 소셜 미디어(페이스북 등)에 올릴 만한 자랑거리로 생각하는 경향이 있다. 그것은 또한 당신의 명함에 멋진 타이틀이 된다. 브랜드 심볼이 박힌 지갑. 집을 갖고자 열망하는 모든 커플들이 빠져들만한 오픈 컨셉의 집. 하지만 성공에 대한 가장 큰 잘못된 믿음은 그것이 모든 사람에게 동일하게 정의될 수 있다는 생각하는 것이다.


For some, the thrill of signing a multi-million-dollar client pumps our blood. For others, working 90-hour weeks for buckets of pay won’t satisfy, and we’d be happier making cat ornaments for Etsy. Wherever you fall, looking beyond society’s one-size-fits-all view of success and defining it for yourself will clear the fog of pressure that clouds your true desires.


어떤 이들은, 수백만달러의 고객에게 사인을 하는 스릴에 피가 끓어오른다. 다른 이들은, 일주일에 90시간씩 일하면서 양동이로 돈을 버는 것보다는 고양이 장신구를 만들면서 보다 행복해한다. 당신이 어느 쪽에 속하든, 사회의 성공에 대한 획일화된 관점을 넘어서서 자기 자신의 성공의 의미를 정의하면 당신의 진실된 열망을 가리고 있던 압박의 안개를 걷어내게 될 것이다.


If thinking about success conjures cheesy posters of people climbing mountains, break down the cliché concept into categories: What does success mean to you financially? At work? With family? These questions will help you whittle success into a manageable vision.


만일 성공에 대해 생각하는 것이 사람들이 산을 오르고 있는 싸구려 포스터만을 연상시킨다면 고정된 생각을 구체적인 카테고리로 나누어 보아라. 성공이 당신에게 경제적으로는 어떤 의미를 갖는가? 일에는? 가족에게는? 이러한 질문들은 성공에 대한 개념을 축소시켜서 보다 쉽게 구체화할 수 있도록 도움을 줄 것이다.



Just do something

(일단 실행하라)


Choosing a career can’t be done in a vacuum. It happens in the real world where you try something, hate it, try something else, fail, but keep plugging away at it anyway because you like it. So pick something!


직업을 선택하는 것은 무에서 이루어질 수는 없다. 그것은 당신이 무언가를 시도하고, 증오하고, 어떤 다른 것을 시도하고, 실패하고, 그럼에도 불구하고 당신이 좋아하기 때문에 계속 노력하는 실제 세계에서 일어난다. 그러므로 무엇이든지 선택하라!


Paralyzed by choice? Identify what you really like to do. What engrosses you so much you forget you have two seasons of Game of Thrones to catch up on? Starting might require short-term sacrifices: volunteering for no pay, taking tutorials to build skills, or accepting work that is initially so bad you want to adopt a pseudonym.


선택으로 인해 몸이 굳어지는가? 당신이 진정 하고싶은 일이 무엇인지 확인하라. 당신이 봐야할 두 시즌의 왕좌의 게임을 잊어버리게 할 만큼 당신을 몰두시키는 것이 무엇인가? 시작은 일시적인 희생을 요구할 수도 있다: 무료 자원봉사, 기술을 얻기 위해 지도를 받는 것, 초기에는 필명을 쓰고 싶을 만큼 나쁜 일을 받아들이는 것.


When you unchain yourself from expectations, define what matters to you, and take action to move forward, you won’t just create a worthwhile resume — you’ll create a life worth living.


당신이 기대로부터의 사슬을 끊고, 당신에게 무엇이 문제인지를 정의하고, 앞으로 나아가기 위해 행동을 취할 때, 당신은 단지 가치있는 이력서를 생성하는 것이 아니라 살 만한 가치가 있는 삶을 창조하게 될 것이다.


----------


☞ 단어들이 어려워서 헤맸습니다. 이상한 부분이 있으면 알려주세요 ^^


by 다크 프로그래머


'잡기장' 카테고리의 다른 글

꽃 한송이  (19) 2016.08.29
공부 잘하는 법, 연구 잘하는 법, 자신을 발전시키는 법  (45) 2015.06.23
맛있는 배  (9) 2014.09.06

공부 잘하는 법, 연구 잘하는 법, 자신을 발전시키는 법

잡기장 2015. 6. 23. 07:52

메르스의 여파로 집에서 놀다가 몇자 적어봅니다.


공부 잘하는 법, 연구 잘하는 법, 자신을 발전시키는 법.. 사실 제목을 거창하게 쓰긴 했는데요,


너무 뻔하긴 하지만 그 핵심은 '생각하는 것', '시간을 갖는 것', 그리고 '자신이 주도하는 것'이라고 생각합니다.


시험공부를 하는데 있어서 가장 잘 알려진 대표적인 방법으로 '벼락치기'라는게 있습니다 ^^. 아마도 누구나 한 두 번쯤은 벼락치기라는걸 해 봤을 텐데요, 그 핵심은 2가지 입니다. 하나는 '시험 점수를 높이기 위해 수단과 방법을 가리지 않는다'이고 다른 하나는 '끝나고 나면 별로 남는게 없다' 입니다.


사실 우리나라 교육시스템, 연구시스템, 업무시스템도 '벼락치기'와 크게 다를 바 없긴 합니다. ^^


그런데, 벼락치기 공부를 하면서 누구나 공통적으로 하는 생각이 하나 있습니다. 그건 '내가 이번 시험만 끝나면 시간을 갖고 천천히, 정말 제대로 공부를 해 봐야지' 입니다.


하지만 그런 일이 실제로 일어나긴 쉽지 않은데요, 그건 시험 끝나면 일단 조금 놀기도 해야하고.. 또 이제 정말 맘잡고 제대로 해 볼려고 하면 또 다른 시험이 바로 코앞에 다가오기 일쑤이기 때문입니다. 그러다 보니 원리, 기본개념 그런건 일단 재껴두고 문제 풀이법이라도 한두개 더 외우는게 낫다고 생각할 수 있습니다.


직장인들도 상황이 크게 다르진 않습니다. 당장 눈앞에 떨어진 불을 끄기도 힘든데 무슨 차분이 앉아서 이론서나 뒤적이고 곱씹어볼 여유 같은게 있을리 없습니다. 그러다 보니 뭔가 원리를 알고 수식을 풀어서 문제를 해결하는 것이 아니라 일단 막고 품는 식으로 이 값도 대입해 보고 저 값도 대입해 보고 하다가 우연히 문제가 해결되면 그걸로 환호하는 경우가 많습니다.


사실 이러한 문제는 구조적인 측면이 많기 때문에 이를 손쉽게 해결할 수 있는 멋진 방법은 잘 없을 것입니다. 하지만 문제를 정확히 이해하면 이로부터 해결책을 같이 찾아보고 궁리할 수 있는 좋은 출발점은 될 수 있다고 생각합니다.


예전에 누군가 어떻게 하면 공부를 잘 할수 있냐고 묻길래, '진짜 공부를 하면 됩니다'라고 했더니 얼굴에 황당하다는 기색이 역력합니다 ^^


초등학교 1학년 8살부터 고등학교 3학년 19살까지 그렇게 오랜 시간, 다시 없을 시간에 진짜 공부가 아닌 시험을 위한 공부를 하고 있는 것은 참 서글픈 일입니다.


다시 처음으로 돌아가서, 제가 생각하는 공부 잘하는 법, 연구 잘하는 법, 자신을 발전시키는 법은 '시간을 갖는 것', '생각하는 것', '자신이 주도하는 것' 입니다.


그런데 어떻게...?


해답은 자신이 찾아야 하겠지만 몇 가지 생각나는 것들을 적어보면 다음과 같습니다.


급한 일보다는 중요한 것을 먼저 한다.


'아침에 일어나서 맑은 정신일 때 일단 급한 일들부터 다 처리해 놓고 남는 시간에 여유를 가지고 내가 하고 싶은 일을 해야겠다'고 생각하면 결과적으로 인생에 별 도움이 되질 않습니다. 자신에게 정말 의미있고 중요한 일을 먼저 하고 급한 일들은 남는 짜투리 시간에 해야 합니다. 급한 일들은 아무리 뒤로 미뤄놔도 어떻게든 해결되게 되어 있습니다.


어려움을 느낄 때는 목표를 낮춘다.


학생들 중 수포자(수학 포기자)가 참 많습니다. 그건 우리가 굳이 중학과정, 고교과정에서 배울 필요가 없는 내용까지 과도하게 배우면서 시간이 충분히 주어지면 잘 따라올 수 있는 학생들까지 수포자의 길로 인도하고 있는 측면이 크다고 생각합니다. 사람에겐 누구나 개인차가 있습니다. 자신에게 맞지 않는 진도와 내용을 따라가면서 무력감과 패배감을 느끼기보다는 차라리 그 시간에 자신에게 맞는, 그리고 스스로 할 수 있는 것을 하는게 좋다고 생각합니다. 내용은 단순할수록, 분량은 짧을수록 좋습니다. 자신이 고등학생이고 소위 말하는 수포자라면 중학교 교과서, 혹은 초등학교 교과서를 보는 것도 좋은 방법입니다. 단, 볼 내용은 최소화 시키되 충분한 시간을 갖고 개인과외도, 학원과외도 아니고 스스로 힘으로 보십시요. 심화문제 같은건 볼 필요도 없으며 기본 개념 위주로 교과서에 있는 기본문제 몇개 정도를 스스로 힘으로 해결해 보는 정도면 충분합니다.


시키는대로 살지 않는다.


이 말이 학생들에게까지 적용될지는 잘 모르겠습니다만 ^^ 그때 그때 하란 것만 열심히 하다보면 하루 하루는 잘 갑니다만 나중에 인생이 허무하네 남는게 없네 하는 말들이 나오게 됩니다. 자신에게 중요한 일을 하십시요.


by 다크 프로그래머


'잡기장' 카테고리의 다른 글

Stop Trying to Create a Killer Resume  (20) 2015.06.24
맛있는 배  (9) 2014.09.06
투표  (2) 2014.05.30