前提・実現したいこと
下記のサンプルコードをいじってポインターを消して、目標として深度画像のみを表示させたいです。
(https://github.com/K4W2-Book/K4W2-Book/blob/master/C%2B%2B(Native)/02_Depth/KinectV2-Depth-01/KinectV2/main.cpp)
発生している問題・エラーメッセージ
1>main.obj : error LNK2019: 未解決の外部シンボル "public: __cdecl cv::Exception::Exception(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (??0Exception@cv@@QEAA@HAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00H@Z) が関数 "public: __cdecl cv::Mat::Mat(int,int,int,void *,unsigned __int64)" (??0Mat@cv@@QEAA@HHHPEAX_K@Z) で参照されました。 1>main.obj : error LNK2019: 未解決の外部シンボル "public: __cdecl cv::_InputArray::_InputArray(class cv::Mat const &)" (??0_InputArray@cv@@QEAA@AEBVMat@1@@Z) が関数 "private: void __cdecl KinectDepth::drawDepthFrame(void)" (?drawDepthFrame@KinectDepth@@AEAAXXZ) で参照されました。 1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YAHPEAHH@Z) が関数 "public: void __cdecl cv::Mat::release(void)" (?release@Mat@cv@@QEAAXXZ) で参照されました。 1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl cv::imshow(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::_InputArray const &)" (?imshow@cv@@YAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_InputArray@1@@Z) が関数 "private: void __cdecl KinectDepth::drawDepthFrame(void)" (?drawDepthFrame@KinectDepth@@AEAAXXZ) で参照されました。
該当のソースコード
C++
1#include <iostream> 2#include <sstream> 3 4#include <Kinect.h> 5#include <opencv2\opencv.hpp> 6 7#include <atlbase.h> 8 9// 次のように使います 10// ERROR_CHECK( ::GetDefaultKinectSensor( &kinect ) ); 11// 書籍での解説のためにマクロにしています。実際には展開した形で使うことを検討してください。 12#define ERROR_CHECK( ret ) \ 13 if ( (ret) != S_OK ) { \ 14 std::stringstream ss; \ 15 ss << "failed " #ret " " << std::hex << ret << std::endl; \ 16 throw std::runtime_error( ss.str().c_str() ); \ 17 } 18 19class KinectDepth 20{ 21private: 22 23 // Kinect SDK 24 CComPtr<IKinectSensor> kinect = nullptr; 25 26 CComPtr<IDepthFrameReader> depthFrameReader = nullptr; 27 28 // 表示部分 29 int depthWidth; 30 int depthHeight; 31 32 33 std::vector<UINT16> depthBuffer; 34 35 36public: 37 38 ~KinectDepth() 39 { 40 // Kinectの動作を終了する 41 if (kinect != nullptr) { 42 kinect->Close(); 43 } 44 } 45 46 // 初期化 47 void initialize() 48 { 49 // デフォルトのKinectを取得する 50 ERROR_CHECK(::GetDefaultKinectSensor(&kinect)); 51 ERROR_CHECK(kinect->Open()); 52 53 // Depthリーダーを取得する 54 CComPtr<IDepthFrameSource> depthFrameSource; 55 ERROR_CHECK(kinect->get_DepthFrameSource(&depthFrameSource)); 56 ERROR_CHECK(depthFrameSource->OpenReader(&depthFrameReader)); 57 58 // Depth画像のサイズを取得する 59 CComPtr<IFrameDescription> depthFrameDescription; 60 ERROR_CHECK(depthFrameSource->get_FrameDescription( 61 &depthFrameDescription)); 62 ERROR_CHECK(depthFrameDescription->get_Width(&depthWidth)); 63 ERROR_CHECK(depthFrameDescription->get_Height(&depthHeight)); 64 std::cout << "create :" << depthWidth << "," << depthHeight << std::endl; 65 66 // バッファーを作成する 67 depthBuffer.resize(depthWidth * depthHeight); 68 } 69 70 71 void run() 72 { 73 while (1) { 74 update(); 75 draw(); 76 77 auto key = cv::waitKey(10); 78 if (key == 'q') { 79 break; 80 } 81 } 82 } 83 84private: 85 86 // データの更新処理 87 void update() 88 { 89 updateDepthFrame(); 90 } 91 //デプスフレーム更新 92 void updateDepthFrame() 93 { 94 // Depthフレームを取得する 95 CComPtr<IDepthFrame> depthFrame; 96 auto ret = depthFrameReader->AcquireLatestFrame(&depthFrame); 97 if (ret = S_OK) { 98 return; 99 } 100 101 // データを取得する 102 ERROR_CHECK(depthFrame->CopyFrameDataToArray(depthBuffer.size(), &depthBuffer[0])); 103 } 104 105 void draw() 106 { 107 drawDepthFrame(); 108 } 109 110 void drawDepthFrame() 111 { 112 // Depthデータを表示する 113 cv::Mat depthImage(depthHeight, depthWidth, CV_8UC1, &depthBuffer[0]); 114 cv::imshow("Depth Image", depthImage); 115 } 116}; 117 118int main() 119{ 120 try { 121 KinectDepth app; 122 app.initialize(); 123 app.run(); 124 } 125 catch (std::exception& ex) { 126 std::cout << ex.what() << std::endl; 127 }
試したこと
追加ライブラリにopencv3.4.1とKinect sdkが入っていることを確認したりUINTをBYTEに変換したり、環境変数の設定もしましたが上記の未解決シンボルのエラーが出てしまいました。
補足情報(FW/ツールのバージョンなど)
VisialStudio 2017 ,opencv3.4.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/09 03:35
2018/07/09 04:59
2018/07/09 05:43