'Programming/OpenCV'에 4개의 글이 있습니다.

[OpenCVSharp] XNA와 OpenCVSharp 연동하기

posted-at2013.02.12 13:09 :: posted-inProgramming/OpenCV :: posted-byNarrL

XNA의 Texture2D를 통해 OpenCV 에서 받아오는 웹캠 이미지를 출력. (iplImage를 Texture2D로 변환)

using System;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

using OpenCvSharp;


using ProjectMercury;
using ProjectMercury.Emitters;
using ProjectMercury.Modifiers;
using ProjectMercury.Renderers;

namespace yugioh_xna
{

    /// 
    /// This screen implements the actual game logic. It is just a
    /// placeholder to get the idea across: you'll probably want to
    /// put some more interesting gameplay in here!
    /// 
    class GameplayScreen : GameScreen 
    {
        //  using Microsoft.Xna.Framework.Game;
        #region Fields
        ContentManager content;
        SpriteFont gameFont;

        float pauseAlpha;

        #endregion

        #region 선언(Fields)
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        //한글 폰트용 변수
        SpriteFont hanFont;

        Texture2D backgroundTexture;

        public System.Timers.Timer TimerGameTurn = new System.Timers.Timer();
        Texture2D[] TimeTexture = new Texture2D[31];


        Texture2D webCamTexture;
        IplImage cam;// = new IplImage(640, 480, BitDepth.U8, 3);
        IplImage res;// = new IplImage(640, 480, BitDepth.U8, 3);
        CvCapture cap;

        #endregion

        //머큐리 파티클 엔진 변수
        Renderer defaultRenderer;
        ParticleEffect defaultEffect1;
        ParticleEffect defaultEffect2;

        //파티클 position
        float[,] defaultPos = new float[8, 2] {{480.0f, 200.0f}, 
                                               {480.0f, 350.0f}, 
                                               {480.0f, 720.0f}, 
                                               {480.0f, 880.0f}, 
                                               {810.0f, 200.0f}, 
                                               {810.0f, 350.0f}, 
                                               {810.0f, 720.0f},
                                               {810.0f, 880.0f}};



        #region Initialization

        /// 
        /// Constructor.
        /// 
        ///        
        public GameplayScreen()
        {
            TransitionOnTime = TimeSpan.FromSeconds(1.5);

            Content.RootDirectory = "Content";
            graphics = new GraphicsDeviceManager(this);
            graphics.ApplyChanges();
            

            TransitionOffTime = TimeSpan.FromSeconds(0);

            #region 머큐리 엔진
          
            defaultRenderer = new SpriteBatchRenderer
            {
                GraphicsDeviceService = graphics
            };


            defaultEffect1 = new ParticleEffect();
            defaultEffect2 = new ParticleEffect();
  #endregion
 

        }

