OpenCVにcv::projectPointsという関数があるのですが、入出力の配列がいろいろshapeを取り全く分からないので調査した個人的なメモ。OpenCVのいろいろな関数がこんな感じな気がします。
入力
objectPoints – 3次元物体上の点群座標の入力配列.これは,3xN または Nx3 のシングルチャンネル配列,あるいは 1xN または Nx1 の3チャンネル配列 (あるいは vector ) です.ここで N はビューの点の個数です.
出力
imagePoints – 出力される,画像上の点の 2xN または Nx2 の1チャンネル配列,あるいは 1xN または Nx1 の2チャンネル配列. (あるいは vector . )
以下opencv-pythonについて調べましたので、他のライブラリでは仕様が異なるかもしれません。
objectPoints(入力)のshape | imagePoints(出力)のshape |
---|---|
(3, N, 1) | (N, 1, 2) |
(N, 3, 1) | (N, 1, 2) |
(N, 1, 3) | (N, 1, 2) |
(1, N, 3) | (N, 1, 2) |
結果、いずれの場合も(N, 1, 2)で出てくるようです。
そうなると、(2, N, 1), (N, 2, 1), (1, N, 2)というパターンはどういうときに出てくるのか気になりますがコードを読みに行く気力がないです。(opencv-pythonの場合にはreshapeして(N,1,2)に揃えているという事なのかもしれません)
また、(3,3,1)はどるなるのかというと、(N,3,1)のパターンとして処理されるようです。そうすると、N=3の時に意味が変わってしまう(3,N,1)という入力を何故用意したのか謎です。
(1,1,3)が(N,1,3)なのか(1,N,3)なのかも気になる所ですが、こっちは結局的には同じ配列になるのでおいておきます。
個人的なメモとしては、常に
入力: (N,1,3)
出力: (N,1,2)
でやるのが良さそうです。しかし、情報を持っていない2次元目は一体何のためにあるのでしょう。
どういう経緯でこのようなインターフェースが出来上がったのか興味がわきます。(個人的な感想を言うと正直ものすごく使いにくい)