OpenCV 윤곽 외 접 다각형 실현

4634 단어 OpenCV윤곽다각형
본 논문 의 사례 는 OpenCV 가 윤곽 외 접 다각형 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
윤곽 최대 외 접 직사각형

Rect boundingRect( InputArray array );
array:입력 한 그 레이스 케 일 이미지 나 2D 점 집합,데이터 형식 은 vector 또는 Mat 입 니 다.
이 함 수 는 입력 이미지 의 물체 윤곽 이나 2D 점 집합 을 포함 하 는 최대 외 접 사각형 을 구 할 수 있 습 니 다.함 수 는 하나의 매개 변수 만 있 고 그 레이스 케 일 이미지 나 2D 점 집합 일 수 있 습 니 다.그 레이스 케 일 이미지 의 매개 변수 유형 은 Mat 이 고 2D 점 집합 의 매개 변수 유형 은 vector 또는 Mat 입 니 다.이 함수 의 반환 값 은 Rect 형식의 변수 입 니 다.이 변 수 는 rectangle()함수 로 직사각형 을 직접 그 릴 수 있 습 니 다.반환 값 은 모두 네 개의 매개 변수 가 있 는데 앞의 두 매개 변 수 는 최대 외 접 사각형 왼쪽 상단 의 첫 번 째 픽 셀 의 좌표 이 고 뒤의 두 매개 변 수 는 각각 최대 외 접 사각형 의 너비 와 높이 를 나타 낸다. 
윤곽 최소 외 접 직사각형

RotatedRect minAreaRect( InputArray points );
points:입력 한 2D 점 집합
이 함 수 는 입력 한 2D 점 집합 에 따라 가장 작은 외 접 사각형 을 계산 할 수 있 습 니 다.함수 의 반환 값 은 RotatedRect 형식의 변수 로 사각형 의 중심 위치,사각형 의 너비 와 높이,사각형 회전 각 도 를 포함 합 니 다.RotatedRect 류 는 두 가지 중요 한 방법 과 속성 을 가지 고 사각형 의 네 개의 정점 과 중심 좌 표를 출력 할 수 있 습 니 다.네 개의 정점 좌 표를 출력 하 는 방법 은 points()입 니 다.RotatedRect 류 의 변 수 를 rrect 라 고 가정 하면 rrect.points(points)명령 을 통 해 읽 을 수 있 습 니 다.그 중에서 좌표 에 저 장 된 변 수 는 Point2f 형식의 배열 입 니 다.출력 사각형 중심 좌표 의 속성 은 center 입 니 다.RotatedRect 류 의 변 수 를 rrect 라 고 가정 하면 opt=rrect.center 명령 을 통 해 읽 을 수 있 습 니 다.그 중에서 좌표 에 저 장 된 변 수 는 Point2f 형식의 변수 입 니 다.
외 접 다각형 

void approxPolyDP( InputArray curve,
                                OutputArray approxCurve,
                                double epsilon, bool closed );
  • curve:윤곽 픽 셀 점 을 입력 하 십시오.
  • approx Curve:다각형 접근 결과 다각형 정점 좌표 의 형식 으로 제시 합 니 다
  • 4.567917.epsilon:가 까 운 정밀도,즉 원시 곡선 과 가 까 운 곡선 간 의 최대 거리4.567917.closed:근접 곡선 이 폐쇄 곡선 의 표지 인지,true 는 곡선 폐쇄,즉 마지막 정점 이 첫 번 째 정점 과 연결 되 어 있 음 을 나타 낸다이 함 수 는 입력 의 윤곽 에 따라 가장 가 까 운 다각형 을 얻 을 수 있다.
    함수 의 첫 번 째 매개 변 수 는 입력 한 윤곽 2D 픽 셀 점 이 고 데이터 형식 은 vector 나 Mat 입 니 다.
    두 번 째 매개 변 수 는 다각형 의 접근 결과 로 다각형 정점 좌표 로 출력 되 며 CV 입 니 다.32SC 2 타 입의 N×1 의 Mat 류 행렬 은 출력 결과 의 정점 수 를 통 해 윤곽 의 기하학 적 모양 을 초보 적 으로 판단 할 수 있다.
    세 번 째 매개 변 수 는 다각형 이 접근 할 때의 정밀도,즉 원시 곡선 과 근접 곡선 간 의 최대 거리 이다.
    네 번 째 매개 변 수 는 근접 곡선 이 폐쇄 곡선 인지 의 표지 이다.true 는 곡선 폐쇄,즉 마지막 정점 이 첫 번 째 정점 과 연결 되 어 있 음 을 나타 낸다.
    단순 예시
    
    //
    // Created by smallflyfly on 2021/6/22.
    //
     
    #include "opencv2/opencv.hpp"
    #include <iostream>
     
    using namespace std;
    using namespace cv;
     
    int main() {
        Mat im = imread("rice.jfif");
    //    resize(im, im, Size(0, 0), 0.5, 0.5);
        Mat gray;
        cvtColor(im, gray, CV_BGR2GRAY);
     
        Mat imBin;
        threshold(gray, imBin, 150, 255, THRESH_BINARY);
     
        vector<vector<Point>> contours;
        findContours(imBin, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
     
        Mat im1 = im.clone();
        Mat im2 = im.clone();
        for (auto & contour : contours) {
            //       
            Rect rect = boundingRect(contour);
            rectangle(im, rect, Scalar(0, 0, 255), 1);
     
            //       
            RotatedRect rotatedRect = minAreaRect(contour);
            Point2f pts[4];
            rotatedRect.points(pts);
            Point2f pt = rotatedRect.center;
            for (int i = 0; i < 4; ++i) {
                if (i == 3) {
                    line(im1, pts[i], pts[0], Scalar(255, 255, 0), 1);
                } else {
                    line(im1, pts[i], pts[i+1], Scalar(255, 255, 0), 1);
                }
            }
            circle(im1, pt, 1, Scalar(0, 0, 255), -1);
     
            //      
            Mat ploys;
            approxPolyDP(contour, ploys, 5, true);
            // draw ploy
            Vec2i pt1, pt2;
            for (int i = 0; i < ploys.rows; ++i) {
                if (i == ploys.rows - 1) {
                    pt1 = ploys.at<Vec2i>(i);
                    pt2 = ploys.at<Vec2i>(0);
     
                } else {
                    pt1 = ploys.at<Vec2i>(i);
                    pt2 = ploys.at<Vec2i>(i+1);
                }
                line(im2, pt1, pt2, Scalar(0, 0, 255), 2);
            }
        }
     
        imshow("im", im);
        imshow("im1", im1);
        imshow("im2", im2);
     
        waitKey(0);
        destroyAllWindows();
     
        return 0;
     
    }

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기