• 締切済み

OpenCVでのプログラミングについての質問です

Visual Studio2013でOpenCVを使えるようにし、現在USBカメラの映像をキャプチャする簡単なプログラムを作っています。 今は、 #include <opencv2/opencv.hpp> #include <opencv2/opencv_lib.hpp> #include <ctype.h> void Mouse( int event, int x, int y, int flags ,void *param); //マウス宣言 int main( int argc, char **argv) { // カメラからのビデオキャプチャを初期化する CvCapture *videoCapture = cvCreateCameraCapture( 1 ); cvSetCaptureProperty(videoCapture,CV_CAP_PROP_FRAME_WIDTH,1920); cvSetCaptureProperty(videoCapture,CV_CAP_PROP_FRAME_HEIGHT,1080); if( videoCapture == NULL ) { return -1; } // ウィンドウを作成する char windowName[] = "キャプチャ"; cvNamedWindow( windowName, CV_WINDOW_NORMAL|CV_WINDOW_FREERATIO ); // 何かキーが押下されるまで、ループをくり返す while( cvWaitKey( 1 ) == -1 ) { // カメラから1フレーム取得する IplImage *image = cvQueryFrame( videoCapture ); // ウィンドウに画像を表示する cvShowImage( windowName, image ); cvSetMouseCallback(windowName, Mouse); //マウスのコールバック関数登録 } // ビデオキャプチャを解放する cvReleaseCapture( &videoCapture ); // ウィンドウを破棄する cvDestroyWindow( windowName ); return 0; } void Mouse( int event, int x, int y, int flags ,void *param = NULL) // コールバック関数 { switch(event) { case CV_EVENT_LBUTTONDOWN: std::cout << x << "," << y << "\n"; //マウスの左クリックがされたときにその座標を読み込む break; default: break; } } このように記述し、新しいウィンドウにキャプチャしている映像を取得し、そのウィンドウ上でクリックされた座標を取得する、というプログラムになっています。 これを、 「クリックされた周辺一定範囲の映像を拡大して表示する」 というものにしたいのですが、プログラミング経験が浅く、調べながらいろいろ試行錯誤しても上手く動くプログラムを書くことができません。 どなたかアドバイスをいただけないでしょうか?

みんなの回答

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.1

何を試してみて、どううまく行きませんでしたか? まったく何もできなかったということでしたら、まず、問題をもっと簡単にしてみましょう。 例えば、 「クリックされた周辺一定範囲の映像を拡大して表示する」 ではなく、 「無条件で固定倍率で拡大して表示する」 ならばわかりますか?

