九州工業大学 CIR-KIT 活動日記
九州工業大学 自律移動ロボット制作チーム「CIR-KIT(サーキット)」の活動ブログ(備忘録)
2013年8月6日火曜日
OpenCVでWebカメラの映像を90度変換
こんにちは。期末試験も終わりやっとロボット開発に集中できます。さて、ちょっとWebカメラの映像を90度回転する必要が出てきたのでやってみました。他にこんなことが必要になることはないでしょうけれど備忘録を兼ねてちょっと紹介します。参考にさせて頂いたのは[OpenCV サンプルコード][1] の[サンプリング,補間,幾何変換][2]のページです。 ##やり方## やり方といっても90度回転させる方法は先程のリンク先の回転移動のためのピクセルサンプリングの方法を用いるというだけですね…あとは回転させた後の映像を表示させるウィンドウを映像と同じ大きさにするということをやります。といっても元の映像の高さを幅に、幅を高さにした領域を作ってやるだけです。 動作確認した環境は - Windows7 64bit - OpenCV 2.4.3 - gcc 4.6.2 - Webカメラ「Logicool C270」 ですが、includeなどは個々の環境に合わせて適宜書きなおす必要があると思います。 ###スクリーンショット### 左が変換前で右が変換後です。 <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio_Wa_M_SrwdMUCX2g3C5b_wlrVfufF-14n_54NXGadxxkLfAwPGvZaHgd2sqfakZzyhNP4azR99nyhdYJhTK08UcsDiOFjT24aSjbgKL-nlKIOWMSYTbos0zPaNuoYIuH-N-CWQYtb7Y/s1600/Screenshot.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio_Wa_M_SrwdMUCX2g3C5b_wlrVfufF-14n_54NXGadxxkLfAwPGvZaHgd2sqfakZzyhNP4azR99nyhdYJhTK08UcsDiOFjT24aSjbgKL-nlKIOWMSYTbos0zPaNuoYIuH-N-CWQYtb7Y/s400/Screenshot.jpg" /></a></div> ###ソースコード ### <pre class="brush: c; first-line: 1; highlight: [,];" title="trans90.c"> #include <stdio.h> #include <opencv¥cv.h> #include <opencv2¥core¥core_c.h> #include <opencv2¥highgui¥highgui_c.h> int main (int argc, char **argv) { int angle = 90; float m[6]; IplImage *frame = 0, *dst = 0; CvMat M; int key = 0; CvCapture* src; cvNamedWindow("CAMERA_SOURCE",CV_WINDOW_AUTOSIZE); cvNamedWindow("CAMERA_TRANS",CV_WINDOW_AUTOSIZE); src = cvCaptureFromCAM(0); if(src == NULL){ printf("映像が取得出来ません\n"); cvWaitKey(0); return -1; } //出力する映像のサイズを求めるために1フレームだけ先に求めておく frame = cvQueryFrame(src); //出力する映像の領域を確保 dst = cvCreateImage(cvSize(frame->height,frame->width),IPL_DEPTH_8U,3); while(1){ frame = cvQueryFrame(src); // 回転のための行列(アフィン行列)要素を設定し,CvMat行列Mを初期化する m[0] = (float) (cos (angle * CV_PI / 180)); m[1] = (float) (-sin (angle * CV_PI / 180)); m[2] = frame->width * 0.5; m[3] = -m[1]; m[4] = m[0]; m[5] = frame->height * 0.5; cvInitMatHeader (&M, 2, 3, CV_32FC1, m, CV_AUTOSTEP); // 指定された回転行列により,GetQuadrangleSubPixを用いて画像全体を回転させる cvGetQuadrangleSubPix (frame, dst, &M); // 結果を表示する cvShowImage ("CAMERA_SOURCE", frame); cvShowImage ("CAMERA_TRANS", dst); key=cvWaitKey (33); if(key == 27){ break; } } cvDestroyWindow ("CAMERA_SOURCE"); cvDestroyWindow ("CAMERA_TRANS"); cvReleaseImage (&frame); cvReleaseImage (&dst); return 0; } </pre> ソースコードの最後に謎の一行が…Syntax Highlighterとやらを初めて使ってみましたがちょっとまだ上手く行かないですね。あと選択もできないかも… とりあえず今日はここまでということで(^^;) [1]: http://opencv.jp/sample/ [2]: http://opencv.jp/sample/sampling_and_geometricaltransforms.html
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