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

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

ただいまの
回答率

90.01%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,274

kkpancake

score 5

 前提・実現したいこと

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

今回参考として以下のページ
(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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2018/03/06 21:56

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

    キャンセル

  • yuki23

    2018/03/06 22:54

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

    キャンセル

回答 1

checkベストアンサー

+1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/09 17:51

    こちらです
    ご確認お願いします
    容量の関係上opencvは入っていません
    https://drive.google.com/drive/folders/1FrlvpeQkFjlPozJdGwHMhJYGfbI5TyfP?usp=sharing

    キャンセル

  • 2018/03/09 23:47

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

    キャンセル

  • 2018/03/12 09:52

    yukiさん
    何回も繰り返しご質問させていただき,また直接ご確認いただきありがとうございます.

    無事こちらもビルドできました.
    灯台下暗しでやっていたと思い込んでいました.
    本当にありがとうございました

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る