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 );
함수 의 첫 번 째 매개 변 수 는 입력 한 윤곽 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;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 OpenCV 템플릿 프로젝트 만들기・Windows 7 Professional 64bit ・Visual Studio 2017 Version 15.9.14 · OpenCV 3.4.1 OpenCV의 도입 방법 등은 아래를 참조하십시오. Visual Stu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.