Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++,OpenCVでgetAffineTransform()を使った時のエラーについて

Last updated at Posted at 2021-05-03

#はじめに
当記事は備忘録代わりのようなものであるため参考になるかは分からない.ただ,プログラム初心者が陥るようなエラー内容である可能性が高いため,初学者にとってはヒントになるかもしれない.

#目次
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の要素が3つなのは三角形の頂点座標をそれぞれアフィン変換によって変形を施すためである.(詳しい内容については「アフィン変換」で検索してほしい)

続いて,OpenCV 3.0以降(3.0~4.5.2で確認)において追加された?記述を記す.

// OpenCV 3.0~の記述
Mat cv::getAffineTransform(InputArray src, InputArray dst);

InputArrayとあるのだから型は何でもよいのだろう,と思っていた.実際にVisual Studio 2017, 2019で記述したときのスクリーンショットを示しておく.
getaffine.png

図より,「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
https://docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga47069038267385913c61334e3d6af2e0
最終閲覧日:2021年5月3日

・OpenCV 2.2 documentation >> 画像の幾何学変換
http://opencv.jp/opencv-2svn/cpp/geometric_image_transformations.html
最終閲覧日:2021年5月3日

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?