OpenCV 縮小表示 - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) 縮小表示

扱う画像が巨大になるとcvShowImageでは表示しきれなくなる。 おおまかな処理がしたい場合にもできれば小さく変換しておきたい。

cvResize

cvResizeは以下のように定義される。

void cvResize( const CvArr* I, CvArr* J, int interpolation=CV_INTER_LINEAR );
I:Source image.
J:Destination image.
interpolation:Interpolation method:
  CV_INTER_NN - nearest-neigbor interpolation,
  CV_INTER_LINEAR - bilinear interpolation (used by default)

元画像Iは勿論だがJまで作っておかなければならない。 要するに変更するサイズを自分で決定してcvCreateImageしろという事だ。 interepolationは補間方法の選択。

mycvResize

こんな関数を作ってみた。

IplImage* mycvResize(IplImage* src, CvSize size)
{
  int iratex,iratey;
  double rate;
  IplImage *resizeimg;
  if (src->height > size.height || src->width > size.width){
    iratex = (int)(src->width/(size.width/10));
    iratey = (int)(src->height/(size.height/10));
    rate = (iratex>iratey? iratex: iratey)/10.0;
    resizeimg= cvCreateImage(cvSize((int)(src->width/rate),(int)(src->height/rate)), src->depth, src->nChannels);
    cvResize(src,resizeimg,CV_INTER_NN);
    return resizeimg;
  }else{
    return src;
  }
}

srcは元画像で上限サイズsizeはcvSize(幅,高さ)で指定する。 指定したサイズとの比を小数点1ケタまで求めて合わせている。 中でintとdoubleがごっちゃになってるのは紆余曲折しただけなので深い意味は無い。 確保した新たなIplImageを返す。

1024x768の画像srcがあったとして800x600以下にしたい場合、受け取る画像をimgとすると

IplImage *img;
…
img = mycvResize(src,CvSize(800,600));

で良い。

拡大は中の処理を逆にするかサイズチェックを無くせば出来る筈。