2010/07/11

透視変換ツール

「詳解 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 件のコメント:

コメントを投稿