C++, OpenCV에서 getAffineTransform ()을 사용할 때의 오류에 대해

3343 단어 C++OpenCV

소개



이 기사는 비망록 대신과 같은 것이므로 참고가 될지는 모른다. 단, 프로그램 초보자가 빠지는 에러 내용일 가능성이 높기 때문에 초학자에게는 힌트가 될지도 모른다.

목차



1. 환경에 대해
2.cv::getAffineTransform() 정보
3. 이번에 일어난 에러 내용에 대해서
4. 결론

1. 환경에 대해



· Visual Studio 2017, 2019
· OpenCV 3.4.13
・사용 언어 : C++

2.cv::getAffineTransform() 정보



첫째, 제목에있는 "getAffineTransform ()"이라는 OpenCV의 함수는 어쨌든 아핀 변환을 수행하는 함수입니다.
이 함수에 전달되는 인수에 대해 설명합니다. 소개 OpenCV 2.2의 설명에서 설명한다.
// OpenCV 2.2の記述
Mat getAffineTransform(const Point2f src[], const Point2f dst[]);

/* 実際に使うとこうなる */
vector<Point2f> src;
vector<Point2f> dst;

for (int i = 0; i < 3; i++)
{
    // src, dstに値を格納するコードを記述
}
Mat TransMatrix = getAffineTransform(src, dst);


Point2f 형 배열 (src)을 Point2f 형 배열 (dst)로 변환하는 변환 행렬을 TransMatrix에 저장합니다. 세 개의 src 및 dst 요소는 삼각형의 정점 좌표가 각각 아핀 변환에 의해 변형되기 때문입니다. (자세한 내용에 대해서는 「아핀 변환」으로 검색해 주었으면 한다)

이어 OpenCV 3.0 이후(3.0~4.5.2에서 확인)에서 추가되었다? 설명을 적는다.
// OpenCV 3.0~の記述
Mat cv::getAffineTransform(InputArray src, InputArray dst);

InputArray가 있기 때문에 타입은 무엇이든 좋을 것이라고 생각하고 있었다. 실제로 Visual Studio 2017, 2019에서 작성한 경우의 스크린 샷을 보여줍니다.


그림에서 "cv::Mat cv::getAffineTransform (cv::InputArray src, cv::InputArray dst)"로 표기되어 있음을 알 수 있습니다. 이렇게 설명했기 때문에 이것을 아무 생각도하지 않고 int 형 배열을 인수로 전달했습니다. (그림에서 말하면, 청자의 t1Rect, t3Rect라는 배열)

3. 이번에 일어난 에러 내용에 대해서



오랫동안 써왔지만 마침내 본제이다. 다음에 이번 에러 내용을 나타낸다.

OpenCV(3.4.13) Error: Assertion failed (src.checkVector(2, CV_32F) == 3 && dst.checkVector(2, CV_32F) == 3) in cv::getAffineTransform, file C:\build\3_4_winpack-build -win64-vc15\opencv\modules\imgproc\src\imgwarp.cpp, line 3407

오류 내용은
src, dst에 격납되어 있는 값은 요소를 2개 가지고 있고 또한 CV_32F(즉 float형)일 필요가 있어, 그것들을 3개 준비해 주세요,
이다.

과연. (소라 그렇겠지!!)!!

Visual Studio에서 (InputArray src, InputArray dst) 쪽의 함수가 표기되어 있었기 때문에 거기에 따르는데, 낡은 쪽의 함수로 움직여 버렸기 때문에 이런 일이 되어 있는 것이다. 제대로(const Point2f src[], const Point2f dst[])라고 써 주면, 「아무튼 모르지만 float형으로 하지 않으면 안 되는군요」, 라고 이해하고 대응할 수 있었던 것이다.

또한,이 오류의 질이 나쁜 점은 컴파일이 통과한다는 것입니다.

원래 이야기이지만, OpenCV의 버전이 3.4.13에서 제대로 (InputArray src, InputArray dst) 쪽의 함수가 준비되어 있는데도 왜 낡은 쪽으로 움직이고 있었을까. 이상하지 않다.

4. 결론



분명히 Visual Studio 2017, 2019에서 cv::getAffineTransform ()을 입력하면 OpenCV 2.2의 함수가 채택되는 것 같습니다.
따라서 인수에 건네주는 배열은 반드시 float형으로 하고 배열의 요소는 3개로 하는 것이 필수 불가결하다.

참고문헌



· OpenCV 4.5.2
htps : // / cs. 오펜 cv. 오 rg/마s r/다/d54/g 브로우 p__이 mgp 로 c__t 란 s후 rm. HTML # 47069038267385913c61334E3d6Af2E0
최종보기: 2021년 5월 3일

· OpenCV 2.2 documentation >> 이미지의 기하학 변환
h tp : // 오페인 cv. jp/오페인 cv-2sv 음/cp/게오메 티 c_이마게_t란 s후우 마치온 s. HTML
최종보기: 2021년 5월 3일

좋은 웹페이지 즐겨찾기