2014. 1. 9. 15:00

'OpenCVSharp'의 설명페이지에는 별도의 작업 없이 'OpenCVSharp.dll'만 참조하면 mono에서도 'OpenCVSharp'를 사용 할수 있다고 나와 있습니다.

(참고 : OpenCVSharp -  Tutorial_UnixPlatforms)

'ml'와 'cvblob'는 컴파일을 다시 해서 사용하라고 나와있습니다.

('OpenCVSharp'의 소스를 받아보면 모노를 구분하여 작성된 코드들이 보입니다. 이것으로 보아 모노를 지원하는 것이 맞는것 같네요.)

 

그런데 테스트 프로그램을 만들어서 돌려보니 안됩니다-_-;

Mono로 작성해보니 윈도우 스타일로 하면 안되겠다는 생각이 드네요-_-;

 

 

1. 준비하기

일단 우분투에 'OpenCV'를 설치 해야 합니다.

'OpenCV'의 버전은 'OpenCVSharp'의 버전과 같은 버전을 사용해야 합니다.

 

설치방법은 다른 포스팅에서 써놨습니다.

(참고 : [Ubuntu] OpenCV 설치 )

 

opencvsharp를 다운받습니다.

opencvsharp - Downloads

 

2. monodevelop 프로젝트 생성

우분투에서 'monodevelop'를 실행하고 'Gtk# 2.0'으로 프로젝트를 만듭니다.

 

 

2-1. 프로젝트 준비하기

윈도우에서 처럼 생성된 프로젝트를 빌드하고 디버그(Debug) 폴더로 이동합니다.

(솔루션 > 프로젝트 오른쪽 클릭 > Open Containing Folder 을 선택하면 쉽게 이동 할수 있습니다.)

 

 

디버그 폴더로 이동하여 'OpenCVSharp'의 dll파일들을 복사 해줍니다.

(참고 : [C#.Net, OpenCVSharp] 'opencvsharp'를 이용하여 C#에서 OpenCV 사용하기)

 

윈도우와 다르게 OpenCV가 설치되어 있으므로 OpenCV관련 파일들은 복사하지 않습니다.

 

 

2-2. 테스트용 이미지 넣기

같은 위치에 테스트용 이미지도 넣습니다.

단지 일단 '.jpg' 파일을 넣으세요.

이유는 모르겠지만 우분투에서 'opencv'를 이용하여 '.png'를 불러왔더니 'null'이 넘어옵니다.

(이게 png파일을 저장할때 옵션을 바꾸면 될수도 있습니다.)

 

 

2-3. 참조 추가하기

참조 추가하는 것은 비주얼 스튜디오와 비슷합니다.

 

References 오른쪽 클릭 > Edit References...

를 선택 합니다.

 

 

'Net Assembly'탭을 선택한후 'OpenCVSharp'을 넣은 폴더를 찾아 'OpenCvSharp.dll'를 선택 합니다.

 

 

 

 

 

 

이제 참조폴더를 보면 'OpenCvSharp.dll'을 볼수 있습니다.

 

 

같은 방법으로 'All'탭에 다음 어셈블리를 찾아 추가합니다.

 

System

System.Drawing

System.Drawing.Design

 

 

3. 코드 작성하기

모노디벨로퍼의 디자인 기능이 허접해서 쓰기가 불편한 편인데...

그래도 일단은 화면 표시를 해야 겠죠?

 

3-1. 디자인

모노디벨로퍼의 버그인지 컨트롤이 화면에는 보이는데 코드상 추가가 안되는 버그가 있더군요-_-;

수작업으로 추가해도 계속 초기화되고;;;

런타임에서 추가하던가 프로젝트를 다시 생성해야 합니다 ㅡ.-;;;

 

이것만 주의 하시면 쉽게 코드를 만들 수 있습니다.

 

디자이너를 열어서 테이블 컨테이너를 추가하고 가운데 칸에 이미지 컨트롤을 추가합니다.

 

Table table1

Image image1

 

 

 

3-2. 코드 작성

C#에 익숙한저도 모노기반 코딩은 쉽지 않네요 ㅡ.-;;

 

여튼 힘내서 코딩을 해봅시다.

 

using System;
using Gtk;
using OpenCvSharp;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;

public partial class MainWindow: Gtk.Window
{	
	public MainWindow (): base (Gtk.WindowType.Toplevel)
	{
		Build ();
		
		OnLoad ();
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}
	
	protected void OnLoad()
	{
		string ssss = System.IO.Path.GetFullPath("imgTest.jpg").ToString();
		
		IplImage img = Cv.LoadImage(ssss);
		image1.Pixbuf = ImageToPixbuf(img.ToBitmap());

		img.Dispose();
	}
	
	private Gdk.Pixbuf ImageToPixbuf(Bitmap image)
	{
		using (MemoryStream stream = new MemoryStream()) 
		{
			image.Save(stream, ImageFormat.Bmp);
			stream.Position = 0;
			Gdk.Pixbuf pixbuf = new Gdk.Pixbuf(stream);
			return pixbuf;
		}
	}
	
	
}

 

 

여기서 주의 해야 할코드를 집어 보겠습니다.

 

픽처박스는 모노에서 구현되지 않았기 때문에 이미지 컨트롤을 사용해야 합니다.

(근데 이미지 컨트롤은 닷넷에서 빠지고 픽처박스로 통합됬습니다 ㅡ.-;; 뭐 그렇다고 해서 이미지컨트롤을 구현 못하는건 아닙니다만.... ㅎㅎㅎㅎ)

그래서 'image1.Pixbuf'를 사용해야 합니다.

 

문제는 'image1.Pixbuf'는 비트맵을 받을수 없습니다.

그러니 'private Gdk.Pixbuf ImageToPixbuf(Bitmap image)'를 통해 비트맵을 'Gdk.Pixbuf'형식으로 바꿔야 합니다.

(참고 : marc.info - [Gtk-sharp-list] Re: System.Drawing.Image <-> Gdk.Pixbuf)

 

'IplImage'에는 스크림이나 바이트로 출력하는 메소드가 있는데.....제가 사용법을 몰라서 그냥 변환용 함수를 만들어 사용합니다;;

 

 

4. 테스트

이제

Run > Debug

를 선택하여 테스트를 해봅시다.

 

 

잘돌아 가네요~

 

 

마무리

그런데 윈도우와 코드가 이렇게 달라서야-_-;

양쪽에 다 돌아갈수 있는 컨트롤을 찾아서 작성해야 할것 같네요.

(아니면 그냥 윈도우에서도 모노기반 코딩을 하던가;;)

'OpenCVSharp'에서 제공하는 픽처박스가 있는데 모노에서는 사용할수 없더라고요-_-;;

 

일단은 동작하는데 의의를 두도록하겠습니다 ㅎㅎㅎㅎ