Subdiv2D 사용시의 영역 외 지정에 대해서

목차



1. 소개
2.환경
3. 오류가 발생한 함수
4. 구현한 코드
5. 오류 내용
6. 직사각형을 만드는 방법
7. 솔루션
8. 결론
9. 참고문헌

1. 소개



이번에는 OpenCV 함수 Subdiv2D를 사용할 때 영역 외부 지정 오류가 발생했음을 기록하고 해결 방법을 설명합니다.

2. 환경



· OpenCV 3.4.14
· Visual Studio 2017, 2019
· C++

3. 오류가 발생한 함수



이 오류가 발생한 함수는 OpenCV에 구현 된 Subdiv2D라는 함수입니다. Droney 삼각형 분할을 수행하기 위해이 함수를 사용했습니다.
함수의 사용법으로서,

1. 사각형(Rectangle) 만들기
2. 직사각형 크기의 Subdiv2D 객체 만들기
3. 영역에 모점이 되는 점의 좌표를 삽입

같은 흐름이다.

4. 구현한 코드



이번에 구현 된 코드를 설명합니다.
void drawDelaunay(cv::Mat img, cv::vector<Point> points)
{
    Size size = img.size();
    Rect rect(0, 0, size.width, size.height); // width, height共に500
    cv::Subdiv2D subdiv;
    subdiv.initDelaunay(rect); // 領域の指定
    Subdiv.insert(points); // 母点の挿入

    // ドロネー三角形のリストを取得する
    std::vector<cv::Vec6f> triangles;
    subdiv.getTriangleList(triangles);

/*----------------------------------------------------------------*/

// 以下描画の記述,今回は省略

}

위는 Droney 삼각형 분할을 수행하고 그리는 함수 drawDelaunay ()입니다. 너비와 높이가 500 인 이미지 img와 모점이되는 배열 포인트를 인수로 전달합니다. 이 시점에는 포인트 (0,0) <= 포인트 (x, y) <= 포인트 (500, 500) 범위의 좌표가 저장됩니다. 그리는 설명은이 오류와 관련이 없으므로 생략했습니다.
모점은 서랍 삼각형 분할을 수행하는 용어이지만 자세한 내용은 다음 사이트에서 참조하십시오.

보로노이 다이어그램이란?
최종보기: 2021년 5월 7일

5. 오류 내용



이번 에러는 이하.

OpenCV(3.4.13) Error: One of the arguments' values ​​is out of range () in cv::Subdiv2D::locate, file C:\build\3_4_winpack-build-win64-vc15\opencv\modules\imgproc\src\subdivision2d.cpp, line 288

이것을 보는 한, out of range라고 하기 때문에 영역외 지정을 하고 있는 것 같다.
왜일까, 제대로 모점이 되는 점의 좌표는 「0<=x<=500, 0<=y<=500」으로 하고 있다고 하는데.
(유식자라면 여기서 "응?"

6. 사각형을 만드는 방법



그런데 C++에서 사각형 (Rectangle)을 만들 때는 Rect rect (x, y, width, height);라고 쓰면 된다.
여기서 각 파라미터는
x : TopLeft의 x 좌표
y : TopLeft의 y 좌표
width : 사각형의 폭
height : 사각형의 높이
이다.

즉, 왼쪽 상단의 정점 좌표를 지정하고 직사각형의 너비와 높이를 제공하면됩니다.

7. 솔루션



본제에 들어간다.
그런데, 2절의 코드에 등장한 rect는, 좌상의 정점 좌표가 (0, 0)로, 폭과 높이 (width, height)는 각각 500, 500이지만, rect의 우하의 정점 좌표는 몇 가지인가?

(500, 500)!

무슨 장난을 말하지 말라.
왼쪽 상단의 정점이 (0, 0)이고 폭과 높이가 500,500이라는 것은 오른쪽 하단의 정점 좌표는 (499, 499)이다.
(폭 = 500 = 오른쪽 끝의 x 좌표 - 왼쪽 끝의 x 좌표 ( = 0 ) + 1 → 오른쪽 끝의 x 좌표 = 499)



즉, 이번에 내가 지정한 영역의 가장자리는 x = y = 499이므로 점에 저장된 x = 500 또는 y = 500의 점을 삽입하면 당연히 영역 밖이됩니다.

그런데, 에러 내용이 지극히 단순하기 때문에 해결법도 간단 명쾌하다.

x = 500, y = 500과 같은 점을 x = 499, y = 499로 변경하면됩니다.
(이미지 사이즈를 변경해도 대응할 수 있도록, width-1, height-1 와 같이 기술하면 좋을 것이다.)

8. 결론



이 에러 내용은 드로네 삼각형 분할에 직접 관련된 에러가 아니고, 매우 단순한 실수였다. 그러나 이러한 단순한 실수로 인한 오류는 너무 간단하여 발각이 지연 될 수 있습니다. 실수로 실수를 없애고 싶은 것이다.

9. 참고문헌



서랍 그림을 그리는 방법을 알고 싶다면 다음을 참조하십시오.

OpenCV C ++ / IF로 보로노이 다이어그램 / 서랍 다이어그램 그리기
최종보기: 2021년 5월 7일

좋은 웹페이지 즐겨찾기