Open CVについて

このQ&Aのポイント
  • Open CVを使用したVC++2008 ExpressのWindows FormアプリケーションでUSBカメラから画像を取得して表示する方法について質問です。
  • main_formのpictuteBoxにUSBカメラから画像を取得して表示するために、Open CVのライブラリを使っています。しかし、sub_formのみでエラーが出てしまいます。
  • main_form.hの先頭部分とsub_formの先頭部分に必要なインクルードを記述しているのに、なぜエラーが出るのか分かりません。解決策を教えてください。
回答を見る
  • ベストアンサー

Open CVについて

現在Open CVを用いて,VC++2008 ExpressのWindows Formアプリケーションを作成しています。 main_formのpictuteBoxにUSBカメラから画像を取得して表示し,sub_formはアプリケーションの設定用フォームで,USBカメラの解像度などの情報を取得して表示しようとしています。 main_form.hの先頭部分に以下のように記述しています。 #include <cv.h> #include <highgui.h> #include "sub_form.h" CvCapture *capture1 = 0; sub_formの先頭部分に以下のように記述しています。 #include "main_form.h" #include <cv.h> CvCapture *capture2 = 0; 上記のように記述後,ビルド使用とすると, 『...\sub_form.h(457) error C2065: 'CvCapture' : 定義されていない識別子です。』 と,sub_formのみでエラーが出てしまいます。 cv.hをインクルードしているのに,なぜこのようなエラーがでてしまうのでしょうか? お分かりになる方がいらっしゃいましたら,ご教授宜しくお願い致します。

質問者が選んだベストアンサー

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

1. CvCapture が宣言されているのは highgui.h の方なので、使うところで highgui.h を include しないといけません。cv.h では足りません。 2. 2つ目のエラーは多重定義エラーですから、変なものを include しているのでしょう。もう一度正確にヘッダファイルの内容を見せてくれれば、どう直せばいいかアドバイスできるかもしれません。

con014057
質問者

お礼

ご回答ありがとうございます。 cv.hとhighgui.hとsub_form.hのincludeをstdafx.hに記述することで,問題なく 動作させることができました。 OpenCVの問題ではなく,単なるC++/CLIの書き方の問題でした...

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

すみません。これだけでははっきりとした原因はわかりません。 ただ、気になる点はあります。 ・main_form.hの中に#include "sub_form.h"があって、sub_form.hの中に#include "main_form.h"があります。 おそらく、多重読み込みを防止するしくみは入っているでしょうからエラーにはならないのでしょうが、構造としておかしいです。 この場合だと、main_form.hとsub_form.hに分割した意味がありません。 共通で使うものだけ別ファイルにするとかがセオリーです。 例えば、common.hにして、 main_form.hの#include "sub_form.h"→#include "common.h" にするとか。 ・「CvCapture *capture1 = 0;」と書かれていますが、ヘッダファイルにこのような宣言を書くと、このヘッダをincludeしているソース全てにcapture1の実体が作られることになります。今は途中でエラーになっているのでわかりませんが、エラーが取れてリンクまで進むと、多重定義となってエラーになります。

con014057
質問者

お礼

ご回答ありがとうございます。 common.hを作成し,共通部分をそちらに記述してみました。 common.hの中に #include <cv.h> #include <highgui.h> と書くと,別のエラーになってしまいました。 どうも,sub_form.hにhighgui.hをインクルードするとエラーになるようです。 エラーが40個ほど出ているため全ては記述できませんが, C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\objidl.h(6110) : error C2872: 'IDataObject' : あいまいなシンボルです。 と同じ様なエラーが出てしまいます...

