「詳解 OpenCV」の練習問題で、下記のようなお題がありました。
・テンキーの数字キーを押したら、該当の透視変換行列のセルに関連する
値を増減させるものを作ってみる。
・ズームインとズームアウトの機能をつける。
・回転する機能を追加できれば追加する。
とりあえず作ったものの結果が下記の通りとなります。
元の画像、アフィン変換(外形が平行四辺形になる)のもの、
透視変換(外形が台形になるもの)、適当に変換したもの です。
とりあえず今回作ったもの(やっつけですが)は下記の通りとなります。
rを押すとリセット、cを押すと行列に加える数値のプラスとマイナスを変更できます。
qで終了です。
ズームとパンは、数字の3を押せば表現できます。
回転はとばしました。
////////////////////////////////////// // // OpenCVで遊ぼう! // http://playwithopencv.blogspot.com/ // 透視変換をします。 #include "cv.h" #include "highgui.h" #include "iostream" CvMat* warp_matrix =cvCreateMat(3,3,CV_32FC1); double inc; void ResetMatrix() { cvZero(warp_matrix); cvSetReal2D(warp_matrix,0,0,1); cvSetReal2D(warp_matrix,1,1,1); cvSetReal2D(warp_matrix,2,2,1); } void changeMatrix( int row, int col,double ratio) { double n; n = cvGetReal2D(warp_matrix,row,col)+inc*ratio; cvSetReal2D(warp_matrix,row,col,n); } int main(int argc, char **argv) { IplImage *src,*dst; char filename[80]; std::cout<< "Input image filename." <<std::endl; std::cin >> filename; FILE *fp; if ( (fp = fopen(filename,"r")) != NULL ){ fclose( fp ); // ファイルが存在する } else { std::cout<< "Invaild filepath" <<std::endl; return -1;// ファイルは存在しない } src=cvLoadImage(filename,1); dst = cvCloneImage(src); dst->origin = src->origin; cvZero(dst); char c; cvNamedWindow("WarpPerspective",1); inc=0.01; ResetMatrix(); while(true) { cvWarpPerspective(src,dst,warp_matrix); // cvSave("c:\\warp.txt",warp_matrix); cvShowImage("WarpPerspective",dst); c= cvWaitKey(); //配置 // 7 8 9 // 4 5 6 // 1 2 3 // cを押すと、プラスとマイナスを変更できる。 // zを押すと、ズーム // pを押すと、パン // rを押すと、{1,0,0,0,1,0,0,0,1}にリセットする // 9と6は押しても画像に変化はありません。 if(c=='7') { changeMatrix(0,0,1);} if(c=='8') { changeMatrix(0,1,1);} if(c=='9') { changeMatrix(0,2,1);} if(c=='4') { changeMatrix(1,0,1);} if(c=='5') { changeMatrix(1,1,1);} if(c=='6') { changeMatrix(1,2,1);} if(c=='1') { changeMatrix(2,0,0.005);} if(c=='2') { changeMatrix(2,1,0.005);} if(c=='3') { changeMatrix(2,2,1);} if(c=='c') { inc=inc *-1;} if(c=='q') break; if(c=='r') { ResetMatrix(); }; } cvReleaseImage(&dst); cvReleaseMat(&warp_matrix); cvReleaseImage(&src); cvDestroyWindow("WarpPerspective"); return 0; }
0 件のコメント:
コメントを投稿