近くのスーパーに秋は国内産の鮭が売っててよく買ってたんですが最近は輸入のサーモンばっかしです少し寂しいです.
OpenCVでちょっと気になって,画素単位のアクセスをするときcv::Matのat
星の数ほどされてる議論のようなするけどぱっと見た範囲で見当たらなかったのでやってみた.
参考までに画像ピクセル値へのアクセスと計算速度 | 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/回
こんにちは.
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) は
>完全に等価で同じ速度で動作しますが,
>後者の方が確実に短く書けることに注意してください:
コメントありがとうございます. inline const _Tp& Mat_<_tp>::operator ()(int i0, int i1) const inline _Tp& Mat::at(int i0, int i1) const
さらに2.4.3のソースを見てみると,
modules/core/include/opencv2/core/mat.hpp
での
994:template
と
541:template
とで中の記述は全く一緒になっていました.
ご指摘の通りT& Mat_::operator()の方が短く書けるし比較的型安全のようなのでいろんな内部表現に対応する必要がなければMat_ を使うべきですね…