내맘대로 공부기록.

[ C++ ]

[ openCV | C++ ] fillPoly 함수 사용 방법.(픽셀 필터링 활용 용도.)

fwanggus 2021. 4. 21. 23:26

 

어떤 함수  🤔 

"그리는" 함수입니다. 다각형 형상을 이미지에 표현합니다. 이때 다각형 내면을 Fill(채우기) 함으로써, 다각형 내부를 특정 픽셀 데이터로 채우게 됩니다.

  fillPoly(
    	타겟이미지, 
    	다각형 포인트 어레이, 
    	다각형 색상, 
    	다각형 라인 타입, 
    	... )

 

매개변수 (설명)

📌  타겟이미지 : 다각형을 표현하기 위한 이미지 소스를 지정합니다. Mat 형태의 이미지 파일을 지정하면 됩니다.

📌  다각형 포인트 어레이 : 포인트 데이터를 그 요소로 갖는 2차원 어레이를 지정합니다. C/C++의 일반적인 어레이 설정방법을 사용해도 되지만, vector 변수를 써보려고 노력하고 있습니다. 다각형 포인트의 순서는 시계방향 또는 반시계 방향을 생각하고 지정해주면 될 것 같습니다. 맨 처음과 맨 끝 포인트가 연결되어 폐곡선을 형성합니다.

📌  다각형 색상 : 폐곡선을 채우는 다각형 색상을 지정합니다. Scalar(Blue, Green, Red) 형태로 색상을 부여할 수 있습니다.

📌  다각형 라인 타입 : 다각형을 형성하는 직선 형태(4점 연결, 8점 연결, Anti-Aliasing 등등)를 결정합니다. 

 

공홈 링크는 다음과 같습니다.

 

OpenCV: Drawing Functions

enum  cv::HersheyFonts {   cv::FONT_HERSHEY_SIMPLEX = 0,   cv::FONT_HERSHEY_PLAIN = 1,   cv::FONT_HERSHEY_DUPLEX = 2,   cv::FONT_HERSHEY_COMPLEX = 3,   cv::FONT_HERSHEY_TRIPLEX = 4,   cv::FONT_HERSHEY_COMPLEX_SMALL = 5,   cv::FONT_HERSHEY_SC

docs.opencv.org

 

DEMO. ( Detail Code 🔗 )

HEIGHT, WIDTH는 각각 이미지의 높이(세로), 폭(가로) 값을 나타내며, 해당 사이즈로 이미지를 생성합니다. 그때 이미지 색깔은 흰색(BGR색상 요소 지정)으로 지정했습니다.

    ...
    
    Mat img1(HEIGHT, WIDTH, CV_8UC3, Scalar(255, 255, 255));
    Mat img2(HEIGHT, WIDTH, CV_8UC3, Scalar(255, 255, 255));
    
    ...

 

다각형(여기서는 사각형)을 구성할 포인트 어레이를 정의합니다. 첫 번째 사각형은 이미지의 왼쪽 가장자리에 직사각형 형태의 픽셀을 채웁니다. 두 번째 사각형은 이미지의 상단에 직사각형 형태로 픽셀을 채우게 했습니다.

    // SQURE : 4
    vector<vector<Point>> squre_point(2, vector<Point>(SQURE));

    // #1 squre
    squre_point[0][0] = Point(0, 0);
    squre_point[0][1] = Point(GAP1, 0);
    squre_point[0][2] = Point(GAP1, HEIGHT);
    squre_point[0][3] = Point(0, HEIGHT);
    // #2 squre
    squre_point[1][0] = Point(0, 0);
    squre_point[1][1] = Point(WIDTH, 0);
    squre_point[1][2] = Point(WIDTH, GAP1);
    squre_point[1][3] = Point(0, GAP1);

 

작성한 포인트 데이터를 이용해서, 아래와 같이 fillPoly 함수를 호출합니다. 다각형 색상은 두 형상 모두 파란색으로 지정했습니다.

    fillPoly(img1, {squre_point[0]}, Scalar(255, 0, 0), LINE_AA);
    fillPoly(img2, {squre_point[1]}, Scalar(255, 0, 0), LINE_AA);

 

아래와 같이, 직사각형 형태의 픽셀이 채워진 것을 확인 할 수 있습니다. fillPoly 함수는 이미지 전처리(가공) 작업할 때 필요한 경우가 있기 때문에 알아두면 좋은 기능일 것 같습니다.

 

좌 : #1 직사각형, 우 : #2 직사각형

반응형