이진화란?



요즘 카메라로 사진을 찍으면 칼라로 사진을 보통 사진을 찍게 되는데

사람이 보기에는 그냥 빨간색과 검정색옷을 입고 주변 색들도 눈으로 보이는 것과 같지만...

컴퓨터는 조명이나 그림자, 잡영 등에 영향을 받아서 색이 다 다르게 보인다.

그래서 컴퓨터에게 더 쉽게 이해하기 쉬운 영상으로 만들어주는 것이 이진화이다.

검정색과(0) 흰색(255)로 컬러 값을 바꾸는 것이다.



IplImage 타입의 영상을 이진화 하기 위해 사용하는 함수는 cvThreshold라는 함수이며,
이는 입력으로 들어가는 영상의 각 채널을 이진화 한다.
이런 이유로 컬러영상(3개 채널)을 이진화 하는 경우, R, G, B 각각을 이진화 하기 때문에
아래와 같이 의도하지 않은 영상을 얻게 될 수도 있다.



그런 이유 때문에 이진화 전에는 cvCvtColor()를 이용하여 Gray로 변환 후 이진화 한다.
cvCvtColor()의 세 번 째 인수는 어떤 컬러맵으로 변환할 것인지 선택할 수 있으며,
OpenCV에서 제공하는 방법들은 CV_BGR2GRAY 뿐만 아니라 
CV_BGR2YCrCb, CV_BGR2HSV, CV_BGR2Lab 등 여러가지이며 이는 cv.h 파일에서 확인할 수 있다.


cvThreshold() 함수는 실제로 이진화를 수행하는 함수로,
세 번 째 인수는 문턱치를 설정하고,
네 번 째 인수는 문턱치를 넘어선 픽셀들을 어떤 값으로 설정할 것인지를,
다섯 번 째 인수는 이진화 알고리즘을 선택할 수 있다.

중요함수

1.

cvThreshold(const CvArr*  src, CvArr*  dst, double  threshold, double  max_value, int threshold_type)

원본영상, 이진화가 된 후 저장될 영상, 경계가 되는 수치값(임계값), 임계 값을 넘는 픽셀값을 바꿔줄 최대값 설정,이진화방식)


이진화방식

#define CV_THRESH_BINARY      0  //  임계 값 이하 : 0, 임계 값 초과 : 1
#define CV_THRESH_BINARY_INV  1  // 임계 값 이하 : 1, 임계 값 초과 : 0 
#define CV_THRESH_TRUNC       2  // 임계 값 이하는 변화 없음, 임계 값 초과는 임계 값
#define CV_THRESH_TOZERO      3  //   임계 값 이하는 0, 임계 값 초과는 그대로
#define CV_THRESH_TOZERO_INV  4  // 임계 값 이하는 그대로, 임계 값 초과는 0



2.

cvCvtColor( const CvArr* src, CvArr* dst, int code )

원본영상, 변환후 저장될 영상, Color 변환모드


Color 변환모드

CV_RGB2GRAY  - 흑백으로 변환
CV_RGB2YCrCb  -      주로 Skin Color 모델을 할 때 변환
CV_RGB2HLS  - H(Hue색상), L(Luminance,휘도),S(Saturation,채도)
CV_RGB2HSV - 모든 컬러를 Hue, Saturation, Value로 표현하는 방식
CV_RGB2Lab - L은 밝기인 명도, a 조합은 녹색에서 적색의 보색 b 조합은 황색에서 청색의 보색
CV_RGB2Luv -  CIE Yxy색표계에서 지각적 등보성을 보완한 색 공간



결과










[참고] OpenCV 강좌 04. 영상 이진화 하기 (OpenCV KOREA 대한민국 최고의 컴퓨터비젼 커뮤니티)





 

Posted by 아몰라

cVSetMouseCallback 함수로 이벤트 핸들러 함수를 지정하고, 핸들러 함수에서 이벤트를 처리한다.


window_name = 이벤트를 발생시킬 윈도우의 이름을 적는다.
on_mouseEvent = 마우스 이벤트를 처리할 핸들러 함수를 적는다. 함수명은 사용자가 임의로 정해도된다. 단,  인수의 자료형과 의미는 미리 정해져있다.
param = 핸들러 함수로 전달될 사용자 정의 인수이다.