        /// 
        /// Load graphics content for the game.
        /// 

/// public override void LoadContent() { if (content == null) content = new ContentManager(ScreenManager.Game.Services, "Content"); spriteBatch = ScreenManager.SpriteBatch; hanFont = content.Load

("Hangul_SpriteFont"); gameFont = content.Load("menufont"); backgroundTexture = content.Load("Imeage//배경_1280_1024"); #region 머큐리 엔진 //파티클 Load defaultEffect1 = content.Load("EffectLibrary\\Default1"); defaultEffect1.LoadContent(this.content); defaultEffect1.Initialise(); defaultEffect2 = content.Load("EffectLibrary\\Default2"); defaultEffect2.LoadContent(this.content); defaultEffect2.Initialise(); defaultRenderer.LoadContent(content); cam = new IplImage(640, 480, BitDepth.U8, 3); res = new IplImage(640, 480, BitDepth.U8, 3); cap = CvCapture.FromCamera(CaptureDevice.DShow, 0); cap.SetCaptureProperty(CaptureProperty.FrameWidth, 640); cap.SetCaptureProperty(CaptureProperty.FrameHeight, 480); //웹켐 받아 오기 webCamTexture = new Texture2D(ScreenManager.GraphicsDevice, cap.FrameWidth, cap.FrameHeight, false, SurfaceFormat.Color); //일단로드 우리가, 우리가, 아주 긴 프레임을 완료하고 지금은 잡으려고해서는 //안되는 게임의 타이밍 메커니즘을 말할 ResetElapsedTime 사용가 완료되었습니다. ScreenManager.Game.ResetElapsedTime(); #endregion } /// /// Unload graphics content used by the game. /// public override void UnloadContent() { content.Unload(); } #endregion #region Update and Draw /// /// 업데이트 게임의 상태. 이 방법은 GameScreen.IsActive 속성을 확인합니다, /// 그래서 게임이 일시 중지 메뉴가 활성화되어 있으면 또는 당신에게 /// 탭을 떨어져 다른 응용하는 경우 업데이 트가 중단됩니다. /// public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen) { //base.Update(gameTime, otherScreenHasFocus, false); //점차적으로 또는 우리는 정지 화면의 적용 여부에 따라 페이드 아웃. if (coveredByOtherScreen) pauseAlpha = Math.Min(pauseAlpha + 1f / 32, 1); else pauseAlpha = Math.Max(pauseAlpha - 1f / 32, 0); if (IsActive) { // TODO: this game isn't very fun! You could probably improve // it by inserting something more interesting in this space :-) #region 머큐리 엔진 defaultEffect1.Trigger(new Vector2(0, 0)); defaultEffect2.Trigger(new Vector2(100, 100)); float SecondsPassed = (float)gameTime.ElapsedGameTime.TotalSeconds; defaultEffect1.Update(SecondsPassed); defaultEffect2.Update(SecondsPassed); #endregion } base.Update(gameTime, otherScreenHasFocus, false); } /// /// 있습니다이 게임은 플레이어의 입력을 처리합니다. /// 업데이트 방법과는 달리, 이것은 게임 플레이 화면이 활성화되었을 때 호출됩니다. /// public override void HandleInput(InputState input) { if (input == null) throw new ArgumentNullException("input"); // Look up inputs for the active player profile. int playerIndex = (int)ControllingPlayer.Value; KeyboardState keyboardState = input.CurrentKeyboardStates[playerIndex]; if (input.IsPauseGame(ControllingPlayer)) { TimerGameTurn.Stop(); ScreenManager.AddScreen(new PauseMenuScreen(), ControllingPlayer); } else { TimerGameTurn.Start(); // Otherwise move the player position. Vector2 movement = Vector2.Zero; if (keyboardState.IsKeyDown(Keys.Left)) movement.X--; if (keyboardState.IsKeyDown(Keys.Right)) movement.X++; if (keyboardState.IsKeyDown(Keys.Up)) movement.Y--; if (keyboardState.IsKeyDown(Keys.Down)) movement.Y++; if (movement.Length() > 1) movement.Normalize(); } } /// /// Draws the gameplay screen. /// public override void Draw(GameTime gameTime) { #region 머큐리 엔진 ScreenManager.GraphicsDevice.Clear(ClearOptions.Target, Color.CornflowerBlue, 0, 0); defaultRenderer.RenderEffect(defaultEffect1); defaultRenderer.RenderEffect(defaultEffect2); SaveStateMode mode = new SaveStateMode(ScreenManager.GraphicsDevice); mode.Restore(); cam = cap.QueryFrame(); int Size = cam.ImageSize / 3; byte[] bgrData = new byte[cam.ImageSize]; Color[] colorData = new Color[Size]; System.Runtime.InteropServices.Marshal.Copy(cam.ImageData, bgrData, 0, res.ImageSize); for (int i = 0; i < colorData.Length; i++) { colorData[i] = new Color( bgrData[i * 3 + 2], bgrData[i * 3 + 1], bgrData[i * 3]); } graphics.GraphicsDevice.Textures[0] = null; webCamTexture.SetData(colorData); graphics.GraphicsDevice.SetRenderTarget(null); //// GraphicsDevice.Clear(Color.White); spriteBatch.Begin(); spriteBatch.Draw(webCamTexture, new Rectangle(0, 0, 1280, 1024), Color.White); spriteBatch.End(); #endregion //화면 전환시} if (TransitionPosition > 0 || pauseAlpha > 0) { float alpha = MathHelper.Lerp(1f - TransitionAlpha, 1f, pauseAlpha / 2); ScreenManager.FadeBackBufferToBlack(alpha); } } #endregion struct SaveStateMode { BlendState m_Blenstate; DepthStencilState m_DepthState; RasterizerState m_RasterState; SamplerState m_SamplerState; GraphicsDevice m_Device; public SaveStateMode(GraphicsDevice device) { m_Device = device; m_Blenstate = BlendState.Opaque; m_DepthState = DepthStencilState.Default; m_RasterState = m_Device.RasterizerState; m_SamplerState = m_Device.SamplerStates[0]; } public void Restore() { m_Device.BlendState = m_Blenstate; m_Device.DepthStencilState = m_DepthState; m_Device.RasterizerState = m_RasterState; m_Device.SamplerStates[0] = m_SamplerState; } } } }


[OpenCVSharp] 공부를 위한 블로그

posted-at2013.01.15 16:42 :: posted-inProgramming/OpenCV :: posted-byNarrL

http://tramper2.blog.me/


OpenCVSharp을 강의 주제별로 나눠서 설명을 잘해논 블로그라


전에 포스팅한 WPF + OpenCVSharp 을 응용하면 WPF를 이용한 OpenCV 또한 거의 마스터 할 수 있음.

[OpenCVSharp] WPF와 OpenCVSharp 연동하기

posted-at2013.01.15 13:02 :: posted-inProgramming/OpenCV :: posted-byNarrL

WPF의 Image를 통해 OpenCV 에서 받아오는 웹캠 이미지를 출력.

//------------------------------------------------------------------------------
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//------------------------------------------------------------------------------

namespace Microsoft.Samples.Kinect.ColorBasics
{
    using System;
    using System.Globalization;
    using System.IO;
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Linq;
    using System.Diagnostics;
    using System.Collections.Generic;

