안녕하세요? 맨날맑음 입니다.
참 좋은 세상이네요~ 도로정보를 3D로 표현해 주고 있는데요, 도로 표지판이며, 신호등까지 거의 실사같은 느낌이 나는군요~ 아 갖고싶어 ㅠ
THE INNOVATOR
고성능 하이엔드 내비게이션





Posted by 맨날맑음
,

안녕하세요? 맨날맑음 입니다.

드디어 약 3개월간의 멀티터치 테이블 발표회를 몇일전에 마쳤습니다. 사실 이 프로젝트는 학교의 '종합설계' 과목의 프로젝트로 만들게 되었는데요;; 학교에서 재료 구입에 차질이 생겨 실제 개발 기간은 약 1달이 조금 안되는 기간에 만들게 되었습니다. 저희 과가 컴퓨터공학부인지라 소프트웨어 개발은 어느정도 경험이 있었지만 하드웨어와 함께 해보는 것은 처음이라 납땜부터 LED에 저항을 연결하는 사소한 부분까지도 모르는 것이 많아 힘든 것이 많았습니다. 그래도 팀원들 모두 열심히 해준 덕에 완성하게 되어 보람되고 뿌듯하네요^^

발표 PPT와 시연 동영상입니다. 시연은 가상 시나리오로 디자인 회의를 한다는 컨셉으로 진행 하였습니다.
PPT1. 시연회 발표  PPT

영상1. 멀티터치회의테이블 최종 동작 (핸드폰 카메라 촬영)

영상2. 멀티터치회의테이블 최종 동작(마우스로 조작 화면 녹화 유틸로 녹화)

발표회 결과도 좋아서 저희 Accent 팀이 종합설계 발표회 1등을 수상하였습니다.

사진1. 기념촬영(지도해주신 김병규 교수님과 팀원)

사진2. 상장

사진3. 부상으로 받은 상품권 20장

Posted by 맨날맑음
,
안녕하세요? 맨날맑음 입니다.

WPF나 Silverlight 와는 다르게 Windows Form에는 '로드 완료' 이벤트가 없습니다. Load 이벤트가 제공 되고 있기는 하지만 MSDN에 나온 의미는 '폼이 처음으로 표시되기 전에 발생합니다.' 입니다. 즉 로드 완료가 아니라는 것입니다.

이것이 왜 문제일까?
로드 완료가 아닌 로드중 이벤트만 제공하여 생기는 문제가 있습니다.
예를 들어 프로그램을 시작할 때 폼을 숨기려고 한다고 하면, Hide() 메서드를 호출 해야합니다.
실행 할때 숨기려 했으니 당연히 폼의 생성자에 Hide()를 넣어보지만 전혀 동작 하지 않습니다.
두번째 방법으로 폼의 Load 이벤트 핸들러 안에 Hide()를 넣어봅니다. 역시 동작하지 않네요;
정확하지 는 않지만, MSDN의 설명대로 폼이 아직 표시되기 전이라 Hide()가 먹히지 않는 것 같습니다.
이밖에 Focus()나 몇몇 다른 메서드도 동작하지 않습니다.

어떻게 해결할까?
위의 문제를 해결하려면 '로드완료' 이벤트를 찾아야 하는데 아무리 뒤져보아도 로드완료는 존재하지 않았습니다.
그래서 임시 방편으로 Application.Idle 이벤트를 사용하여 해결 하였습니다. Application.Idle 이벤트는 말그대로 프로그램이 아이들 상태(쉬고 있을때) 발생합니다. 이걸 응용하면, 생성자에서 이벤트를 걸어주고, 이벤트 핸들러에서 이벤트를 빼주는 방법으로 로드 완료된 시점을 잡을 수 있습니다. 물론 엄밀히 말하면 프로그램이 더이상 할 일이 없어 쉬고 있을 시점을 잡아내는 것입니다.

using System;

using System.Windows.Forms;

namespace Sample

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            //Idle이벤트를 걸어준다.

            Application.Idle += Application_Idle;

        }

        void Application_Idle(object sender, EventArgs e)

        {

            //Idle이벤트를 없앤다.

            Application.Idle -= Application_Idle;

            this.Hide();

        }

    }

}