이렇게 인수가 정해져있다.

event = 마우스 이벤트
flags = 마우스 이벤트가 발생했을 때 마우스 버튼, CTRL, SHIFT, ALT 키를 눌렀는지 확인하기 위해 사용된다.
param = 사용자 정의 인수


마우스 이벤트(event)상수

CV_EVENT_MOUSEMOVE      마우스를 움직임
CV_EVENT_LBUTTONDOWN   왼쪽버튼 DOWN
CV_EVENT_RBUTTONDOWN   오른쪽 버튼 DOWN
CV_EVENT_LBUTTONUP        왼쪽 버튼 UP
CV_EVENT_RBUTTONUP        오른쪽 버튼 UP
CV_EVENT_LBUTTONDBLCLK 왼쪽 버튼 더블클릭
CV_EVENT_RBUTTONDBLCLK 오른쪽 버튼 더블클릭



마우스 flags 상수

CV_EVENT_FLAG_LBUTTON  왼쪽버튼누름
CV_EVENT_FLAG_RBUTTON 오른쪽버튼누름
CV_EVENT_FLAG_CTRLKEY CTRL 키를 누름
CV_EVENT_FLAG_SHIFTKEY SHIFT 키를 누름
CV_EVENT_FLAG_ALTKEY   ALT 키를 누름




예제 소스


#include "stdafx.h"
#include <cv.h>
#include <highgui.h> // 키보드 마우스 트랙바 이벤트 처리 기능을 갖는 사용자 인터페이스 함수를 지원한다.

 
void on_eventhandle(int event, int x, int y, int flags, void* param);

int main()
{
  IplImage    *dstImage;
  dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
 cvSet(dstImage, CV_RGB(255, 255, 255));
 
 cvNamedWindow("Mouse Event Handling", CV_WINDOW_AUTOSIZE);
    cvShowImage("Mouse Event Handling", dstImage);

 cvSetMouseCallback("Mouse Event Handling", on_eventhandle,  (void *)dstImage);
    cvWaitKey(0);

 cvDestroyAllWindows();
 cvReleaseImage(&dstImage);
    return 0;
}

void on_eventhandle (int event, int x, int y, int flags, void* param) //핸들러 함수
{
 IplImage    *image;
 image = (IplImage *)param;
 
 switch(event)
 {
  case CV_EVENT_LBUTTONDOWN:
  if(flags & CV_EVENT_FLAG_SHIFTKEY) // 쉬프트를 누르고 클릭시 네모
    cvRectangle(image, cvPoint(x-5, y-5), cvPoint(x+5, y+5), CV_RGB(255, 0, 0));
  else //아니면 원
  {
   cvCircle(image, cvPoint(x, y), 5, CV_RGB(0, 0, 255), 5);
  }
  break;
 
 case CV_EVENT_RBUTTONDOWN:
  cvCircle(image, cvPoint(x, y), 5, CV_RGB(255, 0, 0), 5);
  break;
 }
    cvShowImage("Mouse Event Handling", image);
}


참조 - OpenCv 프로그래밍

 

Posted by 아몰라

void main()
{
 IplImage    *dstImage;
  dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
 cvSet(dstImage, CV_RGB(255, 255, 255));
 cvNamedWindow("키보드이벤트", CV_WINDOW_AUTOSIZE);
    cvShowImage("키보드이벤트", dstImage);

    int nKey = 0;

    while(1)
 {  
  nKey = cvWaitKey(0);
  //cvWaitKey 함수는 delay <= 0 이면 키보드에서 키가 눌러질 때 까지 무한히 기다린다.
  printf("입력하시오 : %x\n", nKey);
        if(nKey == 0x1B) //ESC이면 반환한다.
          break;
    }
 cvDestroyAllWindows();
 cvReleaseImage(&dstImage);

}


'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

이진화하기  (0) 2011.11.02
마우스 이벤트  (0) 2011.10.31
문자 출력  (1) 2011.10.30
선, 사각형, 원, 타원 그리기  (0) 2011.10.30
카메라 입력받기  (0) 2011.10.30
Posted by 아몰라
이전버튼 1 2 3 4 5 6 7 ··· 52 이전버튼