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

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

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

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

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Q&A

1回答

616閲覧

Kinect Depth画像のみの表示

noa_remiria

総合スコア11

C++

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

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

0グッド

0クリップ

投稿2018/07/06 02:32

前提・実現したいこと

下記のサンプルコードをいじってポインターを消して、目標として深度画像のみを表示させたいです。
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

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

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

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

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

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

guest

回答1

0

エラー自体がリンクのエラーなのでライブラリーのパスがちゃんと通っているかを確認されていただきたい。

投稿2018/07/07 03:46

MasahikoHirata

総合スコア3747

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

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

noa_remiria

2018/07/09 03:35

返信遅れて申し訳ありません。 VC++ディレクトリのライブラリディレクトリには【%opencv3.4.1%\build\x64\vc15\lib】のopencv3.4.1のライブラリを リンカーの追加ライブラリディレクトリには【%opencv3.4.1%\build\x64\vc15\lib】と 【%Microsoft SDKs%Kinect\v2.0_1409\Lib\x64】のkinect SDKとopencv3.4.1のライブラリをつなげております。 数回確認しましたがスペルミスはありませんでした。
MasahikoHirata

2018/07/09 04:59

VC++の追加のライブラリーの部分にopencvのライブラリーは追加されました? 最後のエラーを例に。 ’imshow()'がリンク出来ていないので。
noa_remiria

2018/07/09 05:43

VC++の追加のライブラリは、 構成プロパティ→VC++ディレクトリ→全般→ライブラリ ディレクトリ のことでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問