위의 코드에서 Idle 이벤트 핸들러에서 Application.Idle -= Application_Idle; 이벤트를 빼주는 방법으로 프로그램이 처음으로 쉴때(로드완료)를 잡아내는 것입니다. 이렇게 임시 방편이나마 로드 완료 시점을 잡아서 hide() 메서드를 동작시킬 수 있습니다.
Posted by 맨날맑음
,

안녕하세요? 맨날맑음 입니다.

네이트을 보면 X(종료) 버튼을 누를시 프로그램이 꺼지지 않고, 트레이로 가게 됩니다.
이번에 알아볼 내용은 .net Windows Forms 프로젝트에서 이런 기능을 구현 하는 것입니다.

우선 준비물이 필요합니다. 트레이에 나타나게 할 아이콘 파일(.ico)입니다.
아이콘 파일은 웹상에서 마음에 드는것을 다운로드 받아도 되고, 포토샵이나 기타 프로그램으로
그림파일을 변환시켜 사용하셔도 됩니다. 물론 솔루션 탐색기 -> 해당 프로젝트(우클릭) -> 추가 -> 새항목 -> 아이콘파일을 선택하셔서 직접 그려서 사용하셔도 됩니다. 각자 취향에 맞는 아이콘을 준비해 주면 됩니다.

우선 Windows Forms 프로젝트를 생성합니다.

도구상자에서 NotifyIcon을 선택하여 Form에 추가 합니다. 추가 후 소성창의 Icon 속성에 준비해준 Ico 파일을 연결해 줍니다. 여기까지만 하고 실행시켜도 트레이에 우리 프로그램의 아이콘이 보이는 걸 볼 수 있습니다.

트레이에서 마우스 오른쪽 버튼을 눌렀을 경우 나올 메뉴를 위해 ContextMenuStrip도 추가해 줍니다.
ContextMenuStrip의 메뉴를 추가 합니다. 간단히 '종료' 메뉴(Name : ExitToolStripMenuItem)만 넣었습니다. 다시 notifyIcon1의 속성창으로 가서 ContextMenuStrip의 값을 contextMenuStrip1로 지정 합니다.
여기까지 하셨으면 프로그램 실행 시 트레이에 아이콘이 나타나게 되고, 오른쪽 버튼으로 아이콘을 클릭하면
종료 메뉴가 나타나게 됩니다.

이제 코드창(cs)으로 가서 몇가지 이벤트핸들러만 구현해 주면 트레이에 아이콘이 나타나는 프로그램을 만들수 있습니다.
using System;
using System.Windows.Forms;
namespace TraySample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.FormClosing += Form1_FormClosing;
            this.notifyIcon1.DoubleClick += notifyIcon1_DoubleClick;
            this.ExitToolStripMenuItem.Click += ExitToolStripMenuItem_Click;
        }
        // 트레이의 종료 메뉴를 눌렀을때
        void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //트레이아이콘 없앰
            notifyIcon1.Visible = false;
            //프로세스 종료
            Application.Exit();
        }
        //트레이 아이콘을 더블클릭 했을시 호출
        void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            this.Visible = true; // 폼의 표시
            if (this.WindowState == FormWindowState.Minimized)
                this.WindowState = FormWindowState.Normal; // 최소화를 멈춘다 
            this.Activate(); // 폼을 활성화 시킨다
        }
        //폼이 종료 되려 할때 호출
        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true; // 종료 이벤트를 취소 시킨다
            this.Visible = false; // 폼을 표시하지 않는다;
        }
    }
}
주석으로 충분한 설명이 있지만 간단히 소스를 설명하면, 우선 타이틀바의 X 단추를 눌렀을때 프로그램이 종료 되는것을 막기위해 FormClosing 이벤트 핸들러에서 폼이 종료 이벤트를 취소 시켰습니다.
또한 트레이 아이콘을 더블클릭하면 폼이 다시 나와야함으로 notifyIcon1_DoubleClick 이벤트 핸들러에서 는 폼을 다시 표시하고, 활성화 시켰으며, 메뉴에서 종료를 선택했을때는 프로그램을 종료하게 하였습니다.