    using OpenCvSharp;
    using OpenCvSharp.Extensions;

    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        CvCapture cap;
        WriteableBitmap wb;
        System.Windows.Threading.DispatcherTimer TimerClock;
        const int frameWidth = 640;
        const int frameHeight = 480;

        /// 
        /// Initializes a new instance of the MainWindow class.
        /// 
        public MainWindow()
        {
            InitializeComponent();
        }

        /// 
        /// Execute startup tasks
        /// 
        /// object sending the event
        /// event arguments
        private void WindowLoaded(object sender, RoutedEventArgs e)
        {
            if (InitWebCamera())
            {
                StartTimer();
            }
            else
            {
                MessageBox.Show("웹캠에 문제가 있습니다.");
            }
        }

        private bool InitWebCamera()
        {
            try
            {
                cap = CvCapture.FromCamera(CaptureDevice.DShow, 0);
                cap.FrameWidth = frameWidth;
                cap.FrameHeight = frameHeight;
                wb = new WriteableBitmap(cap.FrameWidth, cap.FrameHeight, 96, 96, PixelFormats.Bgr24, null);
                Image.Source = wb;
                ImageResult.Source = wb;

                return true;
            }
            catch
            {
                return false;
            }
        }

        private void StartTimer()
        {
            TimerClock = new System.Windows.Threading.DispatcherTimer();
            TimerClock.Interval = new TimeSpan(0, 0, 0, 0, 33);
            TimerClock.IsEnabled = true;
            TimerClock.Tick += new EventHandler(TimerClock_Tick);
        }

        void TimerClock_Tick(object sender, EventArgs e)
        {
            using (IplImage src = cap.QueryFrame())
            {
                WriteableBitmapConverter.ToWriteableBitmap(src, wb);
            }
        }

        /// 
        /// Execute shutdown tasks
        /// 
        /// object sending the event
        /// event arguments
        private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            TimerClock.IsEnabled = false;
            if (cap != null)
            {
                cap.Dispose();
            }
        }
    }
}

[OpenCVSharp] C#용 OpenCV 설치 VS2010

posted-at2013.01.15 12:55 :: posted-inProgramming/OpenCV :: posted-byNarrL

OpenCV 라이브러리를 C#에서 이용하고자 합니다. C#에서의 환경설정은 C/C++ 보다는 간단합니다.

어떤버전은 pre-build된 소스를 이용해도 괜찮은것 같기도 하지만 제가 사용한 2.4.0버전은 pre-build된 파일들을 이용하면

파일을 찾을수 없다는 에러가 발생되어 CMake를 이용하여 다시 빌드한 파일들을 이용하였습니다.


OpenCVSharp은 OpenCV를 C#에서 사용할수 있도록 패키징 해놓은 라이브러리 입니다. 따라서 OpenCV 라이브러리와 패키징된 OpenCVSharp라이브러리를 모두 이용하여야 합니다.


1. OpenCV 2.4.0 , OpenCVSharp 2.4.0 라이브러리 다운로드

2. OpenCV 라이브러리 빌드.

3. VS2010에 셋팅

4. 실행


OpenCVSharp : http://code.google.com/p/opencvsharp/downloads/list

OpenCV Site : http://opencv.org/

CMake : http://www.cmake.org/cmake/resources/software.html


위 사이트에서 OS Platform에 맞게 라이브러리를 다운받습니다.


OpenCVSharp은 OpenCV버전이 업데이트 되면 그에따라 추가적으로 다른 그룹에서 만드는 것이므로 

버전업데이트가 OpenCV보다 느립니다.


OpenCV 라이브러리의 최신버전과 OpenCVSharp 최신버전이 다를 수 있으므로 OpenCVSharp를 다운받은 후 

같은 버전으로  OpenCV라이브러리를 다운로드 합니다.


다운받을시 OS 버전이 64bit라고 64bit를 받는게 아니고 개발할 프로그램이 64bit일 경우 64bit를 받아야 합니다.


CMake가 없을경우 CMake도 다운로드 합니다.



OpenCVSharp는 단순히 포장만 한것이므로 실제 코드가 없습니다.

앞서 빌드한 OpenCV의 dll파일들을 항상 추가적으로 복사해주어야합니다.


프로젝트 소스의 bin\Debug에 앞서 빌드한 dll파일들을 복사해 줍니다.

만약 프로젝트를 Release모드로 빌드를 한다면 Release폴더에도 따로 복사를 해주어야 정상적으로 실행됩니다.


프로젝트 빌드를 해보면 OpenCVSharp.dll파일이 실행파일과 함께 Debug폴더로 복사됨을 알수 있는데

이 OpenCVSharp.dll과 나머지 OpenCV dll파일들과 실행파일이 한폴더에 있으면 문제없이 실행됩니다.