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

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

ただいまの
回答率

87.77%

DLLのYOLOの扱い方

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 2,327

score 22

前提・実現したいこと

darknetのYOLOv2の物体検出を利用してWebカメラから読み込んだ映像を作成した.cfgと.weightsでリアルタイムに花を矩形で囲むようなWindowsフォームアプリケーションを作成しています。
yolo_cpp_dll.slnをビルドしてyolo_cpp_dll.dllを作成し、yolo_console_dll.slnをビルド、yolo_console_dll.exeを実行するところまではできています。
まずは、yolo_console_dll.slnのようにyolo_cpp_dll.dllやyolo_v2_class.hppを使ってwebカメラの映像をリアルタイムで花を検出するようなコンソールアプリケーションを作ろうとしています。
コンソールアプリケーションのファイル構成でつまずいています。

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

まず、yolo_console_dll.slnと全く同じプログラムを作成しようと、visual studio 2015でファイル→新規作成→プロジェクトからwin32コンソールアプリケーションを空のプロジェクトとして作成しました。yolo_console_dll.cppの内容をコピーしてyolo_cpp_dll.lib、yolo_cpp_dll.dll、yolo_v2_class.hppをソースコードと同じところに配置してデバッグなしで開始をしましたが。以下のエラーコードが出てしまいます。

重大度レベル    コード    説明    プロジェクト    ファイル    行    抑制状態
エラー    C4996    'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    YOLOdll    c:\users\aselab\documents\visual studio 2015\projects\yolodll\yolodll\yolo_v2_class.hpp    209    
エラー    C4996    'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    YOLOdll    c:\users\aselab\documents\visual studio 2015\projects\yolodll\yolodll\yolo_v2_class.hpp    189    
エラー    C4996    'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    YOLOdll    c:\users\aselab\documents\visual studio 2015\projects\yolodll\yolodll\yolo_v2_class.hpp    192    
エラー    C4996    'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    YOLOdll    c:\users\aselab\documents\visual studio 2015\projects\yolodll\yolodll\yolo_v2_class.hpp    200    

サイトで調べた情報をもとに#define _CRT_SECURE_NO_WARNINGSとyolo_v2_class.hppに記述してデバッグなしで開始したところ以下のエラーが発生しました。

重大度レベル    コード    説明    プロジェクト    ファイル    行    抑制状態
エラー    LNK2019    未解決の外部シンボル "public: __cdecl Detector::Detector(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0Detector@@QEAA@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0H@Z) が関数 main で参照されました。    YOLOdll    c:\Users\aselab\documents\visual studio 2015\Projects\YOLOdll\YOLOdll\main.obj    1    
エラー    LNK2019    未解決の外部シンボル "public: __cdecl Detector::~Detector(void)" (??1Detector@@QEAA@XZ) が関数 main で参照されました。    YOLOdll    c:\Users\aselab\documents\visual studio 2015\Projects\YOLOdll\YOLOdll\main.obj    1    
エラー    LNK2019    未解決の外部シンボル "public: class std::vector<struct bbox_t,class std::allocator<struct bbox_t> > __cdecl Detector::detect(struct image_t,float,bool)" (?detect@Detector@@QEAA?AV?$vector@Ubbox_t@@V?$allocator@Ubbox_t@@@std@@@std@@Uimage_t@@M_N@Z) が関数 "public: class std::vector<struct bbox_t,class std::allocator<struct bbox_t> > __cdecl Detector::detect_resized(struct image_t,int,int,float,bool)" (?detect_resized@Detector@@QEAA?AV?$vector@Ubbox_t@@V?$allocator@Ubbox_t@@@std@@@std@@Uimage_t@@HHM_N@Z) で参照されました。    YOLOdll    c:\Users\aselab\documents\visual studio 2015\Projects\YOLOdll\YOLOdll\main.obj    1    
エラー    LNK2019    未解決の外部シンボル "public: static void __cdecl Detector::free_image(struct image_t)" (?free_image@Detector@@SAXUimage_t@@@Z) が関数 "public: void __cdecl <lambda_2e9fc37c78f127f2606664cac01bc482>::operator()(struct image_t *)const " (??R<lambda_2e9fc37c78f127f2606664cac01bc482>@@QEBAXPEAUimage_t@@@Z) で参照されました。    YOLOdll    c:\Users\aselab\documents\visual studio 2015\Projects\YOLOdll\YOLOdll\main.obj    1    
エラー    LNK2019    未解決の外部シンボル "public: int __cdecl Detector::get_net_width(void)const " (?get_net_width@Detector@@QEBAHXZ) が関数 "public: class std::shared_ptr<struct image_t> __cdecl Detector::mat_to_image_resize(class cv::Mat)const " (?mat_to_image_resize@Detector@@QEBA?AV?$shared_ptr@Uimage_t@@@std@@VMat@cv@@@Z) で参照されました。    YOLOdll    c:\Users\aselab\documents\visual studio 2015\Projects\YOLOdll\YOLOdll\main.obj    1    
エラー    LNK2019    未解決の外部シンボル "public: int __cdecl Detector::get_net_height(void)const " (?get_net_height@Detector@@QEBAHXZ) が関数 "public: class std::shared_ptr<struct image_t> __cdecl Detector::mat_to_image_resize(class cv::Mat)const " (?mat_to_image_resize@Detector@@QEBA?AV?$shared_ptr@Uimage_t@@@std@@VMat@cv@@@Z) で参照されました。    YOLOdll    c:\Users\aselab\documents\visual studio 2015\Projects\YOLOdll\YOLOdll\main.obj    1    
エラー    LNK1120    6 件の未解決の外部参照    YOLOdll    c:\users\aselab\documents\visual studio 2015\Projects\YOLOdll\x64\Debug\YOLOdll.exe    1    