이렇게 간단하게 네이트온처럼 트레이에 표시되는 응용프로그램을 만들 수 있습니다.
Posted by 맨날맑음
,

안녕하세요? 맨날맑음 입니다.

이전 포스팅에서 카메라와 터치 좌표를 맞추는데 카메라의 위치를 조정하여 맞추어야 한다고 하였지만
그 방법으로는 완벽하게 좌표를 매칭 시킬수 없었습니다. 정확히 맞추는 방법은 Touch Library의 셋팅을 이용하는 것인데요, Touch Library 홈페이지 상에 설명이 다 되어있는 내용이었지만, 초라한(?) 영어실력으로 인해 주의깊게 보지 않아 고생하였습니다;;

Touch Library의 설정은 크게 두가지로 나눌 수 있는데요; 터치의 감도를 설정하는 영상 처리부분과 좌표를 매칭하는 좌표 설정 부분이 있습니다. 영어실력이 초라한 분들을 위해 간단하게 두가지 방법을 알아보겠습니다.

영상처리
config.bat 파일을 실행시키면 6개의 창이 나타납니다.위의 3개의 창은 원영상, mono, smooth를 적용한 영상을 보여주며 아래 3개의 화면은 사용자가 값을 조정해가며 영상의 질을 개선할 수 있습니다.
첫번째 창은 경계(threshold)값을,두번째 창은 밝기brightness), 명암대비(contrast) 값,세번째 창은 레벨(level) 값을 조정 할 수 있습니다.
첫 번째 창에서 'b'버튼을 누르게 되면 배경의 화면을 나오거나 나오지 않게 할 수 있습니다. 이 threshold 값이 매우 중요합니다. 너무 크거나 작아도 터치 감도가 좋지 않습니다. 두 번째 창도 역시 어느정도 밝은 가운데 명암대비를 해야 합니다. 그 후 손가락을 누른 상태에서 이리저리 움직여가며 하얀 점이 끊기지 않고 잘 움직이는지 확인하며 세번째 창의 레벨 값을 조정해 줍니다.
이런식의 테스트로 자신에 시스템에 맞는 최적의 셋팅을 찾아주시면 됩니다. 저희의 경우 아래의 값이 최적이더라구요.
threshold: 32   brightness: 125   contrast: 208   level: 30
그 후 Enter를 누르시면 화면이 변하게 되는데 x를  누르시면 현재 값이 저장이 됩니다. Esc를 눌러 종료 후 다시 실행시켜 확인합니다.
터치 좌표 설정(좌표 매칭)
가장 중요한 부분이 터치영역을 설정해 주는 것입니다.
다시 프로그램을 실행시켜 Enter를 누르면 화면 전체에 녹색의 '+'모양이 나타납니다. 화면 좌상단에는 현재 캠의 영상이 비추어지는데 캠이 스크린 전체를 비출 수 있도록 캠을 조정합니다.
조정이 완료 되면 'c'를 누릅니다.
좌상단 모서리 '+' 부분에 빨간색 화살표가 생기게 됩니다.
이제 부터가 중요합니다.
그 '+' 부분을 누르게 되면 전체 화면의 색깔이 하얗게 변하게 되고 띄게 되면 빨간 화살표가 다음 '+'로 이동하게 됩니다. 그렇게 차례로 끝까지 누르게 되면 터치 영역 설정이 마치게 됩니다. 역시 'x'를 눌러 저장 후 종료합니다.
주의할 점은 눌렀을 때에만 빨간 화살표가 이동하여야 합니다. 그렇지 않으면 좌표가 맞지 않게 됩니다. 이제 설정된 영역안에서만 터치가 이루어지게 됩니다.

간략하게 Touch Library Setting 방법을 알아 보았는데요; 여기까지 하셨으면 하드웨어 적인 부분은 모두 끝났다고
보시면 됩니다. 저희는 이 라이브러리를 이용하여, WPF 기반으로 회의시스템을 개발하였습니다.
최종 시연 및 발표 후 소프트웨어 적인 부분을 포스팅 하겠습니다.
Posted by 맨날맑음
,