LoginSignup
12
2

More than 1 year has passed since last update.

「Interview with Vadim Pisarevsky on class cv::Mat in OpenCV」を読み解く

Last updated at Posted at 2022-12-21

この記事はOpenCV Advent Calendar 2022の22日目の記事です。

1. はじめに

https://www.youtube.com/watch?v=DEWr-iOEuvEにてOpenCV Development Team LeaderであるVadim Pisarevskyさんのインタビュー動画が公開されており、そこでcv::Matの設計経緯が語られています。古くからOpenCVを使っている人、最近OpenCVを使い始めた人どちらにも興味深い内容だと思われるのでこの動画の内容を紹介していきます。

2. IplImage時代

3. IplImageからcv::Matへ

  • 2008年にWillow Garageが資金提供を開始し、リソースも増えたので、以前から要望があったC++ APIを追加するためにOpenCVを再設計することにした
  • C++ API設計の参考になるものを探していたところ、MATLABが非常に良い例であることわかった
    • MATLABのmatrixやarrayのデータ構造はツールボックス間で共通であり、互換性に優れている
    • 画像、行列を同じデータ構造で扱え、変換処理が不要
  • そのため、MATLAB APIを参考にしてC++でcv::Matを実装し、IplImageから置き換えることにした

4. Q&A

4.1 cv::Matでスマートポインタを使わなかったのはなぜ?

  • スマートポインタが使えるようになるのはC++11からだが、cv::Matを作ったのが2009年。C++11が標準化されるまでcv::Matの開発を待つことができなかった
  • メモリ管理については参照カウントを使った実装を独自に入れているが、開発初期からアトミック操作となるようなメカニズムで実装したため、cv::Matは複雑なアーキテクチャになっている

4.2 cv::Matをテンプレートクラスにしなかったのはなぜ?

  • テンプレートクラスにするとコンパイルに時間が掛かるため
  • Pythonにテンプレートがないため。当時からPythonに注目していたが、cv::MatをテンプレートクラスにしてしまうとPythonラッパーが実現しにくくなるため採用されなかった。

4.3 なぜcv::Mat_<T>を作った?

  • 要素にアクセスする便利な操作を提供するため
  • この機能を使うとOpenCV内部のコード量が減らせる、くらいの意味合いが強い

4.4 cv::Matは異なるデバイスのメモリをサポートできるようになる?

  • GPUなどのアクセラレータでコンピュータビジョンの処理を高速化するのがトレンドであることを理解している
  • 10年ほど前にこれから標準になるであろうOpenCLをサポートしようという話になり、UMatを実装した
  • ・・・が、OpenCLは今や半ば放棄された規格になってしまっており、多くのメーカーは他のフレームワーク(Vulkanなど)を使おうとしているように見える
  • 現状、皆がそれぞれ異なるフレームワークを使っていて今後どのAPIに依存するかわからないため、cv::Matを異なるデバイスで汎用的に使えるユニバーサルなクラスにするのは難しい状況であると考えている

4.5 cv::Matのアップデート計画

今のところ、cv::Matから新しいものに完全に置き換えるような計画はないが、以下のようなアップデートを予定している。

5. おわりに

この記事では「Interview with Vadim Pisarevsky on class cv::Mat in OpenCV」の動画の内容を紹介しました。間違っている箇所があればコメント等でフィードバックください。

12
2
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
12
2