기본 콘텐츠로 건너뛰기

[OpenCV]cvDrawContours

cvDrawContours 함수는 contour를 그려주는 함수이며 thickness 0 이상일 경우에는 외곽선만을 그려주고 0 미만일 경우에는 내부를 채워준다.

 

원형

void cvDrawContours( CvArr *img, CvSeq* contour,
                                CvScalar external_color, CvScalar hole_color,
                                int max_level, int thickness=1,

                                int line_type=8, CvPoint offset=cvPoint(0,0) );
 

패러미터

  • img
    • contour를 그릴 IplImage 구조체의 포인터를 넘겨준다. 다른 그리기 함수와 마찬가지로 contour ROI로 클리핑된다.
  • contour
    • CvSeq 구조체의 포인터를 넘겨준다
  • external_color
    • 외부 contour의 색상을 설정한다.
  • hole_color
    • 내부 hole의 색상을 설정한다.
  • max_level
    • 그려질 contour의 최대 단계를 설정한다. 만약 0이면 contour만이 그려질 것이고 1이면 모든 contour를 같은 레벨에 그려준다. 2이면 다음 레벨까지 그려줄 것이다. 만약 음수이면 max_level 값에 절대값을 취한 것에서 1을 뺀 만큼의 자식 contour를 그려준다.
  • thickness
    • 라인의 두께를 설정한다. 만약 음수(CV_FILLED)이면 내부를 채운다.
  • line_type
    • 라인의 그리기 방식을 설정한다.
      • 8 - 8방향으로 연결된 라인으로 그린다.
      • 4 - 4방향으로 연결된 라인으로 그린다.
      • CV_AA - 안티앨리어싱을 적용한다.
  • offset
    • 지정된 값만큼 모든 좌표를 이동한다.

예제

#include "cv.h"

#include "highgui.h"

 

int main( int argc, char** argv )

{

    IplImage* src;

    // the first command line parameter must be file name of binary (black-n-white) image

    if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0)

    {

        IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );

        CvMemStorage* storage = cvCreateMemStorage(0);

        CvSeq* contour = 0;

 

        cvThreshold( src, src, 1, 255, CV_THRESH_BINARY );

        cvNamedWindow( "Source", 1 );

        cvShowImage( "Source", src );

 

        cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

        cvZero( dst );

 

        for( ; contour != 0; contour = contour->h_next )

        {

            CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );

            /* replace CV_FILLED with 1 to see the outlines */

            cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 );

        }

 

        cvNamedWindow( "Components", 1 );

        cvShowImage( "Components", dst );

        cvWaitKey(0);

    }

}

 

댓글

이 블로그의 인기 게시물

각도 단위 변환

(1) 각도의 기본 단위 각도를 나타내는 단위입니다. 360분법 으로 표시하는 1도는 사방을 360으로 나눈 크기입니다. 1분은 1도를 60등분한 각이고 1초는 1분을 다시 60등분한 크기입니다. 분(arcminute)과 초(arcsecond)는 시간을 나타내는 단위인 분(minute), 초(second)와 기호가 같은데, 천문학(영어)에서는 둘을 구분하기 위해 각도는 나타내는 단위에는 ' arc- '를 붙여 표기합니다. 각도를 나타내는 다른 방법으로 호도법 이 있습니다. 호도법은 반지름에 대한 호의 길이 단위로 각도를 표시하는 방법으로 사방은 원주율(π)의 2배 크기가 됩니다(360° = 2π rad). 호도법으로 나타낸 각도는 라디안(radian)으로 표시하며, 360분법으로 나타낸 각도를 호도법으로 나타낸 각도로 바꾸어 주려면 360분법으로 나타낸 각도에 π/180을 곱해주면 됩니다. 컴퓨터 프로그램 언어에서 삼각함수를 계산할 때에는 주로 호도법은 쓰고 있습니다. 1도(˚ , degree) : 1˚ = 60′ = 3600″ = π/180 rad 1분(′, arcminute) : 1′ = 60″ = 1/60° 1초(″, arcsecond) : 1″ = 1/60′ = 1/3600° 1라디안(rad, radian) : 1 rad = 180/π° (π = 원주율 = 3.1415926535897932384626433832795) (2) 시간의 기본 단위 시간의 기본단위는 초(second)입니다. 1초는 국제 표준으로 정밀하게 정의되어 있는데, 세슘 원자(세슘-133)가 9,192,631,770번 진동하는 동안의 시간으로 정의되어 있습니다. 본래 1초는 1 평균 태양일의 1/86400로 정의되어 있었지만 지구의 자전 주기는 다소 불규칙하고 느리게 바뀌고 있으므로 균일한 시간을 정의하기에는 부족합니다. 이후 1초는 지구의 공전 주기를 바탕으로 다시 정의 되었다가 지금은 세슘 원자의 특성을 기반으로 새롭게 정의하여 ...

