OpenCV2.xから実装されたcv::Matクラス
まだ、あまり2.xの参考書がないので画素アクセスの方法がわからなくて当初困りました。
ということでcv::Matの画素アクセスの方法について紹介します。
まず、簡単な方法から
1.「
Mat::at」を使う
と、簡単ですね。
しかし、Mat::atはどうやらオーバーヘッドが大きく、処理が遅いという欠点があります。
おそらくMat::at内でエラー処理などを行っているからでしょうか。
では次に画素に直接アクセスしてみます。
2.「Mat.data」を使う
Mat.dataには画素が格納されています。
ここに直接アクセスしてみましょう。
これである程度の速度は確保できたでしょう。
ちなみにここに出てくる変数名を説明しておきます。
image.rows |
imageの高さ |
image.cols |
imageの幅 |
image.step |
imageの幅×チャンネル数 |
です。
しかし、初めて扱う型の画像だとアクセスする場合どうすればいいのかわからない場合があります。
例)Mat point3D( 480, 640, CV_32FC3);
私はこの時は3次元座標を格納したい時に使いました。
しかし、どうやってアクセスすればいいのかわからなかったのです。
この時とった解決策を紹介します。
3.Mat:atの中身をパクる
Mat:atの中身を見てみましょう。
なんかごちゃごちゃ書いてますが必要そうなのはreturnの後の式だけっぽいですね。
point3Dの値をMat::atで取得しようとした場合
となる
しかし速度が遅い
ということでMat:atの中身をパクってみよう
すると速度が上がりました
ということでMat::atを使わずMatのアクセス速度を高速化することに成功しました!!
他にも調べるとアクセス高速化の方法はいっぱいあるので、自分のプログラムにあったものを探してください。
参考
Miyabiarts.net
0 件のコメント:
コメントを投稿