//실제로 그레이를 처리하는곳

        private void grayProcess()

        {

            result = new IplImage(src.Size, BitDepth.U8, 1); // 채널 1개짜리 메모리 확보

            Cv.CvtColor(src, result, ColorConversion.BgrToGray); //컬러를 그레이로 변환

 

            pictureBoxIpl2.ImageIpl = result; // 변환된 이미지를 픽쳐박스에 출력

        }

 

'Programing > OpenCV' 카테고리의 다른 글

영상 파일 포맷의 종류  (0) 2016.11.30
영상처리 컬러모델  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30





  private void 그림읽ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)

            {

                loadImage(openFileDialog1.FileName);

            }

            else

            {

                return;

            }

        }

 

        private void loadImage(String filename)

        {

            src = new IplImage(filename, LoadMode.AnyColor);

            pictureBoxIpl1.ImageIpl = src;

        }

 

//픽쳐박스를 클릭 했을 경우 새로 창을 띄워  그림으로 보여준다

        private void pictureBoxIpl2_Click(object sender, EventArgs e)

        {

            if (pictureBoxIpl2.ImageIpl == nullreturn;

 

            using (CvWindow wind = new CvWindow("결과창"))

            {

                wind.Image = result;

                Cv.WaitKey(0);

            }

        }


'Programing > OpenCV' 카테고리의 다른 글

영상처리 컬러모델  (0) 2016.11.30
gray scale  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30

OpenCV Intel에서 개발한 영상처리 라이브러리 모음으로써오픈 소스로 개발되고 있는  컴퓨터 비전 라이브러리 이다오픈 소스이기 때문에 누구나 참여할 수 있고소스 코드의 상호 검증이 가능하다기본 설꼐단계부터 실시간 연산을 목표로 만들어졌기 때문에 매우 빠르게 동작하도록 구현되어 있다. OpenCV 는 빠르고 안정적으로 구현디어 있는 컴퓨터 비전 알고리즘의 집합체이다이러한 알고리즘들을 프로그래머가 직접 개발한다면 생산성과 신뢰성이 떨어지는데, OpenCV는 이러한 기능들을 제공해 주기때문에 API로 프로그래머가 개발에만 치중 할 수 있도록 했다언어는 C언어 C++을 이용하여 작성되었고리눅스윈도우 OS 등에서 동작하고현재 파이썬매트랩 등 다른 컴퓨터 언어와 호환을 위한 개발도 진행중이다.



 

OpenCV는 크게 4개의 구성 요소로 나눌 수 있다.CV는 기본적인 영상 처리와 고수준의 컴퓨터 비전 알고리즘을 포함하고, MLL은 다양한 통계 분류와 군집화 도구 등의 기계학습 라이브러리를 담고 있다군집화 도구란 어떤 개체나 대상들의 유사성 또는 거리에 의하여 비슷한 특성을 가진 개체들이 함께 그룹 지어지도록 집단화 하는 것이다주요 목적은 각각 집단의 특성을 파악하는 것이다기계 학습은 주어진 데이터를 유용한 정보 형태로 변환하는 것이다데이터들의 집합을 기계에게 학습시킨 후새로운 데이터에 대한 질문에 기계가 대답할 수 있게끔 만드는 작업이다예를 들어 주어진 영상 안에 몇 명의 사람이 존재하냐고 질문하면 이에 대한 답을 하게 하는것이다기계학습은 데이터에서 얻은 규칙이나 패턴을 이용하여 추후 입력되는 데이터로부터 유용한 정보를 추출할 수 있다. HighGUI(high-level graphical user interface)는 입출력에 관련된 함수들과 영상비디오를 불러오고 저장하는 기능을 포함한다.

CXCORE는 기본적인 자료 구조와 알고리즘 등을 포함한다.

OpenCV활용분야

기존의 영상을 복원,강화,압출 시킬 수 있다또한 사진의 기존이미지를 시각적으로 개선시킬수 있다.

'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30
이진화  (0) 2016.11.30

SIFT 알고리즘.docx

StartOpenCV.zip



SIFT 알고리즘

(영상 추적)


디지털 영상처리 개요


디지털 영상처리 기술은 영상 개선영상 복원영상 변환영상 분석영상 인식영상 압축으로 분류된다.
 그리고 구현 알고리즘은 화소 점 처리영역 처리기하학적 처리프레임 처리로 분류할 수 있다.

디지털 영상의 내부 

가로 및 세로의 크기가 M  N 픽셀로 이루어져 있다저장된 영상데이터는 차원 배열(array) 형태를 이룬다.영상 데이터의 값은 흑백 영상인 경우 각 픽셀이 0~255의 값을 가지게 되며 각 값들은 픽셀의 밝기값을 표현한다가장 어두운 픽셀은 0의 값을 가지며 255는 가장 밝은 데이터 값을 표현한다밝기를 가지는 이러한 픽셀들이 모여 한장의 그림을 구성하게 된다.

일반적인 물체 추적 시스템의 원리

카메라로부터 영상을 획득하고 필요한 전처리(processing)를 한다.

영상 속에서 물체(object)의 존재를 검출(detection)하고 물체가 존재하는 영역을 배경(background)으로부터 분할(segmentation)한다.(이때 분할된 영역은 대상이 되는 물체가 존재하는 영역과 반드시 일치하지는 않는다.)

이전 영상 프레임까지 얻은 정보로부터 추적중인 각 물체의 상태 정보에 근거하여 2단계에서 분할된 추정 영역에 속한 후보 영역과의 일치도(match)를 판정하고 현재 프레임에서의 각 물체의 상태를 갱신(update)하여 계속적으로 추적한다.

 


SIFT

David G. Lowe  Scale Invariant FeatureTransform(SIFT)라는 알고리즘을 제안했는데 이는객체의 모서리나 꼭지점 등에서 생성되는 특징 점을 벡터로 추출하여영상의 크기변화회전조명변화 등에 의한 변형에 대해 뛰어난 매칭 성능을 가진다하지만 SIFT 알고리즘은 영상을 반복적으로 연산하는 과정이 많아서 처리속도가 좋지 않다.

SIFT  서술자는 영상 변환,  크기,  회전,  노이즈 영향에도 일정한 특징 정합 성능을 유지한다. SIFT 를 이용한 특징 추출 과정은 아래 그림 처럼 크게 특징 점을 찾는 부분과 선택된 특징 점의 서술자(Descriptor)를 생성하는 두단계로 구분할 수 있다.  먼저,  특징 점 추출 단계에서는 스케일 공간상의 후보 특징 점을 추출하고 후보 특징 점의 안정성을 검사하여 안정된 특징 점의 위치를 세부 위치로 보정한다.  서술자 단계에서는 선택된 점들을 중심으로 주변 영역의 그레디언트를 통해 방향 성분을 얻게 되고,  얻어 진 방향 성분을 중심으로 관심 영역을 재설정하여 서술자를 생성하게 된다.

SIFT 알고리즘의 수행시간 및 성능을 좌우하는 요소

SIFT 알고리즘은 특징 점을 추출하기 위해 여러 가지단계를 거치는데첫 번째 단계는 같은 개체가 다른 관점에서라도 반복적으로 추출될 수 있는 크기와 위치의 후보 픽셀들을 뽑는 것이다각각의 후보픽셀에 대하여 더 세밀한 검사를 거쳐 특징 점으로 사용할지를 결정한다첫 번째 검사는 낮은 대비를 가지는 픽셀을 제거한다두 번째 검사는 모서리에 의해 추출된 특징 점을 제거한다.

'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30
이진화  (0) 2016.11.30

범위 강조 변환 이란?

 영상에서 한 부분의 화소는 원 상태를 그대로 유지한 채 일정 범위의 화소만 강조하는 변환

 원하는 부분의 화소 값이 더 커지거나 작아져 다른 부분과 비교해서 더욱 도드라져 보임



기존의 영상을 출력해주고 다시 이진화로 변환된 영상을 출력해준다.

void CImageprocesingView::OnDraw(CDC* pDC)

{

             CImageprocesingDoc* pDoc = GetDocument(); // 도큐먼트클래스참조

             ASSERT_VALID(pDoc);

             int i, j;

             unsigned char R, G, B;

             for(i=0 ; i<pDoc->m_height ; i++){

                           for(j=0 ; j<pDoc->m_width ; j++){

                                        R = G = B = pDoc->m_InputImage[i*pDoc->m_width+j];

                                        pDC->SetPixel(j+5, i+5, RGB(R, G, B));

                           }

             }

             for(i= 0 ; i<pDoc->m_Re_height; i++){

                           for(j = 0 ; j<pDoc->m_Re_width; j++){

                                        R = pDoc->m_OutputImage[i*pDoc->m_Re_width+j];

                                        G = B = R;

                                        pDC->SetPixel(j+pDoc->m_width+10, i+5, RGB(R, G, B));

                           }

             }

}

 

 

범위반전 코드

void CImageprocesingDoc::OnStressTransform2() 

{

             CRangeofstress2 dlg;

             int i;

             m_Re_height = m_height;

             m_Re_width = m_width;

             m_Re_size = m_Re_height * m_Re_width;

             m_OutputImage = new unsigned char[m_Re_size];

             if(dlg.DoModal() == IDOK){

                           for(i=0 ; i<m_size ; i++){

                                        // 입력값이강조시작값과강조종료값사이에위치하면출력

                                        if(m_InputImage[i] >= dlg.m_Start1 && m_InputImage[i] <= dlg.m_End1)

                                                     m_OutputImage[i] = dlg.m_value;

                                        else

                                                     m_OutputImage[i] = m_InputImage[i];

                           }

             }

}



'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
이진화  (0) 2016.11.30

이진화란?

 이진화란 RGB값으로 다양하게 분포되어 있는 색상값을 0 1만의 값으로 표현하는 것이다실제적으로 RGB컬러 영상을 흑백(Gray channel)영상으로 바꾼뒤 특정 임계값을 기준으로 초과 값을 255이하 값은 0으로 변환한다

의도

 에지 검출시 영상의 변화 부분을 강조함으로써 물체의 윤곽선과 영상 신호 분포를 이진화 하여 나타내는 방법이다.

 

기존의 영상을 출력해주고 다시 이진화로 변환된 영상을 출력해준다.

void CImageprocesingView::OnDraw(CDC* pDC)

{

             CImageprocesingDoc* pDoc = GetDocument(); // 도큐먼트클래스참조

             ASSERT_VALID(pDoc);

             int i, j;

             unsigned char R, G, B;

             for(i=0 ; i<pDoc->m_height ; i++){

                           for(j=0 ; j<pDoc->m_width ; j++){

                                        R = G = B = pDoc->m_InputImage[i*pDoc->m_width+j];

                                        pDC->SetPixel(j+5, i+5, RGB(R, G, B));

                           }

             }

             for(i= 0 ; i<pDoc->m_Re_height; i++){

                           for(j = 0 ; j<pDoc->m_Re_width; j++){

                                        R = pDoc->m_OutputImage[i*pDoc->m_Re_width+j];

                                        G = B = R;

                                        pDC->SetPixel(j+pDoc->m_width+10, i+5, RGB(R, G, B));

                           }

             }

}

 

이진화 코드

void CImageProcessingDoc::OnBinarization()

{

             CConstantDlg dlg;

             int i;

             m_Re_height = m_height;

             m_Re_width = m_width;

             m_Re_size = m_Re_height * m_Re_width;

             m_OutputImage = new unsigned char[m_Re_size];

             if(dlg.DoModal() == IDOK){

                           for(i=0 ; i<m_size ; i++){

                                        if(m_InputImage[i] >= dlg.m_Constant)

                                                     m_OutputImage[i] = 255// 임계값보다크면출력

                                        else

                                                     m_OutputImage[i] = 0// 임계값보다작으면출력

                           }

             }

}





'Programing > OpenCV' 카테고리의 다른 글

gray scale  (0) 2016.11.30
Opencv c# 2  (0) 2016.11.30
Opencv c#  (0) 2016.11.30
SIFT 알고리즘  (0) 2016.11.30
범위 강조 변환  (0) 2016.11.30

WPFInvestigation.zip






 Main창에서 변경Page와 회원리스트 Page를 가지고 있다가입창 에서는 메인화면,기본 가입추가 정보 입력 Page를 가지고 있다.












가입창.cs

자식 Page로 가지고 있는 3개의 Page에서 페이지 변경과 취소 버튼 수행시 부모창에서 변화를 가능하게 하기 위해 자식 Page에 선언된 delegate를 처리해 주었다.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

 

namespace WPFInvestigation

{

    /// <summary>

    /// ResForm.xaml 대한 상호 작용 논리

    /// </summary>

    ///

    public partial class ResForm : Window

    {

        FirstInfoPage firstinfopage = new FirstInfoPage();

        BasicInfoPage basicInfoPage = new BasicInfoPage();

        MoreInfoPage moreinfopage = new MoreInfoPage();

        public ResForm()

        {

            basicInfoPage.DistroyFormDeleEventHandler += newDistroyFormDele(basicInfoPage_DistroyFormDeleEventHandler);

            basicInfoPage.ChangePageMoreInfoDeleEventHandler += newChangePageMoreInfoDele(basicInfoPage_ChangePageMoreInfoDeleEventHandler);

 

            firstinfopage.FromDistroyDeleEventHandler += newFromDistroyDele(basicInfoPage_DistroyFormDeleEventHandler);

            firstinfopage.ChangePageBasciInfoDeleEventHandler += newChangePageBasciInfoDele(firstinfopage_ChangePageBasciInfoDeleEventHandler);

 

            moreinfopage.FromDistroyDeleEventHandler += newFromDistroyDele2(basicInfoPage_DistroyFormDeleEventHandler);

            moreinfopage.ChangeBasicInfoDeleEventHandler += newChangeBasicInfoDele(firstinfopage_ChangePageBasciInfoDeleEventHandler);

 

            InitializeComponent();

            resframe.Navigate(firstinfopage);

        }

        void basicInfoPage_DistroyFormDeleEventHandler()

        {

            this.Close();

        }

 

        void basicInfoPage_ChangePageMoreInfoDeleEventHandler()

        {

            resframe.Navigate(moreinfopage);

            moreinfopage.SetMember(basicInfoPage.textBoxid.Text, basicInfoPage.textBoxname.Text, int.Parse(basicInfoPage.textBoxage.Text));

        }

 

        void firstinfopage_ChangePageBasciInfoDeleEventHandler()

        {

            resframe.Navigate(basicInfoPage);

        }

    }

}

 

 

초기 가입 Page에서 2개의 델리게이트를 선언 하였다.

ChangePageBasicInfoDele Page로 이동하기 위한 Delegate로 선언 되어 있고 FromDistroyDele은 취소 버튼에 이벤트가 발생될 때 부모 창을 종료해야 하기 때문에 선언 되어 있다.

 public delegate void ChangePageBasciInfoDele();

 public delegate void FromDistroyDele();

    public partial class FirstInfoPage : Page

    {       

        public event ChangePageBasciInfoDele ChangePageBasciInfoDeleEventHandler = null;

        public event FromDistroyDele FromDistroyDeleEventHandler = null;

        public FirstInfoPage()

        {

            InitializeComponent();

        }

 

기본 가입 Page도 초기 가입Page와 마찬가지로 사용하기 위해 선언되었다.

public delegate void ChangePageMoreInfoDele();

public delegate void DistroyFormDele();

 

    public partial class BasicInfoPage : Page

    {

        MemberList memlist = MemberList.GetInstance();

        public event ChangePageMoreInfoDele ChangePageMoreInfoDeleEventHandler = null;

        public event DistroyFormDele DistroyFormDeleEventHandler = null;

    }

 

 

 

추가 정보 Page에 파일을 읽기 위해 OpenFileDialog 클래스를 사용하였다.

private void buttonUpLoad_Click(object sender, RoutedEventArgs e)

        {           

            openfile.Filter = "사진File(*.bmp,*.jpg)|*.bmp;*.jpg";

             

            openfile.AddExtension = true;

            if (openfile.ShowDialog() == true)

            {                 

                bmp = new BitmapImage(new Uri(openfile.FileName));

                image1.Source = bmp;                     

            }

        }

 

Main창 회원리스트 Page

ListView를 선언해주고 그안에 ListView View가 존재하는데 이 View내에서 사용하기 위한 GridView를 생성 한다그리고 내가 원하는 만큼의 GridViewColumn을 생성한다각 칼럼들은 고유한 Binding을 갖는다보여지는 ListView GridviewColumn Header에 정해진이름이 보여진다.

<Page x:Class="WPFInvestigation.MemberListPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="MemberListPage">

    <Grid>

        <ListView Name="MemberListView" Margin="12">

            <ListView.View>

                <GridView>

                    <GridViewColumn DisplayMemberBinding="{Binding Path = Name}" Width="80" >이름</GridViewColumn>

                    <GridViewColumn DisplayMemberBinding="{Binding Path = Id}" Width="80" >아이디</GridViewColumn>                   

                    <GridViewColumn DisplayMemberBinding="{Binding Path = Age}" Width="80" >나이</GridViewColumn>                 

                </GridView>

            </ListView.View>

        </ListView>

    </Grid>

</Page>

 

 

 

 

 

Member Class

ListView에 아이템을 추가 해주기 위해서 현재 존재하는 칼럼의 Binding Path와 같은 이름을 가지는 속성들을 생성한다.

public class Member

    {

        public Member(string _id, string _name, int age)

        {           

            Name = _name;

            Id = _id;

            Age = age;

        }

        public Member(string _id, string _name, int age, BitmapImage bimage)

        {

            Name = _name;

            Id = _id;

            Age = age;

            MyImage = bimage;

        }       

        public string Name

        {

            get;

            set;

        }

        public string Id

        {

            get;

            set;

        }

        public int Age

        {

            get;

            set;

        }

        public BitmapImage MyImage

        {

            get;

            set;

        }

    }



xmlns:s ="clr-namespace:System;assembly=mscorlib"

xml 네임스페이스를 접두어 s로 정의하는데이것은 resources 컬렉션 내에서 double 구조체를 참조할 수 있다.

StaticResource라는 클래스는 사실 존재하지 않는다다만 MarkupExtension에서 상속받은 StaticResourceExtension 클래스가 있는데이것이 ResourceKey 프로퍼티를 가지고 있다. StaticResource가 마크업 확장으로 분류되는 이유는 이것이 일반적으로 C#코드에서 가증했던 방법을 XAML에서 제공하기 때문이다.

여기서 StaticResourceExtension클래스는 특정한 키로 원하는 값을 사전에서 찾아 제공하는 역활을 한다.

<Window x:Class="ResourceWPF.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:s ="clr-namespace:System;assembly=mscorlib"

    Title="Window1Height="300Width="300">

    <Window.Resources>

        <s:Double x:Key="fontsizeLarge">18.7</s:Double>

        <s:Double x:Key="fontsizemedium">14</s:Double>

        <s:Double x:Key="fontsizesmall">10</s:Double>

    </Window.Resources>

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition></RowDefinition>

            <RowDefinition></RowDefinition>

            <RowDefinition></RowDefinition>

        </Grid.RowDefinitions>      

        <Button Content="LargSizeFontSize="{StaticResource fontsizeLarge}Grid.Row="0"></Button>

        <Button Content="LargSizeFontSize="{StaticResource fontsizemedium}Grid.Row="1"></Button>

        <Button Content="LargSizeGrid.Row="2">

            <Button.FontSize>

                <StaticResource ResourceKey="fontsizesmall"></StaticResource>

            </Button.FontSize>

        </Button>       

    </Grid>   

</Window>

 



Resources컬렉션에서 모든 키는 서로 유일해야 하지만 2개의 서로 다른 Resources컬렉션에서는 동일한 키가 사용될 수 있다.

부모 stactpanel에서 brushtext라는 키를 가진 초록색의 solidColorBrush Resources컬렉션에 정의되어 있다또한 첫 번쨰 자식 StackPanel brushtext라는 동일한 이름을 키로 빨간색의 SolidColorBrush를 정의했다. 2개의 버튼은 그것이 Foreground프로퍼티를 brushtext키를 이용해 설정했는데첫 번쨰 버튼은 빨간색 문자열을 출력하고 두번쨰 brushtext라는 리소스를 가지지않은 stackpanel에 있는 버튼은 부모의 리소스를 사용해 문자열을 초록색으로 출력한다.

엘리먼트나 컨트롤을 리서스로 정의하는 것도 가능하다하지만 한 번만 가능하다리소스로 생성된 Button 객체는 하나의 객체이므로 그 Button이 패널의 자식이라면 이Button은 동일한 패널 속에서 다른 것의 자식이나 다른 패널의 자식이 될 수 없다또한 StaticResource 엘리먼트로 이 Button을 참조하는 순간 이 Button에 대해 어떤 것도 변경할 수 없기 때문에 리소스로 Button을 생성하는 것은 특별한 장점이 없다.

<Window x:Class="ResourceWPF.ResourceLookup"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="ResourceLookup" Height="300" Width="300">

    <StackPanel Name="stack1">

        <StackPanel.Resources>

            <Button x:Key="btn" FontSize="24" Content="Resource Button"></Button>

 

            <SolidColorBrush x:Key="brushtext" Color="Green"></SolidColorBrush>

        </StackPanel.Resources>

        <StackPanel>

            <StackPanel.Resources>

                <SolidColorBrush x:Key="brushtext" Color="Red"></SolidColorBrush>

            </StackPanel.Resources>

            <Button Margin="24" Content="Button Red" HorizontalAlignment="Center" Foreground="{StaticResource brushtext}"></Button>           

        </StackPanel>

        <Button Content="Button Green" HorizontalAlignment="Center" Foreground="{StaticResourcebrushtext}"></Button>

        <StaticResource ResourceKey="btn"></StaticResource>

 

    </StackPanel>

</Window>


컨트롤과 엘리먼트를 리소스로 정의하고 싶다는 것은 엘리먼트의 프로퍼티 전부가 아닌 그중에서 필요한 몇 개의 엘리먼트의 프로퍼티를 설정하기 위해 리소스의 사용을 고려하는 것일 것이다이를 통해 리소스가 여러 엘리먼트나 컨트롤 사이에서 공유되는 하나의 객체임이 명백해진다엘리먼트가 FindResource 메소드가 호출하는 데 있어서 엘리먼트의 Resources컬렉션에 특정 리소스를 찾을 뿐만 아니라 엘리먼트 트리상에 있는 엘리먼트의 조상에서도 리소스를 찾는다는 것이다.

<Application x:Class="ResourceWPF.App"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    StartupUri="ResourceLookup.xaml">

    <Application.Resources>

        

    </Application.Resources>

</Application>

 

이것은 애플리케이션 범위의 Resources절이 WPF 프로그래밍에 얼마나 중요한지를 알려준다. Resources절을 사용해 애플리케이션 범위의 그라디언트 브러시를 정의하여 테스트를 만들었다.

<Application x:Class="ResourceWPF.App"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    StartupUri="ResourceLookup.xaml">

    <Application.Resources>

        <LinearGradientBrush x:Key="brushGradient" StartPoint="0,0" EndPoint="1,1">

            <LinearGradientBrush.GradientStops>

                <GradientStop Offset="0" Color="black"></GradientStop>

                <GradientStop Offset="0.5" Color="Green"></GradientStop>

                <GradientStop Offset="1" Color="Red"></GradientStop>

            </LinearGradientBrush.GradientStops>

        </LinearGradientBrush>       

    </Application.Resources>

</Application>

 

<Window x:Class="ResourceWPF.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    

       

    Title="Window1" Height="300" Width="300">

    <StackPanel>

        <TextBlock Text="Gradient text" Margin="{StaticResource thicknessMargin}" Foreground="{StaticResource brushGradient}"></TextBlock>

        <TextBlock Text="Of black green red" Margin="{StaticResource thicknessMargin}" Foreground="{StaticResource brushGradient}"></TextBlock>

        <TextBlock Text="Makes and app pretty" Margin="{StaticResource thicknessMargin}" Foreground="{StaticResource brushGradient}"></TextBlock>

        <TextBlock Text="Make an app bold" Margin="{StaticResource thicknessMargin}" Foreground="{StaticResource brushGradient}"></TextBlock>

    </StackPanel>

</Window>

 


IIS를 통한 WCF웹 서비스/실버라이트 배포

기본적으로 크로스 도메인 문제를 해결해야 하는데 아래를 참고 하면 될 것입니다.

http://cafe.daum.net/smbitpro/TUaR/96

 


IIS를 이용하는 http서비스를 할 것이기 때문에 서버로 쓰기위한 컴퓨터에 IIS가 필요합니다.

설치가 되어있지않다면 제어판 -> 프로그램 추가/제거 -> windows구성요소 추가/제거를 누른뒤 응용프로그램 서버에서 인터넷 정보서비스 IIS를 설치 체크하고 설치합니다.





설치된 IIS를 실행합니다.

 

시작 -> 제어판 -> 관리도구-> 인터넷 정보 서비스관리

 

 

실버라이트 웹사이트를 돌리기 위해서는 asp.net v2.0이상이 있어야 하는데 웹 사이트 등록 정보를 통해 버전을 확인해 줍니다.



2.0이 설치 되어 있지 않다면





이후 설치된 윈도우의 위와 같은 폴더로 이동합니다여시서 명령어 aspnet_regiis -i 를 입력합니다그럼 asp.net을 설치한다는 화면이 지나갑니다.

 

버전확인이 끝나면 이제 실버라이트에서 컴파일된 파일인 xap파일을 열 수 있게 MIME설정을 해주어야 합니다.

웹 서비스를 제공할 사이트에서 속성을 클릭합니다.




기본 웹 사이트 ->속성 ->http 헤더-> 새 형식 에서 

연결된 확장명(A)

컨텍트형식(MIME)

.xaml

Application/xaml+xaml

.xap

Application/x-sliverlight-app

.bap

Application/x-ms-xbap

 

추가합니다여기 까지 했으면 웹페이지에서 실버라이트를 볼 준비가 어느정도 끝났습니다.




기본 웹사이트는 아마 c:\Inetpub\wwwroot 일겁니다정상적으로 됬다면 IIS의 해당 웹사이트에 파일을 볼 수 있습니다.




실제로 접속이 되는지 확인해 봅니다.

실제로 배포할 프로젝트를 실행하여 서비스 참조 구성을 선택합니다.



WCF서비스로 등록한 주소를 입력합니다.








웹 사이트에서 웹사이트 게시를 클릭합니다.

확인을 누르고 덮어 쓰기 하겠냐 하면 덮어 쓰기를 합니다그리고 대상 위치를 이동합니다이동하면 테스트 페이지와 서비스.svc 그리고 clientbin폴더 bin폴더 이렇게 구성된 폴더가 보입니다이곳의 모든 파일을 웹사이트 페이지로 이동합니다.이전에 있단 파일은 지우고 현재 파일로 대체합니다.

 

이렇게 하면 Database를 제대로 읽어 오지 못할 겁니다왜냐하면 주소가 제대로 지정되어 있지 않습니다. http://로 시작하는 부분이 컴퓨터 이름이 들어가 있습니다

 

기본 웹 사이트 -> 속성 ->웹사이트 -> 고급 -> 이 웹 사이트의 복수 ID -> 기본 -> 편집

 

 

웹사이트의 등록정보에 웹사이트에 고급에서 기본 ip 주소를 편집해 호스트 헤더값에 웹서비스를 실행하는 컴퓨터 ip를 적어 두고 다시 Service.svc를 확인해보면 아이피로 바껴 있는 것을 볼 수 있습니다.



SearchBook.zip



도서 검색 프로그램


네이버 OpenAPI 으로 검색을 요청 해당 XML을 파싱하여 프로그램에 보여줄 수 있게 하였다.

  


Book 클래스는 아래와 같은 디자인으로 되어있다.

  class Book

    {
        public string Bname { get; private set; }
        public string Publisher { get; private set; }
        public string Author { get; private set; }
        public int Price { get; private set; }
        public int DisPrice
        {
            get;
            private set;
        }
        public string Link 
        { 
            get; 
            private set;
        }
        public string Desc { get; private set; }

        public Book(string _bname, string _publisher, string _author, int _price, string _link, string _desc)
        {
            Bname = _bname;   
            Publisher = _publisher;
            Author = _author; 
            Price = _price; 
            Link = _link; 
            Desc = _desc; 
        }

        public override string ToString()
        {
            return this.Bname;
  
    }

위그림을 통해 네이버에서 제공하는 검색api를 사용하여 xml 로 나타난 목록을 확인 할 수 있다. 



BookSearch 클래스

 static class BookSearch

    {
        static ArrayList bl = new ArrayList();

        public static ArrayList Naver(string booksname)
        {
            bl.Clear();
            string bname = null;
            string publisher = null;
            string author = null;
            string link = null;
            int price = 0;
            int disprice = 0;

            string addr = string.Format("http://openapi.naver.com/search?key=??????????????????&query={0}&target=book&display=100&start=1", 
                HttpUtility.UrlEncode(booksname, Encoding.GetEncoding("utf-8")));
            //???????????구간에 해당 사이트에서 발급받은 key값을 넣어준다.
              
            XmlDocument xd = new XmlDocument();
            xd.Load(addr); 

            XmlNode node = xd.SelectSingleNode("rss");  
            XmlNode xnode = node.SelectSingleNode("channel"); 
            XmlNode cnode;
            XmlNodeList xnl = xnode.SelectNodes("item");
            foreach (XmlNode xmlnode in xnl)
            {
                xnode = xmlnode.SelectSingleNode("title");
                bname = ConvertString(xnode.InnerText);
               
                xnode = xmlnode.SelectSingleNode("author");
                author = xnode.InnerText;
               
                xnode = xmlnode.SelectSingleNode("price");
                price = int.Parse(xnode.InnerText);

                xnode = xmlnode.SelectSingleNode("discount");
                try
                {
                    disprice = int.Parse(xnode.InnerText);
                }
                catch
                {
                    disprice = price;
                }

                xnode = xmlnode.SelectSingleNode("publisher");
                publisher = xnode.InnerText;

                cnode = xmlnode.SelectSingleNode("description");
                link = ConvertString(cnode.InnerText);

                cnode = xmlnode.SelectSingleNode("description"); 
                string desc = ConvertString(cnode.InnerText);

                bl.Add(new Book(bname,publisher,author,price,link,desc));                                
            }
            return bl;
        }

        private static string ConvertString(string p)
        {
            int i = 0;
            int j = 0;

            while ((i = p.IndexOf("<")) != -1)
            {
                j = p.IndexOf(">");
                p = p.Remove(i, j - i + 1);
            }
            return p;
        }
    }




'Programing > C#&.Net' 카테고리의 다른 글

D Day 프로그램  (0) 2016.11.30
계산기 예제  (0) 2016.11.30
노트북 블루투스 + 안드로이드 폰 연동  (0) 2016.11.30
speech To Text  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30

+ Recent posts