- 締切済み
コマンドプロンプトからファイルへの出力
失礼します。 いまテンプレートマッチングを用いた物体追跡を行っています。 画面内に映っている物体のなかでテンプレート画像とマッチした部分を四角で囲み追跡します、さらにその部分のピクセル座標を随時コマンドプロンプトに表示させています。 そこで質問なのですが、このコマンドプロンプトに表示させている座標をtxtファイルに出力させたいのですが可能でしょうか?? ためしに自分でやってみたのですがうまくいきませんでした。。 よろしければアドバイスお願いします。 以下に関係ある部分のソースコードを載せます。 ofstream fout("matchdata.txt"); if(!fout){ cout<<"ファイルをオープンできませんでした。\n"; return 1; }else{ cout<<"ファイルをオープンしました。\n"; } //ループ開始 while(1){ //カメラ・デバイスから画像取得 memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(frameImage,grayImage,CV_BGR2GRAY); // テンプレートマッチングを行う cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED ); // テンプレートが元画像のどの部分にあるのかという情報を得る cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL ); if(max_interlinkage>0.60){ corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height); //コマンドプロンプトへの表示 printf("point x=%d ",max_point.x+templateImage->width); printf(" y=%d ",max_point.y+templateImage->height); cvRectangle(frameImage , max_point , corner_point , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT); printf("\n"); } fout<<"point x= "<<max_point.x+templateImage->width<<" y= "<<max_point.y+templateImage->height; fout.close(); // ウィンドウを生成する cvNamedWindow( windowNameTemplate, CV_WINDOW_AUTOSIZE ); cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE ); // 画像を表示する cvShowImage( windowNameTemplate, templateImage ); cvShowImage( windowNameDestination , frameImage ); //キー入力 key = cvWaitKey(1); if(key=='q'){ break; }else if(key=='c'){ cvSaveImage("image/frame.bmp",frameImage); } }
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8755/19867)
プログラムに一切の手を加えず、コンソールにデータが表示されるプログラムのまま、コマンドラインからプログラムを起動する際に 実行プログラム名 > matchdata.txt と「標準出力をファイルにリダイレクト」して下さい。 Windowsなら、MS-DOSプロンプトの画面を開き C:\Documents and Settings\xxx>CD 実行プログラムがあるディレクトリ[ENTER] C:\実行プログラムがあるディレクトリ>実行プログラム名 > matchdata.txt[ENTER] です。 Unix系シェルなら、シェルコンソールから Username %cd /実行プログラムがあるディレクトリ[ENTER] Username %実行プログラム > matchdata.txt[ENTER] です。 「標準出力に出ているなら、標準出力をファイルにリダイレクトすれば済むだけの話」で、わざわざプログラムを書き換える必要はありません。 頭脳とリダイレクトは「使えるうちに使って」下さい。
- php504
- ベストアンサー率42% (926/2160)
fout.close(); の場所が悪いのでは while(1)ループの外で閉じないと
- Tacosan
- ベストアンサー率23% (3656/15482)
「うまくいかなかった」とは, どのように「うまくいかなかった」のでしょうか? あなたの期待する動作と実際の動作を説明しないことには「群盲象をなでる」状態ですよ.
- fioletti
- ベストアンサー率0% (0/2)
ios::out [ | ios::trunc ]
お礼
回答ありがとうございます! 調べて勉強してみようと思います。
- ya-cha
- ベストアンサー率38% (27/70)
>ためしに自分でやってみたのですがうまくいきませんでした。。 やってみた内容を示していただきたいです。 僕も初心者ですが、ファイルの入出力は初歩だと思いますので、質問者様がコーディングされたソースを提示していただければ、多少のアドバイスは出来るかと思います。
お礼
早速のご回答ありがとうございます! 書き忘れてしまいましたが、質問に書いたコードが実際に自分でファイル出力を想定して記述してみたソースです。 失敗してしまいましたが。。 1,while文の前の「ofstream fout~」で出力先のtxtファイルを用意。 2,「fout<<"point x"~」の部分でファイルへ書き出す。 3,「fout.close()」で閉じる という手順でやってみました。 これは本当に単純で参考書に記載されていたファイル出力の方法をそのまま行ってみただけのものです。 実際、参考書の部分では「数値を配列に格納」→「ファイルに出力」という手順でしたので今回のプログラムとは少し異なるのかもしれません。
- A88No8
- ベストアンサー率52% (836/1606)
berserk_00さん、こんにちは プロンプトに表示させるくらいデータをコントロールできるなら、ファイルに出力するプログラムを追加できるのでは?
お礼
回答ありがとうございます! 実は今回、画像処理が必要ということで多少やっつけで手を付けてしまった感がありまして。 javaやC言語のように自分で配列を用意して数値を格納し、それをファイル出力といったことならできるのですが、今回のようにリアルタイムで次々に表示されるデータを扱うのは初めてなんです。 実際、応用すればすぐに解決できそうな問題なのですが。
補足
回答ありがとうございます! 説明不足ですいませんでした。 自分の希望としましては、「コマンドプロンプトに随時表示される座標をtxt形式でファイルに出力したい」というものです。 それで今回質問に載せたコードのようにファイルへの出力を想定したコードを書いてみたのですが、実行してみたところコマンドプロンプトに表示されるだけでファイルも作られておらず出力ができていないという現状です。