-
OpenCvSharp을 이용한 그림관리(원그리기,채널수 관련 정보) ( 한글한글 ) - 이경민(19기) 2010/02/11
//추가된 네임스페이스
using System.Diagnostics; 은 검출 시간을 체크하기 위한 Stopwatch()를 사용하기 위해 추가된 네임스페이스 입니다
using KwsmLab.OpenCvSharp; OpenCVsharp을 사용하기 위한 네임 스페이스(Tip : 추가된 네임스페이스가 많은데 사용되지 않은 네임스페이스를 걸러 내고 싶으면 코딩이 다 끝난후 네임스페이스 근처에서 마우스 우클릭 unused namespace를 찾아 클릭해주면 사용되지 않은 네임스페이스를 자동으로 정리 해줍니다)
CvColor[] colors = new CvColor[]{ 컬러 구조체 입니다 CvColor(red, green, blue)값을 넣어주게 됩니다
new CvColor(0,0,255), 나중에 찾은 얼굴에서 동그라미를 그려줄때 이 색을 이용해서
new CvColor(0,128,255), 원을 그려주게 됩니다
new CvColor(0,255,255),
new CvColor(0,255,0),
new CvColor(255,128,0),
new CvColor(255,255,0),
new CvColor(255,0,0),
new CvColor(255,0,255),
};
const double SCALE = 1.3;사진 크기를 줄이기 위해 사용 됩니다. 크기를 줄이는 이유는 오히려 얼굴 검출을 용이하게 하기 위해서 인데 이건 좀 더 깊이 파 보아야 합니다 일단 지금은 1.5, 2.0등으로 크기를 바꿔 가 보면서 테스트해보세요 얼굴 검출 내용이 틀려 질겁니다
OpencvSharp 예제에서는 using문을 무척 많이 쓰게 되었는데 이유는 자동 메모리 해제를 위해서 입니다. using문 다음 { 에서 시작해서 }이 끝나면 할당된 메모리도 자동으로 해제 됩니다 이런 방식이 싫다면 using문을 빼고 사용한 후 잊지말고 메모리를 해제 해주는것이 좋습니다 물론 가비지 컬렉터가 있긴 하지만 미래의 버그는 아무도 예측할 수 없습니다
using (IplImage img = new IplImage("misskorea.jpg", LoadMode.Color))
이미지를 저장하기 위한 메모리를 확보합니다 IplImage는 OpenCV에서 이미지 담는 가장 기본이 되는 선언형태이며 IplImage형 img를 선언하고 그곳에 misskorea.jpg를 컬러모드로 읽어서 저장하라는 뜻입니다
using (IplImage small_img = new IplImage(new CvSize(CV.Round(img.Width / SCALE), CV.Round(img.Height / SCALE)), BitDepth.U8, 1))
이번에 역시 small_img란 메모리가 확보 되었는데 이번에는 그림을 읽어 오는것이 아니라 원래 읽은 그림의 size / SCALE 크기만한 메모리 크기를 확보하고 그메모리의 비트뎁스는 8이고, 채널은 1개짜리 메모리입니다. 비트뎁스는 픽셀에 할당된 바이트수와 상관이 있습니다 모니터에 보이는 한 픽셀이 RGB처리이면 8비트 X 8비트 X 8비트 해서 총 3바이트가 할당되게 됩니다 지금 여기서는 1바이트 즉 8비트가 사용되어지겠네요 그리고 채널이란 RGB 모드의 경우 각각의 R, G, B 를 말하는데....
흠...이건 그림을 그려서 설명해야 겟네요 나중에 시간나면 그리겠습니다. 일단은 R를 담는 배열(메모리가 있고) G를 담는 B를 담는 배열(메모리)가 있고 우리가 필요로하는 R이나 G 값만 가져다 쓸 수 있다고 생각하시면 됩니다. 그리고 그게 담겨져 있는 부분이 채널이고 RGB모드인 경우 채널수는 3이 되며 aRGB인경우 채널수는 4개가 됩니다
using (IplImage gray = new IplImage(img.Size, BitDepth.U8, 1))
역시 gray란 메모리를 확보하네요
{
CV.CvtColor(img, gray, ColorConversion.BgrToGray);강좌시작에서 다운 받은 레퍼런스 파일을 보면 CV.cvtColor 메소드에 대한 사용법이 나와 있습니다
CvtColor 메소드는 말 그대로 색을 변환 해주는 기능을 가지고 있습니다
CvtColor(원본을, 이곳에다가, 이런 모드로 바꿔라)
우리는 지금 misskorea.jpg 읽은 것을 gray 메모리에 칼라를 그레이 모드로 바꿔서 저장 이란 뜻이 됩니다
CV.Resize(gray, small_img, Interpolation.Linear);Resize는 그림의 크기를 바꿔 주는것입니다 gray에 담겨있는 이미지를 small_img 에 사이즈를 줄여서 담아줍니다
CV.EqualizeHist(small_img, small_img);
EqualizeHist 메소드는 히스토그램 평활화를 시켜 줍니다 이것역시 공부가 필요한 부분이라 향후 기회가 있을때 다시 설명하겠습니다 지금은 그레이 이미지를 특출나게 어둡거나 밝은 부분을 적당히 펴줘서 전체 값이 일정해 지게 해준다라는 정도라만 이해하세요
}
아래 CvHaarClassifierCascade 관한 알고리즘을 설명하자고 하면 꽤 많은 분량의 설명이 필요합니다
기초강좌부터 머리아프게 가지 말고 그냥 대충 뭐하는것이다 훑고 지나가도록 하겠습니다
using (CvHaarClassifierCascade cascade = CvHaarClassifierCascade.FromFile("haarcascade_frontalface_alt2.xml"))
haarcascade_frontalface_alt2.xml 얼굴 검출에 대한 기계학습 자료가 담겨져 있는 데이타 파일입니다 얼굴을 검출할때 이 자료랑 비교해서 비슷하면 얼굴로 인식하게 되어 있습니다
using (CvMemStorage storage = new CvMemStorage())메모리 확보입니다
{
Stopwatch watch = Stopwatch.StartNew();시간 측정을 위해 스톱워치를 생성해서 시작합니다
CvSeq faces = CV.HaarDetectObjects(small_img, cascade, storage, 1.1, 2, 0, new CvSize(30, 30));검출된 얼굴을 faces에 저장합니다 faces.Total 에 총 검출된 얼굴수가 들어가 있습니다
그다음 처리는 찾은 얼굴의 중심을 구해서 원을 그려주는 과정입니다- TRACKBACK : http://www.swssm.org/trackback.php?id=371
- [prev] ... 1 ... [next]
