前提・実現したいこと
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
あなたの回答
tips
プレビュー