該当のソースコード

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>

#define OPENCV

#include "yolo_v2_class.hpp"    // imported functions from DLL


#ifdef OPENCV
#include <opencv2/opencv.hpp>            // C++
//#pragma comment(lib, "opencv_core249.lib")
//#pragma comment(lib, "opencv_imgproc249.lib")
//#pragma comment(lib, "opencv_highgui249.lib")
#pragma comment(lib, "opencv_world340.lib")
void draw_boxes(cv::Mat mat_img, std::vector<bbox_t> result_vec) {
    for (auto &i : result_vec) {
        cv::rectangle(mat_img, cv::Rect(i.x, i.y, i.w, i.h), cv::Scalar(50, 200, 50), 3);
    }
    cv::imshow("window name", mat_img);
    cv::waitKey(0);
}
#endif    // OPENCV


void show_result(std::vector<bbox_t> result_vec) {
    for (auto &i : result_vec) {
        std::cout << "obj_id = " << i.obj_id << " - x = " << i.x << ", y = " << i.y
            << ", w = " << i.w << ", h = " << i.h
            << ", prob = " << i.prob << std::endl;
    }
}



int main()
{
    Detector detector("yolo-voc.cfg", "yolo-voc.weights");

    while (true)
    {
        std::string filename;
        std::cout << "input image filename: ";
        std::cin >> filename;
        if (filename.size() == 0) break;

#ifdef OPENCV
        cv::Mat mat_img = cv::imread(filename);
        std::vector<bbox_t> result_vec = detector.detect(mat_img);
        draw_boxes(mat_img, result_vec);
#else
        std::vector<bbox_t> result_vec = detector.detect(filename);
#endif
        show_result(result_vec);
    }

    return 0;
}

試したこと

未解決の外部シンボル~が関数~で参照されましたというエラーコードがあるのでなにかincludeできていなかったりするのかと考えているのですがわかりません。

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

Windows 10
opencv 3.4.0

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • yohhoy

    2019/05/17 11:36

    エラー「未解決の外部シンボル~が関数~で参照されました」は、コンパイル時ではなくリンク時のエラーです。つまりコンパイル時に処理されるinclude不足ではなく、リンク時に必要な依存ライブラリ(*.lib)指定が不足しているために生じるエラーです。

    キャンセル

まだ回答がついていません

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

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

関連した質問

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