Skip to content

생계형 개발자 수첩 ver4.0

이제 나이 먹어 강제로 4.0 버전업됨, 일인개발자임, 파키스탄식 코딩.. 오래된 코드도 다시 쓴다.

Tag: OpenCV

C# OpenCV Kmeans

Posted on 2017년 12월 3일 by kimczip

K-means algorithm 란?

k-평균 클러스터링 알고리즘은 클러스터링 방법 중 분할법에 속한다. 분할법은 주어진 데이터를 여러 파티션 (그룹) 으로 나누는 방법이다. 예를 들어 n개의 데이터 오브젝트를 입력받았다고 가정하자. 이 때 분할법은 입력 데이터를 n보다 작거나 같은 k개의 그룹으로 나누는데, 이 때 각 군집은 클러스터를 형성하게 된다. 다시 말해, 데이터를 한 개 이상의 데이터 오브젝트로 구성된 k개의 그룹으로 나누는 것이다. 이 때 그룹을 나누는 과정은 거리 기반의 그룹간 비유사도 (dissimilarity) 와 같은 비용 함수 (cost function) 을 최소화하는 방식으로 이루어지며, 이 과정에서 같은 그룹 내 데이터 오브젝트 끼리의 유사도는 증가하고, 다른 그룹에 있는 데이터 오브젝트와의 유사도는 감소하게 된다.[7] k-평균 알고리즘은 각 그룹의 중심 (centroid)과 그룹 내의 데이터 오브젝트와의 거리의 제곱합을 비용 함수로 정하고, 이 함수값을 최소화하는 방향으로 각 데이터 오브젝트의 소속 그룹을 업데이트 해 줌으로써 클러스터링을 수행하게 된다. 출저 : 위키피디아

 

적용 이미지 예시 ( OpenCV 공식 홈페이지 )

이미지 선 성분 검출을 위해서 서전에 이 작업을 거치면 비교적 원하는 결과를 얻을 수 있다.

OpenCVSharp ver 3.2에서는 Kmeans Method를 지원한다.

이 Method의 Parameter의 의미는 여기에서 참조 하길 바란다.

아래는  C#으로 구현된 OpenCVSharp을 활용한 K-means

public static void Kmeans(Mat input, Mat result, int k)
{
    using (Mat points = new Mat())
    {
	using (Mat labels = new Mat())
	{
	    using (Mat centers = new Mat())
	    {
		int width = input.Cols;
		int height = input.Rows;

		points.Create(width * height, 1, MatType.CV_32FC3);
		centers.Create(k, 1, points.Type());
		result.Create(height, width, input.Type());

		int i = 0;
		for (int y = 0; y < height; y++)
		{
		    for (int x = 0; x < width; x++, i++)
		    {
			Vec3f vec3f = new Vec3f
			{
			    Item0 = input.At<Vec3b>(y, x).Item0,
			    Item1 = input.At<Vec3b>(y, x).Item1,
			    Item2 = input.At<Vec3b>(y, x).Item2
			};

			points.Set<Vec3f>(i, vec3f);
		    }
		}

		Cv2.Kmeans(points, k, labels, new TermCriteria(CriteriaType.Eps | CriteriaType.MaxIter, 10, 1.0), 3, KMeansFlags.PpCenters, centers);

		i = 0;
		for (int y = 0; y < height; y++)
		{
		    for (int x = 0; x < width; x++, i++)
		    {
			int idx = labels.Get<int>(i);

			Vec3b vec3b = new Vec3b();


			int tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item0));
			tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp;
			vec3b.Item0 = Convert.ToByte(tmp);

			tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item1));
			tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp;
			vec3b.Item1 = Convert.ToByte(tmp);

			tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item2));
			tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp;
			vec3b.Item2 = Convert.ToByte(tmp);

			result.Set<Vec3b>(y, x, vec3b);

		    }
		}
	    }
	}
    }

}

 

 

 

Posted in 3.0Tagged C#, OpenCV, 개발팁Leave a comment

C# OpenCV (OpenCVSharp) Mat Class To Bitmap

Posted on 2017년 7월 28일 by kimczip
using OpenCvSharp

/* Mat => System.Drawing.Bitmap */
Bitmap bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);

/* System.Drawing.Bitmap => Mat */
Mat mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);

/* Mat => byte[] */
// TYPE 1
byte[] imageBytes = mat.ToBytes(".jpg");
// TYPE 2
byte[] imageBytes;
Cv2.ImEncode(".jpg", mat, out imageBytes);

/* byte[] => Mat */

// TYPE 1 : COLOR
Mat colorMat = Mat.FromImageData(imageBytes, LoadMode.Color);
// TYPE 2 : GRAY
Mat grayMat = Mat.FromImageData(imageBytes, LoadMode.GrayScale);
// TYPE 3
Mat grayMat = Cv2.ImDecode(imageBytes, LoadMode.GrayScale);

 

Posted in 3.0Tagged C#, OpenCV, 개발팁4 Comments

C# OpenCV 3.2 사용하기 (OpenCvSharp)

Posted on 2017년 7월 3일 by kimczip

C#에서 OpenCV를 사용하고자 할 때, Visual Studio가 설치 되어 있다면

도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔 을 실행한다.

패키지 관리자 콘솔창에서 다음과 같이 입력

Install-Package OpenCvSharp3-AnyCPU

그러면 자동으로 설치가 되고, 관련 DLL 파일은 솔루션 디렉토리 내에 packages 폴더에 존재한다.

간단한 예제

using OpenCvSharp;

private void Form1_Load(object sender, EventArgs e)
{
   Mat image = Cv2.ImRead(SAMPLE_IMG, ImreadModes.Color);
   Cv2.NamedWindow("OriginImage", WindowMode.AutoSize);
   Cv2.ImShow("OriginImage", image);
}

 

소스 보기
소스 숨김

만약, 실행 중 오류가 난다면 OpenCV 홈페이지에서 (http://opencv.org/releases.html) WinPack 파일을 다운 받은 후, 압축 해제하고
버전 마다 틀리겠지만 3.2버전 기준으로 opencv\build\x64\vc14\bin 디렉토리에 있는 파일 전체를 복사하여, 현재 개발중인 프로젝트의 Debug폴더에 복사&붙여넣기한 후 실행하면 해결된다.

Posted in 3.0Tagged C#, OpenCVLeave a comment

버전

  • 3.0
  • 4.0

최근에..

  • 실행파일 디지털 서명하기 (프로그램 배포)
  • 자신의 PC에 막혀 있는 포트 검색
  • DB Table Column 이름 가져오기.
  • DLL 파일 PublicKeyToken 얻기
  • DSM 7.0에서 MariaDB 10 설정

Tags

10Gbps AMD Bitspower C# Command Control Corsair Crawling Exception F4-3200C14D-16GFX FLAREX G.Skill git gogs MariaDB MySQL NAS OpenCV Parallel PC-O9 rainmeter Ryzen scimitar Thermaltake UI Web WinForm 개발팁 개인사업자 광명시청 네트워크속도 데이터베이스 라이젠 랜선 랜케이블 리안리 메모리 명령프롬프트 수냉쿨링 수로 시놀로지 직구 커스텀쿨링 컴퓨터 퍼옴
Proudly powered by WordPress | Theme: micro, developed by DevriX.