プロが教えるわが家の防犯対策術!

【visual studio2010におけるopencv利用上でのコンパイルエラー】

当方visual studioもopencvも初心者です。踏まえてお答えいただけると大変助かります。

この度、オプティカルフローに関する勉強をしようとopencvの利用を始めました。
しかし、以下の文章が出てきてコンパイルができません。

optical_flow.cpp(1): warning C4627: '#include "cv.h"': プリコンパイル済みヘッダーの使用を検索中にスキップされました
ディレクティブを 'StdAfx.h' に追加するか、プリコンパイル済みヘッダーをビルドし直します
optical_flow.c++(2): warning C4627: '#include "highgui.h"': プリコンパイル済みヘッダーの使用を検索中にスキップされました
ディレクティブを 'StdAfx.h' に追加するか、プリコンパイル済みヘッダーをビルドし直します

(この後は、上記ヘッダファイル内で宣言していると思われる関数が無効である。という旨のエラーメッセージが延々と続きます)


visualstudio上の設定はしっかりと行い、環境設定上のpath設定も行いました。なお、設定は下記URLに従って行い、白い画面が出るプログラムまでは正常に動作しました。
http://imagesensing.seesaa.net/article/200532994 …

しかし、以下のHPに記載されているオプティカルフローのサンプルプログラムを動かそうとすると上記のヘッダファイルが開けない。という旨のエラーメッセージが出ます。
http://opencv.jp/sample/optical_flow.html

そのままコンパイルしようとした際、プリコンパイルヘッダーをソースに追加する指示が一度出たので#include "StdAfx.h"はソースに追加してあります。


プリコンパイルヘッダーを使用しない。という設定も試みましたがダメでした。
解決法を教えてください。宜しくお願いします。

A 回答 (6件)

>しかし、以下のHPに記載されているオプティカルフローのサンプルプログラムを動かそうとすると上記のヘッダファイルが開けない。

という旨のエラーメッセージが出ます。

どのようにプロジェクトを作成したのでしょうか?
新規に作成した場合、先に掲示されたページの「【2】openCVの環境設定」はやり直す(というかプロジェクト毎に別の設定になる)必要がありますが……。
# 構成プロパティの「VC++ ディレクトリ」で「インクルードディレクトリ」「ライブラリディレクトリ」に追加すると…他のプロジェクトにも適用されますかねぇ……。
# 未確認ですが。
# ただし、その場合でも「追加のライブラリファイル」の指定(リンカーの入力・追加の依存ファイル)は必要です。

>プリコンパイルヘッダーを使用しない。という設定も試みましたがダメでした。

どんなエラーが出ましたか?

>解決法を教えてください。

最初に掲示されたページの「【2】openCVの環境設定」を行い、
サンプルソースの
#include <cv.h>
#include <highgui.h>

#include <opencv\cv.h>
#include <opencv\highgui.h>
に変更、プリコンパイルヘッダは使用しないに設定してビルドすると……
ライブラリが見つからない。と言われましたので……
ライブラリディレクトリにあるライブラリファイルを追加の依存ファイルに突っ込んでみました。
# Debugビルドなので、
# dir /b C:\OpenCV2.2\lib\*d.lib
# で表示されたファイルを指定。
# リリースビルドの場合はdが付かないヤツになりますな。
ということで、とりあえずビルドは出来ました。
入力ファイルとか用意していないので、「ビルドが通る」ということを確認しただけですが。

ちなみに使ったのは、
http://sourceforge.net/projects/opencvlibrary/fi …
から
OpenCV-2.2.0-win32-vs2010.exeをDLしてインストールしたもの…です。

この回答への補足

回答ありがとうございます!

コンパイルが成功した空白のウィンドウを表示するプロジェクトにそのまま上書きする形で行いました。また、設定をし直した新規プロジェクト(ファイル→新規作成→プロジェクト→C++→WIN32コンソール…)で作成したものにも設定をしなおしてコンパイルしましたが同じ結果が出ました。

>#include <opencv\cv.h>
>#include <opencv\highgui.h>
>に変更、プリコンパイルヘッダは使用しないに設定してビルドすると……

※(1)
1>c:\users\ken\documents\visual studio 2010\projects\optical_flow\optical_flow\optical_flow.c++(9): error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ken\documents\visual studio 2010\projects\optical_flow\optical_flow\optical_flow.c++(9): error C2065: '  IplImage' : 定義されていない識別子です。

※(1)下のようなエラーがひたすらに続きました。
直接的にcv.h、highgui.hを読み込めない。というようなメッセージは見当たりませんが、認識できていないのでしょうか?

また、
>ライブラリディレクトリにあるライブラリファイルを追加の依存ファイルに突っ込んでみました。
とある通りcmdで検索し、
opencv_calib3d220d.lib
opencv_contrib220d.lib
opencv_core220d.lib
opencv_features2d220d.lib
opencv_ffmpeg220d.lib
opencv_flann220d.lib
opencv_gpu220d.lib
opencv_highgui220d.lib
opencv_imgproc220d.lib
opencv_legacy220d.lib
opencv_ml220d.lib
opencv_objdetect220d.lib
opencv_video220d.lib
をプロジェクト→optical_flowのプロパティ→構成プロパティ→リンカー→入力→追加の依存ファイル
に追加しました。
が、依然状況が変わらず、※(1)のようなエラーメッセージが表示されます。

使用したopencvはWr5さんと変わらずOpenCV-2.2.0-win32-vs2010.exeです。
インストールした場所はcドライブ直下で、c:\opencv2.2となっています。ファイルの場所も合っているとは思うのですが…。

補足日時:2012/07/06 19:41
    • good
    • 0

>optical_flow.c++(9): error C3872: '0x3000': この文字を識別子で使用することはできません


>optical_flow.c++(9): error C2065: '  IplImage' : 定義されていない識別子です。

9行目になんかヘンなの混じっているようですけど?
全角スペースとか入っていませんか?
# UNICODEで全角スペースが0x3000っぽいですが。

この回答への補足

Wr5さん
度々の回答ありがとうございます。

原因は不明ですが全体的にスペースが全角になっていました。お騒がせして申し訳ありませんでした。
また、新しくdllの読み込みでエラーが出ているのでNO.3さんへの回答をご覧いただいて回答いただけると幸いです。

補足日時:2012/07/07 17:10
    • good
    • 0

できましたけど。

参考URL参照。

参考URL:https://skydrive.live.com/embed?cid=07C558F8E11E …

この回答への補足

epistemeさん
解答ありがとうございます。

ファイル確認しました。ありがとうございます。
確かに、コンパイルエラーは出ませんでした。が、今度はdllの読み込みでエラーが出たようです。

>'optical_flow.exe': 'C:\Users\ken\Documents\Visual Studio 2010\Projects\optical_flow\Debug\optical_flow.exe' を読み込みました。シンボルが読み込まれました。
>'optical_flow.exe': 'C:\Windows\SysWOW64\ntdll.dll' を読み込みました。Cannot find or open the PDB file
>'optical_flow.exe': 'C:\Windows\SysWOW64\kernel32.dll' を読み込みました。Cannot find or open the PDB file




と各dllファイルの読み込みに関してCannot find or open the PDB fileというメッセージが出ます。
他の質問を探した結果、ランタイム?というものをインストールすると書いてあるのを見つけました。
が、具体的に何をどうすればよいのかが分かりませんでした。

動作環境の違いでしょうか?一応、私の動作環境を以下に書いておきます。

OS : Windows7 64bit
使用しているVSのver : Microsoft Visua Studio 2010 (Professional)
使用しているOpencv : OpenCv2.2

補足日時:2012/07/07 17:20
    • good
    • 0

PDBがないのはOpenCVのdistributionに含まれていないんだからアタリマエ。


PDBはデバッグ情報だからなくてもいぃんじゃね? 動かなかったですか?
    • good
    • 0

> PDBがないのはOpenCVのdistributionに含まれていないんだからアタリマエ。



ああ、ごめんなさい。Windows-APIのデバッグシンボル"も"ないのか。
...やっぱり要らんよね? Release-modeでは無問題ですよね。

この回答への補足

epistemeさん
度々の回答ありがとうございます。


Releaseで依存ファイル等設定し直してビルドしましたがダメでした。
結果は以下です。

1>optical_flow.c++(1): warning C4627: '#include <opencv\cv.h>': プリコンパイル済みヘッダーの使用を検索中にスキップされました
1>ディレクティブを 'StdAfx.h' に追加するか、プリコンパイル済みヘッダーをビルドし直します
1>optical_flow.c++(2): warning C4627: '#include <opencv\highgui.h>': プリコンパイル済みヘッダーの使用を検索中にスキップされました
1>ディレクティブを 'StdAfx.h' に追加するか、プリコンパイル済みヘッダーをビルドし直します
1>optical_flow.c++(8): error C2065: 'IplImage' : 定義されていない識別子です。




とこのメッセージの後「定義されていない識別子です。」や、「識別子が見つかりませんでした。」というメッセージがかなりの数で続きます。


Debugモードで行うと、一瞬cmdの窓は出てくるのですが、すぐに消えてしまいます。
エラーメッセージの最後に



'optical_flow.exe': 'C:\Windows\SysWOW64\msctf.dll' を読み込みました。Cannot find or open the PDB file
プログラム '[5536] optical_flow.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。


とあるので、おそらく-1がreturnされてしまっているようです。
プログラム自体は動作していません。


一応、ヒューマンエラーの可能性も考えて以下に私がビルドしようとしているプログラムファイルを載せておきます。
http://kie.nu/fBp
パスワード:optical

補足日時:2012/07/07 22:56
    • good
    • 0

>Releaseで依存ファイル等設定し直してビルドしましたがダメでした。



「プリコンパイル済みヘッダーは使わない。」にしておいたほうがいいでしょう。
使うなら使うで、ソース側を正しく修正するべきです。

で……
Release構成の「追加のインクルードディレクトリ」の指定が間違っています。
"C:\OpenCV2.2\include\opencv"ではなく"C:\OpenCV2.2\include"です。

実行時にVSの出力ウィンドウに表示される
「Cannot find or open the PDB file」とか「バイナリはデバッグ情報と一緒にビルドされませんでした。」は無視しても良いでしょう。
自分で作ったDLLなどの場合で、デバッグするなら重要でしょうが、そうでなければ無視して問題ないと。
# 中まで追いかけたいとかいうならデバッグ情報なり入手する必要はあるかも知れませんが…初心者のすることでもないでしょう。

>Debugモードで行うと、一瞬cmdの窓は出てくるのですが、すぐに消えてしまいます。

コードの
> if (argc != 3 ||
>(src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_GRAYSCALE)) == 0 ||
>(src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_GRAYSCALE)) == 0)
>return -1;
が、何を示しているのか…理解されていないということですね。
プロセスのコマンドラインで引数が2つ必要(argc != 3の部分)で、それぞれcvLoadImage()が読み込める画像ファイル名である必要があります。

プロジェクトの構成プロパティで「デバッグ」の「コマンド引数」に画像ファイルを2つ「フルパスで」記述してください。
# ファイル名だけでもOKだったりしますが、その場合は「作業ディレクトリ」で指定されてい場所に置いておく必要があります。
# 作業ディレクトリがなんなのか…について理解していないのならフルパスで記入してください。
ちなみに私の場合は
「P:\optical_flow\image_sample20-1.jpg P:\optical_flow\image_sample20-2.jpg」となりました。
なお、Debug構成とRelease構成で別々に設定が必要ですのでご注意を。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

なるほど!コマンドラインでの画像入力をしたことがなかったのでプログラム起動時に画像パスの入力を求められるものだと勝手に思っていました。コマンド引数にパスを入力するのですね。。
相対パスで入力し、無事動作しました。

丁寧に最後まで教えていただきありがとうございました。本当に助かりました。

お礼日時:2012/07/08 11:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!