//윤곽선 구하기

void findContours( InputOutputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset=Point());
모드 종류 설명
CV_RETR_EXTERNAL = 맨 바깥의 외곽만 검출, 내부의 공백은 무시됨
CV_RETR_LIST = 외곽 검색 결과를 일련의 리스트로 관리, 계층구조는 의미 없음
CV_RETR_CCOMP = 외곽 검색 결과를 2계층으로 나누어 관리, 1층=바깥선, 2층=안선
V_RETR_TREE = 외곽 검색 결과를 트리구조로 관리, 루트=최외곽선


//코드

int     Test_Conture()
{
    Mat src = imread( "..\\mask-1.png", 1 ), gray, temp, mask;
    if( src.empty()) return 0;   
   
    cvtColor( src, mask, COLOR_BGR2GRAY); //단색으로 변환


    //차영상 골라내기(필터링, 노이즈 제거)
    int niters = 3;//반복 횟수   
    dilate(mask, temp, Mat(), Point(-1,-1), niters);//팽창, 밝은 영역 확장   
    erode(temp, temp, Mat(), Point(-1,-1), niters*2);//침식, 노이즈 제거   
    dilate(temp, temp, Mat(), Point(-1,-1), niters);//다시 팽창
    threshold(temp, temp, 200, 256, CV_THRESH_BINARY);//회색(그림자) 지우기
   
    //단색 이미지만 가능, 주의! 입력된 영상(temp)도 변경된다.   
    vector<vector<Point> > contours; //외곽선 배열
    vector<Vec4i> hierarchy;//외곽선들 간의 계층구조
    findContours( temp, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );//

    int nAreaCnt = contours.size();
    //_DbgStr(_T("cont=%d ,hier=%d"),nAreaCnt, hierarchy.size());
    src = Scalar(0,0,0);//지우기
    for(int i=0; i< nAreaCnt; i++){
        Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );//랜덤 색 만들기
        int thickness = 2;//CV_FILLED=내부 채움
        drawContours( src, contours, i, color, thickness , 8, hierarchy );//외곽선 그리기  
    }

    return 1;
}


//

BackgroundSubtractorMOG2 로 배경제거


노이즈 제거


외곽선 검출

1 . CV_RETR_EXTERNAL
2. CV_RETR_LIST, CV_RETR_CCOMP , V_RETR_TREE


반응형

'Code > Desktop' 카테고리의 다른 글

샘플 추적용 영상 다운로드 사이트  (0) 2014.03.11
MatLab 컴파일 관련 에러 해결  (0) 2014.03.11
[OpenCV] Mat 사용법 - 이미지  (0) 2014.03.08
ATL::CImage GetBits memcpy error 해결  (0) 2014.02.23
콜백함수  (1) 2014.02.06
Posted by codens