IplImage cv::Mat の速度比較

脱cv::Mat童貞

OpenCV2.Xになって使えるようになったC++用インターフェースのcv::Matさんですが、OpenCVでは有名な画像構造体IplImageがあれば十分だと思ってたので手を出さずに生活してました。

しかし友人にMatをやたら進められたので初めて使ってみた。
とりあえず画像処理のセオリーである。

  • 画像読み込み
  • 画素値アクセス
  • 描写

をやってみることに。

↓以下がそのプログラム↓
[[

cv::Mat_<cv::Vec3b> img;
img=cv::imread("image.jpg", 1);
for(int i=0;i<img.rows;i++){
	for(int j=0;j<img.cols;j++){
	img(i,j)[0]=0;//B
	img(i,j)[1]=0;//G
	img(i,j)[2]=0;//R
	}
}
cv::namedWindow("Binary", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::imshow("Binary", img);

]]

これは画像の各要素を0にして黒にするだけのもの。ほんと最低限度という感じだ。
同じプログラムをIplImageでも組んでみた。

[[

  IplImage* iimg = 0;
    int height,width,step,channels;
    uchar *data;
    int i,j;
 
    iimg=cvLoadImage("image.jpg");

    height    = iimg->height;
    width     = iimg->width;
    step      = iimg->widthStep;
    channels  = iimg->nChannels;
    data      = (uchar *)iimg->imageData;
 
       for(i=0;i<height;i++) {
              for(j=0;j<width;j++){
                 iimg->imageData[iimg->widthStep * i + j * 3 + 0]=0;  // B
				 iimg->imageData[iimg->widthStep * i + j * 3 + 1]=0;  // G
				 iimg->imageData[iimg->widthStep * i + j * 3 + 2]=0;  // R
              }
	   }
    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
    cvShowImage("mainWin", iimg );
	cvReleaseImage(&iimg);

]]

速度を比較したところ
cv::Mat 0.20[sec]
IplImage 0.02[sec]

おやおや・・・

おやおやおやおや・・・



まぁいまいちポインタが早いだのなんだの理解できてないからね、検証方法もあいまいだし。
あだこの速度の差はけっこうなもんだと思う。単純処理であるほどIplImageのほうがいいのかな?cv::Matは参照カウンタ等の利用があるし他にも機能がいろいろとあるのがいいけどね。
たとえばHSV空間への色空間変化など高速でできるそうです。
ということで次回はそこらへん検証します!!