CTE(Coefficient of Thermal Expansion: 열팽창 계수)

열변형량 계산표.xlsx         측정기기에 대해서 1. 사용 환경은 20℃으로 설정하지 않으면 안되나요?   그런 일은 없겠지만, 물건은 온도가 높아지면 팽창하고, 낮아지면 줄어듭니다. 거기서 공업적 길이를 나타내는 경우에 표준 온도 20℃으로 결정해 그 온도에 있어서의 결과를 나타내게 되어 있습니다. 그것은 ISO 1에 의해, 「길이 측정의 표준 온도는 20℃으로 한다」라고 규정되고 있습니다. 단, 이 규격에는 20℃에 대한 허용치는 나타나지 않습니다만, 별도인 규격으로 예를 들면 JIS Z 8703에서는 광공업에 있어서의 시험(측정이나 측정기의 교정도 포함된다)을 실시하는 장소의 온도에 관한 표준 상태의 허용차이가 규정되고 있습니다.   표준 온도의 허용차이 급별 허용차이 ℃ 온도 0. 5급 ± 0.5 온도 1급 ± 1 온도 2급 ± 2 온도 5급 ± 5 온도 15급 ± 15   즉, 항상 20℃에 정확히 맞추는 것은 매우 곤란해서, 어느 허용차이의 온도 환경이 필요하게 될까는 어느 정도의 정확한 측정이나 시험을 실시하느냐에 달려있다고 봅니다. 고정밀도의 측정을 실시하려면 , 허용차이의 작은 온도 환경이 요구됩니다.   2. 선열팽창 계수를 가르쳐 주세요?   물건은 온도가 높아지면 팽창하고 낮아지면 줄어듭니다. 온도 변화에 의한 물체의 길이의 증감을 수치화한 것이 선열팽창 계수입니다. 아래와 같이에 당사제품의 선열팽창 계수를 몇개인가 올려 보고 싶다고 생각합니다. 제품명 정밀도에 영향을 주는 주요 부분의 재질 선열팽창 계수 게이지 블록(스틸) 강 10.8 X 10 -6 K -1 게이지 블록(세라믹) ...

종이를 몇번 접을 수 있을까?

1. 종이를 9번 이상 접을 수 없는 이유 두 가지 원인이 있습니다. 첫 번째는 종이의 두께가 늘어나기 때문입니다. 두 번째는 종이의 넓이가 줄어들기 때문입니다. 먼저 두께의 변화를 살펴 보면, 1번 접으면 두께가 두배씩 늘어나죠. 두께를 0.1mm 라고 할 때, 0번 접으면 : 0.1 1번 접으면 : 0.2 2번 접으면 : 0.4 3번 접으면 : 0.8 4번 접으면 : 1.6 5번 접으면 : 3.2 6번 접으면 : 6.4 7번 접으면 : 12.8 8번 접으면 : 25.6 9번 접으면 : 51.2 즉 9번을 접으면 원래 두께의 512배가 되는 것입니다.. 다음으로 넓이를 살펴 봅시다. 1번을 접으면 넓이는 반으로 줄어들게 됩니다. 초기 넓이를 512제곱센티미터라고 하면. 0번 접으면 : 512 1번 접으면 : 256 2번 접으면 : 128 3번 접으면 : 64 4번 접으면 : 32 5번 접으면 : 16 6번 접으면 : 8 7번 접으면 : 4 8번 접으면 : 2 9번 접으면 : 1 즉 9번을 접으면.. 초기 넓이의 1/512 로 줄게 되는 것입니다. 이론적으로 넓이는 위처럼 줄어 들겠지만, 실제로 종이접기에는 종이 높이 만큼의 길이가 추가 되어 줄어드는 넓이는 더 많게 됩니다.   출처 : http://kin.naver.com/open100/detail.nhn?d1id=11&dirId=1113&docId=149404       2. 종이를 26번 접을수 있다면 그 높이는 에베레스트산 아시는 분도 있으시겠지만  만약에 종이를 26번 접을수 있다면 그 높이는 에베레스트산 정도의 높이가 됩니다 뻥이라 생각 하시겠죠??그렇지만 사실입니다. 우리가 주위에서 하찮게 생각했던것들 자세히 알고보면 어마어마 하고 크죠 제가 확인 시켜드리기 위해서 계산을 해보죠 종이를 한번 접으면 2장 돼는거 아시죠?/ 두번 접으면 4장 세번 접으면 8장 네번 접으면 ...