関連するQ&A

  • Open CVによる動画保存について

    現在,Open CVを使用して,webカメラからから取得した映像を動画として保存しようとしています。 公式サイトや参考書のコードを丸写ししテストしています。 コンソールアプリケーションで作成した場合は,問題なく動画を保存できましたが,フォームアプリケーションで作成した場合,エラーで停止してしまいます。 動作としては,timerを使用して,30msec間隔でカメラから画像を取得し,動画として保存というものです。 CvCapture *capture;//画像 CvVideoWriter* rec; IplImage *srcImage; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { timer1->Interval=30; timer1->Enabled=true; capture = cvCaptureFromCAM(0); srcImage = cvQueryFrame(capture); rec = cvCreateVideoWriter("movie.avi",CV_FOURCC('M','J','P','G'),30,cvSize(100,100)); } private: System::Void timer1_Tick() {    captureImage(); } private:System::Void captureImage(void){ cvFlip(srcImage,srcImage,0); srcImage=cvQueryFrame(capture); cvWriteFrame(rec,srcImage); } 上記の, cvWriteFrame(rec,srcImage); の箇所で停止してしまいます。 ビルドは成功しているのですが,実行時の1目でエラーになります。 エラー内容『保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。』 どなたか原因がわかるかたがいらっしゃいましたら,ご教授いただけますでしょうか?

  • opencvについて

    OpenCVの初歩のプログラムなんですが実行するとコマンドプロンプトと実行画面が出てきます。しかし実行画面には何も映りません。エラーも出ず、正しくビルドされています。使用しているwebカメラはMicrosoft社の「LifeCam VX-1000」です。初期設定も正しく設定しました。参考にしているものは、「OpenCV プログラミングブック 第2版」です。どなたかアドバイスお願いします。 プログラム↓ #include <stdio.h> #include <highgui.h> int main(int argc, char** argv) { CvCapture *capture; IplImage *frameImage; char windowNameCapture[] = "Capture"; capture = cvCreateCameraCapture(0); cvNamedWindow(windowNameCapture, CV_WINDOW_AUTOSIZE); while (1) { frameImage = cvQueryFrame(capture); cvShowImage(windowNameCapture, frameImage); if (cvWaitKey(33) == 'q') break; } cvReleaseCapture(&capture); cvDestroyWindow(windowNameCapture); return 0; }

  • Open CVについて

    現在,OpenCVとVC++2008のC++/CLIでwindows formアプリケーションを作成しています。 フォーム上のpictureBoxにUSBカメラから取得した画像を,録画しながら,pictureBoxに表示させています。しかし,取り込んだ画像が,pictureBoxに収まり切っていないようです。(添付画像のようなに枠内の画像に対して,肌色部分しか,pictureBoxに表示されていない状態) コードは http://hisoap.jugem.jp/?eid=156 を参考に,以下のように記述しています。 CvCapture *capture srcImage = cvQueryFrame(capture); Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox->Width, pictureBox->Height); pictureBox->Image = bmpPicBox; Graphics^g = Graphics::FromImage(pictureBox->Image); Bitmap^ bmp = gcnew Bitmap(pictureBox->Width, pictureBox->Height, srcImage->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(srcImage->imageData)); g->DrawImage(bmp, 0, 0, srcImage->width , srcImage->height); どのようにすれば,画像をpictureBoxにぴったりと表示させることができるでしょうか?

  • 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形式にする ↓ ・変換した画像はファイルにではなく、プログラム中の変数に保存 ↓ ・プログラムが動いている間ずっとこの処理を行う というものです。 特に変換した画像をプログラムが動いている間、ずっと変数に保存し続ける方法がわかりません。 プログラム中の変数に保存したい理由は、保存したコマ画像を用いてテンプレートマッチングなどを行いたいからです。 どなたか教えていただけると助かります。

  • opencv1.0 画面が真っ黒

    以前までXPを使用しVisual C++ 2008にopencv1.0を導入し、USB接続のwebカメラから 画像をキャプチャしリアルタイムでの画像処理などのプログラミングしていたのですが、 このたびOSをXP(32bit) からwindows7(64bit)に変え、前使っていた環境つまり Visual C++ 2008 opencv1.0 で設定したところ、コンパイルは正常にでき、普通にpng画像などを取り込むような画像処理は可能なのですが、webカメラからの画像が読み込めず、真っ黒な画像が表示されてしまいました。 ちなみに実行したプログラムはXPの時には正常に作動していたものと同じものを実行しています。 また、webカメラ自体はamcapなどのソフトを使い動作させることはできます。 自分なりに考えた問題点は、 プログラムに問題がある、またはvisualC++を2010にする、opencvを2.2などの最新版に 更新するなどがあげられますが、 この場合なにが原因として考えられるのでしょうか? その点アドバイスいただけたらうれしく思います。 よろしくお願いします。 実行したプログラムは以下の通りです(取り込んだ画像を表示しているだけの、シンプルなプログラムです。直すところなどありましたら教えてください。) *************************************************** #include <cv.h> #include <highgui.h> #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"highgui.lib") int main(int argc, char** argv){ int key; CvCapture* capture; capture=cvCreateCameraCapture(-1); IplImage *frameImg =cvQueryFrame(capture); cvNamedWindow("Capture" ,CV_WINDOW_AUTOSIZE); while(1){ cvShowImage("Capture",frameImg); key = cvWaitKey(1); if(key=='q') break; } cvReleaseCapture(&capture); cvDestroyWindow("Capture"); return 0; } ****************************************************

  • OpenCV プログラムについて

    webカメラを表示するプログラムをつくりました。 しかし、webカメラのウィンドウが小さいのでフルウィンドウにして表示させたいです。 どうすればフルウィンドウでwebカメラを表示することができますか? 解答よろしくお願いします #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • open cvで配列の値をテキストに出力するプログラム

    こんにちわ。  今、open cvで映像を読み込みその映像の何フレーム目でキー入力がされたかを出力するプログラムを作成しています。  そこで、キー入力されたキーとその時のフレーム、時間の結果を配列に格納して、その内容をテキストに出力したいのですがうまくいきません。ファイル出力された結果は上書きされて最後に行ったキー入力の結果しか出力されません。全ての結果をテキストに出力できるようにしたいのでお願いします。  いろいろ不具合があると思うので教えてください。 ---------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "cxcore.h" #include "cv.h" #include "image.h" //読み込む動画ファイル名 char* input_filename="video2_result.avi"; //IplImage IplImage* src; IplImage* gray; IplImage* canny; int main(void) { char wname[] = "input"; CvCapture* capture; IplImage *frame; int key; int a[1000]; int count = 0; FILE *fp; time_t timer; struct tm *date; char str[256]; capture = cvCaptureFromFile("video2_result.avi"); cvNamedWindow(wname,1); for(;;){ frame = cvQueryFrame(capture); if(frame == NULL) break; cvShowImage(wname,frame); key = cvWaitKey(30); /*キー入力*/ if(key == 'q') break; if(key == 'a'){ printf("%d\n",count); /*現在時間の取得*/ timer = time(NULL);/* 経過時間を取得 */ date = localtime(&timer);/* 経過時間を時間を表す構造体 date に変換 */ strftime(str, 255, "%Y, %B, %d, %A %p%I:%M:%S", date); printf("%s\n", str); } count++; } cvReleaseCapture( &capture ); cvDestroyAllWindows(); //入力結果をファイルに出力 fp = fopen("frame.txt","w"); { fprintf(fp,"%d,\n",a[count]); fprintf(fp,"%s,\n",str); fprintf(fp,"\r\n"); } fclose(fp); return 0; } --------------------------------------------------- これが作成中のプログラムです。

  • OpenCV webカメラ同時出力について

    opencvで画像処理をしています。 Webカメラを2台同時に出力させるプログラムをつくりたいと思っているのですが、方法が全く分かりません。 どうすれば2台同時に出力させることができますか? 1台だけ出力させるプログラムはこちらを使っています。 #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • #include "_cv.h"の設定を教えて

    VisualStudioC++2010を用いて、#include "_cv.h"を使用したいのですが、ファイルが存在する場所 「C:\Program Files\OpenCV\cv\src」を追加のインクルードファイルに入れても以下のエラーがでます。 1>C:\Program Files\OpenCV\cv\src\_cv.h(84): error C2146: 構文エラー : ';' が、識別子 'icvDepthToDataType' の前に必要です。 1>C:\Program Files\OpenCV\cv\src\_cv.h(84): error C2433: 'CvDataType' : 'inline' はデータ宣言をするのに使用できません。 1>C:\Program Files\OpenCV\cv\src\_cv.h(84): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>C:\Program Files\OpenCV\cv\src\_cv.h(84): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません ・・・・・ どなたか#include "_cv.h"の設定の仕方を教えてくれないでしょうか?

  • VisualStudio C++の初期設定で困っています。

    Visual Studio C++でOpenCVを使って、画像処理系のプログラムの練習をしています。 家のパソコンは初期のvistaを使っていてそこでは出来たんですが、 2台目のWindows7搭載型のノートではエラーが出て進みません。 エラー内容は fatal error LNK1104:ファイル'highgui.h'を開くことができません。 とでます。 ソースは #include "highgui.h" #include "cv.h" int main(int argc, char** argv){ cvNamedWindow("sample"); IplImage* src = cvLoadImage("sample.jpg"); cvShowImage("sample",src); cvReleaseImage( &src ); cvDestroyWindow("sample"); } 開発環境が7の64ビットに変わったからっていうのもあるのかと思っていますが、よくわかりません。エラーの内容で検索をかけてやってみたのですが、いまいちわからなかったので質問させてもらいました。よろしくお願いします。

専門家に質問してみよう