cv::Matとcv::Mat_<T>の画素アクセスの速度

近くのスーパーに秋は国内産の鮭が売っててよく買ってたんですが最近は輸入のサーモンばっかしです少し寂しいです.

OpenCVでちょっと気になって,画素単位のアクセスをするときcv::Matのat()による方法とcv::Mat_のoperator()による方法でどっちが速いかなと思って調べてみました.
星の数ほどされてる議論のようなするけどぱっと見た範囲で見当たらなかったのでやってみた.
参考までに画像ピクセル値へのアクセスと計算速度 | OpenCV.jpもあります.

結論から言うと,全く同じでした.

コードはこんなかんじ.時間計測はオレオレライブラリで高精度な計測ができます.

実行結果はこんなかんじ.

% ./a.out
cv::Mat::at<T>() -> 9.82353ms/回
cv::Mat_<unsigned char>::operator() -> 9.69412ms/回

大きさ(w,h)によらず同じくらいの模様.

あと気になる生配列とのアクセス速度の差ですが,上述プログラムと同じ処理を書いちゃうと最適化で全部消えちゃうしそうならないくらい複雑なプログラムは面倒だったので断念.
最適化しなければ,cv::Matの方が3割くらい遅いくらいでした.最適化するとどうなるやら.

  • CPU: i7 870 (2.93GHz)
  • OS: Ubuntu 11.10 x86
  • gcc: 4.7.0
  • option: -std=c++0x
  • OpenCV: 2.4.3

追記:
Ivy Bridge速すぎワロタw

  • CPU: i5 3570 (3.40 GHz)
  • OS: Linux Mint 13
  • gcc: 4.6.3
  • OpenCV: 2.4.3
% ./a.out
cv::Mat::at<T>() -> 2.34902ms/回
cv::Mat_<unsigned char>::operator() -> 2.34902ms/回

2 thoughts on “cv::Matとcv::Mat_<T>の画素アクセスの速度

  1. こんにちは.
    Computer Vision Advent Calendar 2012から飛んできて,この記事も読みました.

    せっかくお調べになったところに水を指すようですが,
    http://opencv.jp/opencv-2svn/cpp/index.html
    このリファレンスのMat_のところに以下の文がありましたね.

    >Mat::at(int y, int x) および
    >Mat_::operator ()(int y, int x) は
    >完全に等価で同じ速度で動作しますが,
    >後者の方が確実に短く書けることに注意してください:

  2. コメントありがとうございます.
    さらに2.4.3のソースを見てみると,
    modules/core/include/opencv2/core/mat.hpp
    での
    994:template inline const _Tp& Mat_<_tp>::operator ()(int i0, int i1) const

    541:template inline _Tp& Mat::at(int i0, int i1) const
    とで中の記述は全く一緒になっていました.

    ご指摘の通りT& Mat_::operator()の方が短く書けるし比較的型安全のようなのでいろんな内部表現に対応する必要がなければMat_を使うべきですね…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です