関連するQ&A

  • Opencvで質問

     Opencv初心者です。  今日opencvとVC++2010を設定して今練習中なのですが   #include <stdexcept>   #include <opencv/cv.h>   #include <opencv/highgui.h>   int main (int argc, char* argv[]){   const char *fileName = "C:\\Program Files\\OpenCV2.3.1\\samples\\c\\lena.jpg";   const char *windowName = "lena";   ::IplImage* img = ::cvLoadImage(fileName);   ::cvNamedWindow(windowName);   ::cvShowImage(windowName,img);   ::cvWaitKey();   ::cvDestroyWindow(windowName);   ::cvReleaseImage(&img);   }  と言うサンプルをビルドしたら  1>------ ビルド開始: プロジェクト: 画像処理練習, 構成: Debug Win32 ------  1>LINK : fatal error LNK1104: ファイル 'opencv_core231.lib' を開くことができません。  ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========  エラーが出てしまい先に進めません。  もしかしたら他に設定が悪いのでしょうか?  インストールもC:\Program Files\OpenCV2.3.1に名前も変えインストールしました。  ttp://shiotani.cn/20110904vc2010opencv.html  ここを参考にさせていただきました。 よろしくお願いします。

  • opencvでの2枚の画像の差分のやり方

    opencvのc言語で2枚の画像の差分をとりたいのですが,最後の差分をとるところでエラーが出てしまいます. char *filename = "動画の名前.avi"; CvCapture* cap = cvCaptureFromAVI(filename);//filename:const char*型のファイル名 filenameの動画像を読み込む double framecount = (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_COUNT);//フレーム数を数える IplImage *srcCur=NULL; IplImage *srcOld=NULL; cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, 1); srcOld = cvQueryFrame(cap);//1フレーム目の画像を読み込む cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, 2); srcCur = cvQueryFrame(cap);//2フレーム目の画像を読み込む cvAbsDiff(srcOld2,srcCur2,dst);←ここでエラーがでます。 エラー内容は多分,差分するためには,同じ画像サイズ同士で 同じ型どうしでないといけないと書かれていますが, 同じ動画から読み込まれているので,違うことはありえないと思います. どうしたらいいですか?

  • opencvについてわからないことがあります。

    IplImage *frame, *img_gray, *img_out;//画像変数宣言 CvPoint pushpt[10]; int cnum; CvScalar color[10]; int _tmain(int argc, _TCHAR* argv[]) { int key=0; int wait=100; int newFrame=0; CvCapture* src; //ビデオキャプチャ宣言 CvVideoWriter* rec; //ビデオライタ宣言 void on_mouse(int event,int x,int y,int flags,void *param); cvNamedWindow ("入力映像");//表示ウインドウの作成 cvNamedWindow ("出力映像"); src = cvCaptureFromFile("movie.avi");//映像取得 cvSetMouseCallback("入力映像",on_mouse,0); if(src == NULL){//ファイルが読み込めない場合 printf ("canot open\n"); //cvWaitKey(0); return -1; } cnum=-1; newFrame=1; frame = cvQueryFrame(src);//初期フレーム取得 //画像領域の確保 //img_gray = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 1); img_out = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); //ビデオファイル書き込み設定 rec = cvCreateVideoWriter("movie_out.avi",CV_FOURCC('X','V','I','D'),30,cvSize(frame->width, frame->height)); for(int i=0;i<10;i++){//クリックした数だけiを増やして色を変える color[i]=CV_RGB((int)(255.0/10*(10-i)),(int)(255.0/10*i),0); } while(1){//映像が終了するまで繰り返す if(newFrame){ frame = cvQueryFrame(src);//1フレーム取得 cvCopy (frame,img_out,0); newFrame=0; } if(frame == NULL) break;//映像終了時 //cvLine(frame,cvPoint(50,50),cvPoint(100,100),CV_RGB(255,0,0),2,CV_AA,0); //draw mark for(int i=0;i<=cnum;i++){//クリックした数だけ円を描画 cvCircle(img_out,pushpt[i],10,color[i],2,CV_AA,0); } cvShowImage ("入力映像", frame);//1フレーム表示 cvShowImage ("出力映像", img_out); cvWriteFrame(rec ,img_out);//1フレーム書き込み key=0; key=cvWaitKey(wait);//key 'n'の入力を待つ if(key == 'n'){ cnum=-1; newFrame=1; } if(key==27) break;//escキーを押した時終了 } cvDestroyAllWindows();//すべての表示ウインドウ破棄 cvReleaseCapture(&src);//ビデオキャプチャの解放 cvReleaseVideoWriter(&rec);//ビデオライタの解放 cvReleaseImage(&img_gray);//画像領域の解放 cvReleaseImage(&img_out); return 0; } //追加 void on_mouse(int event,int x,int y,int flags,void *param){ //printf("OnMouseDown\n"); if(event == CV_EVENT_LBUTTONDOWN){ cnum++; if(cnum>10) cnum=10;//マークの最大点制限 pushpt[cnum] = cvPoint(x,y); printf("OnMouse:%d\n",cnum); //cvCircle(frame,pushpt,20,CV_RGB(255,128,0),8,CV_AA,0); } } このソースコードを実行すると、nキーで1フレーム進む動画が2つ表示されます。 1つは読み込んだ動画を表示しています。 もう1つはそれを録画して、動画ファイルとして書き出しています。 読み込んだ動画上にマウスでクリックすると、録画の画面上に丸でマークをします。 ここまではできました。 しかし、ここから次に書くことができません。 1フレーム目でマウスでクリックしてマークをします。 次に、nキーを押して2フレーム目に進みます。(この時1フレームでマークしたものは消えています。) そして、2フレーム目でマウスでクリックして、マークをすると1フレーム目でマークしたものが一緒に出てくる(できれば色が薄くなって) ということがしたいです。 pushptという配列に座標がはいっているのは、わかっているのですがどう書けばよいかわかりません。 教えてくださいお願いします。

  • OpenCVでキャプチャした画像をbmp保存したい

    OpenCVでカメラからキャプチャした画像(コマ画像)をbmpで保存しようと思っています。 以下のプログラムで一応bmp画像は保存できるのですが、キー入力をしないと保存できません。 #include <iostream> #include <stdio.h> #include <cv.h> #include <highgui.h> #include <math.h> #include <stdlib.h> int main(void){ //画像保存用 char str[32]; //キー入力用 int key; //カメラの用意 CvCapture *capture; IplImage *frame = NULL; //カメラ画像用 //カメラ・デバイスの先頭ポインタを取得 capture = cvCaptureFromCAM(-1); //カメラ画像のサイズ double height = 240; double width = 320; //カメラ初期化 if(capture == NULL){ //カメラが見つからなかった場合 printf("カメラが見つかりません\n"); return (0); } //カメラ画像を表示するウィンドウの生成 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width); cvNamedWindow("CaptureFromCamera", CV_WINDOW_AUTOSIZE); //キー入力されたら画像をキャプチャ while(1){ //カメラ画像からフレーム画像を取り込む frame = cvQueryFrame(capture); if(frame == NULL) break; //画像の表示 cvShowImage("CaptureFromCamera", frame); //sキー入力で画像を保存、Escキー入力でループから抜ける key = cvWaitKey(10); if(key == '\x1b') break; else if(key == 's'){ sprintf(str, "Capture_Bitmap.bmp"); cvSaveImage(str, frame); } } //キャプチャの解放 cvReleaseCapture(&capture); //ウィンドウの破棄 cvDestroyWindow("CaptureFromCamera"); } 自分が作りたいプログラムは、 ・カメラからコマ画像を取得 ↓ ・それをbmp形式にする ↓ ・変換した画像はファイルにではなく、プログラム中の変数に保存 ↓ ・プログラムが動いている間ずっとこの処理を行う というものです。 特に変換した画像をプログラムが動いている間、ずっと変数に保存し続ける方法がわかりません。 プログラム中の変数に保存したい理由は、保存したコマ画像を用いてテンプレートマッチングなどを行いたいからです。 どなたか教えていただけると助かります。

  • Opencv画像処理 bmp処理

    常々自分の理解力の無さに呆れるyuki-yutoです。 今回はOpencvで作ったプログラムと別のプロジェクトで作ったプログラムをソースをコピーして一つにしたところ、オバーフロー?してしまうらしくプログラムが実行できません。 二つ別々なら動くので関数の受け渡しが悪いのでしょうか? 今回の処理の目的は Opencvでキャプチャ→bmpで保存→(書いていませんが)for文でRGBの量を求める→一定量のRが検出されればショートカットを起動する というものです。 RGBに関してはfor(i=0;i<width;i++)とかでまわしているソースを何処かで見た気がするのですが、bmp処理は疎いので正直RGBをどうやって出すかまだ良くわかっていません。 widthまでを使っているあたり1pixel毎配列にでも記録させているのでしょうか・・・? #include <stdio.h> #include <Windows.h> //bmp読み込み,ショトカ #include<iostream> #include <C:\OpenCV2.1\include\opencv\cv.h> #include <C:\OpenCV2.1\include\opencv\highgui.h> #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210d.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210d.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210d.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210.lib") #endif #include <math.h> #include <stdlib.h> int main(void){ //画像保存用 char str[32];//大きさは多く取っておいたほうが良いかも?640*480対応できるように。 //キー入力用 int key; //カメラの用意 CvCapture *capture; IplImage *frame = NULL; //カメラ画像用 //カメラ・デバイスの先頭ポインタを取得 capture = cvCaptureFromCAM(-1); //カメラ画像のサイズ double height = 240; double width = 320; //カメラ初期化 if(capture == NULL){ //カメラが見つからなかった場合 printf("カメラが見つかりません\n"); return (0); } //カメラ画像を表示するウィンドウの生成 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width); cvNamedWindow("CaptureFromCamera", CV_WINDOW_AUTOSIZE); //キー入力されたら画像をキャプチャ while(1){ //カメラ画像からフレーム画像を取り込む frame = cvQueryFrame(capture); if(frame == NULL) break; //画像の表示 cvShowImage("CaptureFromCamera", frame); //sキー入力で画像を保存、Escキー入力でループから抜ける key = cvWaitKey(10); if(key == '\x1b') break; else if(key == 's'){ sprintf_s(str, "Capture_Bitmap.bmp"); cvSaveImage(str, frame); } } //ウィンドウの破棄 cvDestroyWindow("CaptureFromCamera"); } //ここからキャプチャしたbmp処理。 int main( int argc, char *argv[] ){ FILE *fp; //ポインタ、読み込み専用 BITMAPFILEHEADER bfh; //ファイルヘッダ BITMAPINFOHEADER bmpinfo; //情報ヘッダ //BMPファイルがあるかどうかチェック if((fp=fopen("Capture_Bitmap.bmp","rb"))==NULL){ printf("ファイルが見つかりません"); exit(1); } //BMPファイルか確認 fread(&bfh, 14, 1, fp); //ファイルヘッダ読み込み,ってかファイルヘッダの1~14を読み込む if(memcmp(&bfh.bfType,"BM",2)) //BMPファイルかチェック、2バイト位置にBMがあるか printf("BMPファイルではありません"); fread(&bmpinfo, 40, 1, fp); //情報ヘッダ読み込み printf("データの大きさは%dMB\n",(bmpinfo.biSizeImage+bmpinfo.biSize)/1000000); //表示サイズ調節 //何色BMPファイルか返却値で判定 switch(bmpinfo.biBitCount){ case 1: printf("2色ビットマップ\n"); break; case 4: printf("16色ビットマップ\n"); break; case 8: printf("256色ビットマップ\n"); break; case 24: printf("1677色ビットマップ\n"); break; case 32: printf("1677色ビットマップ\n"); break; } //ココでRGBを抽出する、確かforを二回bmpの縦と横の最大値まで繰り返し、何か変数に入れるソースを見た気が・・・? printf("インターネット ショートカット を起動します。Enterを押してね"); getchar(); //ショトカ起動文。Windows.hでデスクトップにショートカットを指定。 fclose(fp); rewind(stdin); getchar(); }

  • visual studioについて

    最近C言語を学び始めたのですがビルドが出来なくて困ってます。 どこが間違っているのか教えてください😭 #include <opencv2/core.hpp> //coreモジュールノヘッダーをインクルード #include <opencv2/highgui.hpp>// highgui モジュールのヘッダーをインクルード #include <iostream> int main(int argc, const char* argv[]) { // 幅 320px、高さ240px で赤色の画像データを生成 cv::Mat redImg(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255)); // 画像表示用のウィンドウを生成 cv::namedWindow("red", cv::WINDOW_AUTOSIZE); // ウィンドウに画像を表示 cv::imshow("red", redImg); // キー入力を待機 cv::waitKey(0); // 作成したウィンドウを全て破棄 cv::destroyAllWindows(); return 0; }

  • 【OpenCV】ハイビジョンaviファイル読み込み途中にファイルが終了してしまう問題

    現在、OpenCVを用いてハイビジョンのaviファイル(1440*1080)の画像処理を行うプログラミングを行っています。 aviファイルの読み込み・表示はOpenCVでは一般的な方法であるcvCaptureFromAVIとcvQueryFrameを用いて行っています。 この処理において最初の方はうまく処理が行えるのですが、処理が進むとファイルがまだ終わっていないのにも関わらず、cvQueryFrameでフレームが取得できず、処理が終了してしまいます。 ファイルが終了してしまうフレーム数も大体決まっており、mencoderで変換したファイルは約460フレーム目で、Adobe Media Encoderで変換したファイルは約910フレーム目でファイルが終了してしまいます。 メディアプレーヤーでaviファイルそのものを再生してみたところ、460フレーム目・910フレーム目以降のフレームも存在していることが確認されたので、本当にファイルが終了しているというわけではありません。 このままだと約30秒以上の動画は扱えず、非常に困っています。 確認として以下のプログラムで1000フレーム目から読み込むようにしてみたのですが、やはりすぐにファイルが終わってしまいます。 試しにハイビジョンでないaviファイル(640*480)で処理してみたところ正常に動作したのでエンコーダーの問題かプログラムの問題ではないかと思うのですが、何か少しでもお分かりの方がいらっしゃればご指導よろしくお願い致します。 <aviファイル読み込みプログラム> #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> char input_name[] = "hogehoge.avi"; int main(int argc, char** argv) { int key, i = 0; CvCapture* capture = NULL; IplImage* img = NULL; char* captureWindow = "Capture"; double prop; if(NULL==(capture = cvCaptureFromAVI(input_name))){ printf("指定のaviファイルが見つかりませんでした.\n"); return -1; } cvNamedWindow(captureWindow, CV_WINDOW_AUTOSIZE); prop = 1000.0f;       cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, prop); for(;;) { if(NULL==(img=cvQueryFrame(capture))){ printf("movieファイルが終わりました。\n"); break; } cvShowImage(captureWindow, img); printf("No.%dframe\n", i); i++; key = cvWaitKey(1); if (key == 0x1b) { break; } } cvReleaseCapture(&capture); cvReleaseImage(&img); cvDestroyWindow(captureWindow); return 0; }

  •  OpenCV2.1.0でのコンパイルエラーについて、質問があります。

     OpenCV2.1.0でのコンパイルエラーについて、質問があります。  初心者で至らない点があるかと思いますが、ぜひ回答よろしくお願いします。  動画キャプチャを再生するプログラムを作ろうと、DirectXを利用しています。  (Visual C++ 2010 expressを使っています)  インクルードファイルでの<cv.h>や<dshow.h>は、Microsofot windows SDK 6.1  やOpenCv2.1.0をインストールして、VC++ディレクトリ中の   インクルードファイル(*.h)は    c:\OpenCV2.1\include\opencv   ラ イブラリファイル(*.lib)は    c:\OpenCV2.1\lib   ダイナミックリンクライブラリ ファイル(*.dll)は    c:\OpenCV2.1\bin  (これは、”実行可能なファイル"のところへ)  設定して、コンパイルエラーは出ないようになりました。  しかし、   「インクルードファイル(*.h)は  c:\OpenCV2.1\include\opencv」  の処置のおかげで、同一フォルダに入っている   「cxtypes.h」と「cxoperations.hpp」の二つで、下記のようなコンパイルエラーが出ます。   エラーメッセージ > error C3862: /clr:pure または /clr:safe を伴うアンマネージ関数を   コンパイルできません  インラインのネイティブ アセンブリはマネージ コードで   サポートされていません >error C3645: : __clrcall は、ネイティブ コードにコンパイルされた関数  では使用できません  上のエラーから、clrの問題と考えて、.NET .Freamework 4.0(x68)を  新しくインストールしましたが、上のエラーが解決せず、コンパイルできません。  VC++ディレクトリ中のリンカーは、     strmiids.lib     cv.lib     cxcore.lib     highgui.lib     dxerr.lib     dxguid.lib     d3dx9.lib     d3dx10.lib     d3d9.lib     winmm.lib     comctl32.lib     strmbase.lib  にしました。  コンパイルエラーを解決する方法をご教示くださると、大変幸いです。  よろしくお願いします。

  • Windows7 64bit でOpenCV2.1を動かしたい

    Windows7 64bit でOpenCV2.1を動かしたい Windows7 64bit visualstadio2005 でopencv2.1を動かしたいのですがreleaseだと動くのにdebugだとうまく動きません。 ネットの入門ページを参照にして インクルードファイルに C:\OpenCV2.1\include ライブラリファイルに C:\OpenCV2.1\lib C:\OpenCV2.1\bin を追加しました。 プラットフォームはよくわからなかったのでwin32とx64の両方に入れてみました また、環境変数もインストールの時点できちんと入っていることは確認しました。 また、プロジェクトのプロパティ→リンカ→入力→追加依存のファイルにも 構成がdebugのときに cv210d.lib cxcore210d.lib cvaux210d.lib highgui210d.lib releaseのときに cv210.lib cxcore210.lib cvaux210.lib highgui210.lib としています。 また、コード部分に #include "cv.h"と入力してもエラーが出るので #include <C:\OpenCV2.1\include\opencv\cv.h> とすることで対応している状況です。 どうすればうまく動くようになるでしょうか? もしよろしければ回答お願いします

  • OpenCVで動画の指定したフレームをキャプチャ

    現在,動画像処理を勉強している者です. OpenCV 2.3.1を使って動画像から任意のフレームを切り出し,Bitmapに格納する方法がわからなくて困っています. cvWaitKeyを使ってプログラムをスリープさせながら,繰返しすれば動画っぽく表示することはできるのですが,「40フレーム目から処理したい」といったことをするためにはどうすればいいのでしょうか. 以下のコードでプロパティをいじって動画の真ん中のフレームを切り出すつもりだったのですが,無理でした... cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frame_count / 2.0); この後にIplImage型の変数にcvQueryFrame(capture)を突っ込んでもnullでした...なぜ... ※なお,capture←動画ファイル frame_count←総フレーム数がそれぞれ格納されています.