画像のサイズを変更する
#contents

*void cvResize( IplImage* src, IplImage* dst, int interpolation); [#l7ed0e00]
**引数 [#j5933664]
-src:IplImage*型の入力画像.CvMat*も可
-dst:IplImage*型の出力画像.CvMat*も可
-interpolation:内挿方法をint型で指定する
--CV_INTER_NN(0):最近傍
--CV_INTER_LINEAR(1):線型内挿
--CV_INTER_CUBIC(2):3次畳み込み内挿
--CV_INTER_AREA(3):モアレを軽減させる内挿方法
--CV_INTER_LANCZOS4(4):LANCZOSフィルタ?
--省略した場合は線型内挿
**返り値 [#j2448e98]
-void型なのでなし
*void resize(Mat& src, Mat& dst, Size size, double sx, double sy, int interpolation); [#ibc3a9f0]
**引数 [#j7f69a20]
-src:Mat&型の画像.
-dst:Mat&型の画像.
-sx:double型の拡大率(x方向).省略すると0.
-sy:double型の拡大率(y方向).省略すると0.
-interpolation:内挿方法をint型で指定する
--INTER_NEAREST(0):最近傍内挿(CV_INTER_NN)
--INTER_LINEAR(1):線型内挿(CV_INTER_LINEAR)
--INTER_CUBIC(2):3次畳み込み内挿(CV_INTER_CUBIC)
--INTER_AREA(3):モアレを軽減させる内挿方法(CV_INTER_AREA)
--INTER_LANCZOS4:LANCZOSフィルタ?(CV_INTER_LANCZOS4)
--INTER_MAX(7):?
--WARP_INVERSE_MAP=CV_WARP_INVERSE_MAP


*解説 [#u69f752d]
-倍率は指定せず,srcとdstのサイズから自動的に拡大/縮小される
-srcとdstはタイプが同じ必要がある(32Fや64Sなど)
-CV_INTER_AREAは
--縮小時のみ有効
--拡大時に指定しても線型補間になる



*CvMat* cvReshape( IplImage* src, CvMat* dst, int new_channels, int new_height ); [#i82828a6]
**引数 [#zd3cf849]
-src:IplImage*型の入力画像.CvMat*も可
-dst:CvMat*型の出力画像.IplImage*は''代用不可''なので注意
-new_channels:新しいチャンネル数
-new_height:新しい高さ
--省略した場合は0が指定され,元と同じ高さが用いられる
*返り値 [#ld79b3ce]
-CvMat型のポインタ
-dstの値と同じ
**解説 [#s8301c7a]
-cvResizeがコピーなのに対し,cvReshapeはコピーを行わずに変形が可能
-ただし,総ピクセル数(バイト数)が変更できない点に注意
-↓3x3の行列を9x1のベクトルに置き換える,と言った変換に用いられる&br();
&mimetex(\left(  \begin{array}{ccc}H_{11}  & H_{12}  & H_{13}  \\   H_{21}  & H_{22}  & H_{23}  \\   H_{31}  & H_{32}  & H_{33}  \\  \end{array}\right)\longrightarrow \left(  \begin{array}{ccc}H_{11} \\H_{12} \\H_{13} \\H_{21} \\H_{22} \\H_{23} \\H_{31} \\H_{32} \\H_{33}\\\end{array}\right)); 
-この場合も,メモリ番地上の配列が変わってないことがミソ
-チャンネル数だけは指定しないといけないが,チャンネル数も高さも同じものを指定した場合は[[行列と画像の変換]]と等価な処理になる
-また,画像のサイズを保持することになるdstは,CvMat型のポインタであるが,実際に値を格納するため,
-ただのポインタ変数ではなく,実変数のポインタである必要がある(言葉づかいがあいまいで申し訳ない)
-詳しくはサンプルコードを
*サンプルコード [#q4641c7c]
-インタレース解除の例
#geshi(c++,number){{
 // インターレース画像
 IplImage *interlaceImage = cvLoadImage(INTERLACED_IMAGE_FILENAME);
 // インターレース解除画像
 IplImage *resizeImage    = cvCreateImage(cvSize(interlaceImage->width/2, interlaceImage->height), interlaceImage->depth, interlaceImage->nChannels);
 // ↓これはポインタでなく,CvMat型の変数を用意しないとだめ
 CvMat deinterlaceImage;
 
 // ↓ここで幅を半分に縮小
 // ↓水平軸方向にだけ作用しているので
 // ↓インターレースについては何も起きてないことに注目
 cvResize(interlaceImage, resizeImage, CV_INTER_LINEAR);
 // ここで同じチャンネル数(=同じカラー数),半分の高さを指定することで
 // ここで左側に偶数ライン,右側に奇数ラインを表示する
 cvReshape(resizeImage, &deinterlaceImage, interlaceImage->nChannels, interlaceImage->height/2); 
}}

*実行結果 [#x07dd969]
http://tessy.org/wiki/index.php?plugin=attach&pcmd=open&refer=%B2%E8%C1%FC%A4%CE%A5%EA%A5%B5%A5%A4%A5%BA&file=1.jpg &br();
-インターレース画像

http://tessy.org/wiki/index.php?plugin=attach&pcmd=open&refer=%B2%E8%C1%FC%A4%CE%A5%EA%A5%B5%A5%A4%A5%BA&file=2.jpg
-サイズを半分にだけ圧縮した画像.(cvResizeの実行結果)

http://tessy.org/wiki/index.php?plugin=attach&pcmd=open&refer=%B2%E8%C1%FC%A4%CE%A5%EA%A5%B5%A5%A4%A5%BA&file=3.jpg
-2.jpgを高さを半分に,幅を倍にした画像(cvReshapeの実行結果)
-左側が偶数フレーム,右側が奇数フレームなので,左右で撮影時刻が違って映ってる画像も違うものである

*実体ファイル [#zff04bcb]
**cvResize [#k8b1dddd]
-OpenCV 1.1 以前
--cv/src/cvimgwarp.cpp
--cv/include/cv.h
-OpenCV 2.0以降
--src/cv/cvimgwarp.cpp
--include/opencv/cv.h
-OpenCV 2.4以降
--modules/imgproc/include/opencv2/imgproc/imgproc.hpp (C++版)
--modules/imgproc/include/opencv2/imgproc/imgproc_c.h (C版)
--modules/imgproc/src/imgwarp.cpp
**cvReshape [#g574ec4e]
-OpenCV 1.1 以前
-OpenCV 1.1以前
--cxcore/src/cxarray.cpp
--cxcore/include/cxcore.h
-OpenCV 2.0以降
--src/cxcore/cxarray.cpp
--include/opencv/cxcore.h

*その他 [#h6b43c79]
-何故か入力も出力もdepthがdouble(CV_64FかIPL_DEPTH_64F)の場合,何故かエラーする
-補間用の関数が無い模様(OpenCV 2.1で再現)

ジャンル[[:OpenCV]][[:OpenCV 1.0]][[:OpenCV 1.1]][[:OpenCV 2.0]][[:OpenCV 2.1]]準拠
ジャンル[[:OpenCV]][[:OpenCV 1.0]][[:OpenCV 1.1]][[:OpenCV 2.0]][[:OpenCV 2.1]][[:OpenCV 2.4]]準拠



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS