質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

5128閲覧

opencvを用いた画像処理プログラムの開発でのエラー

kkpancake

総合スコア7

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/03/06 12:41

前提・実現したいこと

私は画像認識プログラムを作成していました.

今回参考として以下のページ
http://ishidate.my.coocan.jp/opencv_17/opencv_17.htm)
のプログラムをvisualstudio2010に書き,ビルドした結果エラーがでました.

プログラミング初心者であり参考書片手に問題を解決しようとしましたが,いくつかの解決策を試しましたが別のエラーが出たため結局動くことはありませんでした.

よろしければ解決方法をご教授いただきたいです.
よろしくお願いします.

該当のソースコード

C++

#include "stdafx.h" #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/calib3d/calib3d.hpp> #include <iostream> #include <iomanip> //#include <string> //#include <string.h> //#include <sstream> using namespace std; using namespace cv; /* string itos(int x) { stringstream y; y<<x; return y.str(); } */ int _tmain(int argc, _TCHAR* argv[]) { const int BOARD_W = 9; //チェスボードの横方向コーナーの数 const int BOARD_H = 6; //チェスボードの縦方向コーナーの数 const Size BOARD_SIZE = Size (BOARD_W, BOARD_H); const int N_CORNERS = BOARD_W*BOARD_H; const int N_BOARDS = 10; //チェスボードの撮影枚数 const float SCALE = 30; //チェスボードの正方形の辺の長さ (mm) const Size IM_SIZE = Size (512, 384); //撮影写真のピクセル数 //----------- 原画像を読み込む -------- vector<Mat> src_image (N_BOARDS); for (int i = 0; i <N_BOARDS; i++) { src_image[i] = imread ("cboard" + itos(i) + ".png"); } //--------- imagePointsを取得する---------- vector<vector<Point2f>>imagePoints; vector<Point2f> imageCorners; //このvectorがimagePoints Mat gray_image; bool found; Mat dst_image; for (int i = 0; i < N_BOARDS; i++) { //---------- コーナーを検出する ---------- found = findChessboardCorners(src_image[i], BOARD_SIZE , imageCorners); //------------ 精度を高める -------------- cvtColor(src_image[i], gray_image, CV_BGR2GRAY); cornerSubPix(gray_image, imageCorners, Size (9, 9), Size(-1, -1), TermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 30, 0.1)); imagePoints.push_back(imageCorners); } //---------object Pointsを設定する-------- vector<vector<Point3f>> objectPoints; vector<Point3f>objectCorners; //このvectorがobjectPoints for (int j = 0; j < BOARD_H; j++) for (int i = 0; i < BOARD_W; i++) { objectCorners.push_back (Point3f(i*SCALE, j*SCALE, 0.0f)); } for (int i = 0; i < N_BOARDS; i++) { objectPoints.push_back(objectCorners); } //-----カメラキャリブレーションを行う----- Mat cameraMatrix; Mat distCoeffs; vector<Mat> rvecs; vector<Mat> tvecs; double rms = calibrateCamera (objectPoints, imagePoints, Size(512, 384), cameraMatrix, distCoeffs, rvecs, tvecs); //------ キャリブレーション結果の表示 cout << fixed << right; cout << "Re-projection Error (unit: pixel)" << endl; cout <<" " << rms << endl; cout << endl; cout << "cameraMatrix (unit: pixel)" << endl; cout << " fx=" << cameraMatrix.at<double>(0, 0); cout << " fy=" << cameraMatrix.at<double>(1, 1); cout << " cX=" << cameraMatrix.at<double>(0, 2); cout << " cy=" << cameraMatrix.at<double>(1, 2); cout << endl << endl; cout << "distCoeffs" << endl; cout << " k1=" << distCoeffs.at<double> (0, 0); cout << " k2=" << distCoeffs.at<double> (0, 1); cout << " p1=" << distCoeffs.at<double> (0, 2); cout << " p1=" << distCoeffs.at<double> (0, 3); cout << " k3=" << distCoeffs.at<double> (0, 4); cout << endl << endl; //---- キャリブレーション結果を格納する ---- FileStorage fs("calibration.xml", FileStorage::WRITE); fs << "cameraMatrix" << cameraMatrix; fs << "distCoeffs" << distCoeffs; fs.release(); //------- rvecsとtvecsの表示(参考) --------- cout << "rotation vector" << endl; for (int i = 0; i < N_BOARDS; i++) { cout << "cboard" + itos(i); for (int j = 0; j < 3; j++) { cout << " " << setw(9) << setprecision(4) << rvecs[i].at<double>(j, 0); } cout << endl; } cout << endl; cout << "translation vector" << endl; for (int i = 0; i < N_BOARDS; i++) { cout << "cboard" + itos(i); for (int j = 0; j < 3; j++) { cout << " " << setw(9) << setprecision(4) << tvecs[i].at<double>(j, 0); } cout << endl; } cout << endl << endl; //----------画像を補正する (例) ---------- undistort(src_image [3], dst_image, cameraMatrix, distCoeffs); namedWindow("補正画像 "); imshow ("補正画像 ", dst_image); waitKey(0); destroyAllWindows(); return 0; }

試したこと

①「#include <string>, #include <string.h>, #include <sstream>」の追加
②to_string の定義文(?)の追加
③int から stringにしたいので 「itos」を作成してmain文内でitosを使用
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
・①だけではエラーは一個も減りませんでした.(当然ですが増えもしませんでした)

・②追加したソースコード↓
namespace patch
{
template < typename T > std::string itos( const T& n )
{
std::ostringstream stm ;
stm << n ;
return stm.str() ;
}
}
①と同様エラーに変化なし

・③上記の②の部分をコメントアウトしてitosを追加したところ本プログラムのobjファイルがエラーを吐きました.
*以下一部記載↓
エラー 1 error LNK2019: 未解決の外部シンボル "public: virtual __cdecl cv::FileStorage::~FileStorage(void)" (??1FileStorage@cv@@UEAA@XZ) が関数 wmain で参照されました。 \○○ファイル\abc.obj

エラー 2 error LNK2019: 未解決の外部シンボル "class cv::_OutputArray const & __cdecl cv::noArray(void)" (?noArray@cv@@YAAEBV_OutputArray@1@XZ) が関数 wmain で参照されました。 \○○ファイル\abc.obj

エラー 3 error LNK2019: 未解決の外部シンボル "public: virtual void __cdecl cv::FileStorage::release(void)" (?release@FileStorage@cv@@UEAAXXZ) が関数 wmain で参照されました。 \○○ファイル\abc.obj

エラー 4 error LNK2019: 未解決の外部シンボル "public: __cdecl cv::FileStorage::FileStorage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0FileStorage@cv@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H0@Z) が関数 wmain で参照されました。 \○○ファイル\abc.obj

エラー 5 error LNK2019: 未解決の外部シンボル "public: __cdecl cv::_OutputArray::_OutputArray(class std::vector<class cv::Mat,class std::allocator<class cv::Mat> > &)" (??0_OutputArray@cv@@QEAA@AEAV?$vector@VMat@cv@@V?$allocator@VMat@cv@@@std@@@std@@@Z) が関数 wmain で参照されました。 \○○ファイル\abc.obj

上記のようなエラー37個が発生.

発生している問題・エラーメッセージ

対策を講じる前のエラー(ソースコード内にto_stringが3つあるため下記エラーが3つ重複しています)

エラー 1 error C2668: 'std::to_string' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) \○○ファイル\abc.cpp 48
エラー 4 IntelliSense: オーバーロードされた関数 "to_string" の複数のインスタンスが引数リストと一致します: \○○ファイル\abc.cpp 48

補足情報(FW/ツールのバージョンなど)

VisualStudio 2010
OpenCV 2.4.10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/03/06 12:56

『追加のライブラリディレクトリ』は編集しましたか?
yuki23

2018/03/06 13:54

質問のタグに OpenCV を追加することをお勧めします
guest

回答1

0

ベストアンサー

最低限、そのシリーズの (1) OpenCVをダウンロードしてVisual Studio で使う は読みましたか? (1) を飛ばして (17) からやろうとしているなら論外です。
具体的に言うと、 (1) の追加するライブラリの設定が抜けているか、使用するライブラリのバージョンが間違っていると思われます。
初心者によくある間違いは、OpenCV の32bit版と64bit版をごっちゃにしたり、デバッグ版とリリース版を同時にリンクすると、そのようなエラーが出ます。
プロジェクトの設定の「追加の依存ファイル」が、そのページの通り (opencv_core2410d.lib, ...) になっているか確認してください。

投稿2018/03/06 13:47

編集2018/03/06 13:52
yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkpancake

2018/03/07 08:41

回答ありがとうございます. はい,1ページ目は読み設定を行いました. また参考書として手元にある「実践OpenCV」や,インターネット上での設定に関する記事をもとに初期環境設定を行いました. 具体的にはプロパティページを開き ①「構成プロパティ」→「C/C++」→「全般」→opencv-2.4.10\build\includeの追加 ②「リンカー」→「全般」→「追加のライブラリ ディレクトリ」→opencv-2.4.10\build\x86\vc10\libの追加 ③「リンカー」→「入力」→「追加の依存ファイル」→opencv_core2410d.lib;opencv_imgproc2410d.lib;opencv_features2d2410d.lib;opencv_highgui2410d.lib;opencv_ml2410d.libの追加 以上を行いました ちなみに上にある「構成」→アクティブ(Debug)で試し,それに加え「すべての構成」に変えて試しましたが上手くいきませんでした. また上の「プラットフォーム」は「アクティブ(x64)」と「Win32」どちらも試しましたが駄目でした. 皆さんがおっしゃっているように「追加依存ファイル」で足らないファイルがあるのでしょうか? よろしくお願いします.
kkpancake

2018/03/08 08:43

再度2.4.10.exe をインストールし直しVisualStudioに反映させたところ別のエラー文が出ました. エラー 1 error LNK2019: 未解決の外部シンボル "double __cdecl cv::calibrateCamera(class cv::_InputArray const &,class cv::_InputArray const &,class cv::Size_<int>,class cv::_OutputArray const &,class cv::_OutputArray const &,class cv::_OutputArray const &,class cv::_OutputArray const &,int,class cv::TermCriteria)" (?calibrateCamera@cv@@YANAEBV_InputArray@1@0V?$Size_@H@1@AEBV_OutputArray@1@222HVTermCriteria@1@@Z) が関数 wmain で参照されました。 \○○ファイル\abc.obj エラー 2 error LNK2019: 未解決の外部シンボル "bool __cdecl cv::findChessboardCorners(class cv::_InputArray const &,class cv::Size_<int>,class cv::_OutputArray const &,int)" (?findChessboardCorners@cv@@YA_NAEBV_InputArray@1@V?$Size_@H@1@AEBV_OutputArray@1@H@Z) が関数 wmain で参照されました。 \○○ファイル\abc.obj 今回出たエラーもcv::_InputArrayやcv::_OutputArrayがあるということは,やはりリンクができていないということでしょうか?
yuki23

2018/03/08 12:38

安楽椅子探偵ごっこをしていても埒が明きませんので、とりあえずプロジェクトファイル一式をどこかにアップロードしてもらえないでしょうか?
yuki23

2018/03/09 14:47

見ました。2つ問題があります。 1. x64 でビルドしていると思いますが、 Debug と Release とで追加のインクルードディレクトリが異なります。どちらかのパスが間違っていると思われます。 2. cv::calibrateCamera ... のリンカエラーが出るのは、記事(17) で指示されている opencv_calib3d2410d.lib を追加していないからです。 上記2つを直せば、こちらではビルドが通りました。
kkpancake

2018/03/12 00:52

yukiさん 何回も繰り返しご質問させていただき,また直接ご確認いただきありがとうございます. 無事こちらもビルドできました. 灯台下暗しでやっていたと思い込んでいました. 本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問