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

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

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

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

Kinect

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

Q&A

解決済

2回答

4881閲覧

【C++】kinectでカラー画像を表示させようとすると未解決の外部シンボル~というエラーが出てしまう

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

Kinect

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

0グッド

0クリップ

投稿2016/08/23 06:02

編集2016/08/23 06:04

現在、C++でKinectを用いたプログラムの作成を行っています。

参考書は秀和システミさんが出版されている「KINECT for Windows SDKプログラミングKinect for Windows v2センサー対応版」を使用しています。

この参考書の中に書かれているカラー画像を表示するサンプルコードを入力してみたのですが、エラーが出てしまいます。

入力したソースは以下です。

C++

1#include <iostream> 2#include <sstream> 3 4#include <Kinect.h> 5 6#include <opencv2\opencv.hpp> 7 8#include <atlbase.h> 9 10// 次のように使います 11// ERROR_CHECK( ::GetDefaultKinectSensor( &kinect ) ); 12// 書籍での解説のためにマクロにしています。実際には展開した形で使うことを検討してください。 13#define ERROR_CHECK( ret ) \ 14 if ( (ret) != S_OK ) { \ 15 std::stringstream ss; \ 16 ss << "failed " #ret " " << std::hex << ret << std::endl; \ 17 throw std::runtime_error( ss.str().c_str() ); \ 18 } 19 20class KinectApp 21{ 22private: 23 24 // Kinect SDK 25 CComPtr<IKinectSensor> kinect = nullptr; 26 CComPtr<IColorFrameReader> colorFrameReader = nullptr; 27 28 int colorWidth; 29 int colorHeight; 30 unsigned int colorBytesPerPixel; 31 32 ColorImageFormat colorFormat = ColorImageFormat::ColorImageFormat_Bgra; 33 34 // 表示部分 35 std::vector<BYTE> colorBuffer; 36 37public: 38 39 ~KinectApp() 40 { 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 // カラーリーダーを取得する 54 CComPtr<IColorFrameSource> colorFrameSource; 55 ERROR_CHECK(kinect->get_ColorFrameSource(&colorFrameSource)); 56 ERROR_CHECK(colorFrameSource->OpenReader(&colorFrameReader)); 57 58 // カラー画像のサイズを取得する 59 CComPtr<IFrameDescription> colorFrameDescription; 60 ERROR_CHECK(colorFrameSource->CreateFrameDescription( 61 colorFormat, &colorFrameDescription)); 62 ERROR_CHECK(colorFrameDescription->get_Width(&colorWidth)); 63 ERROR_CHECK(colorFrameDescription->get_Height(&colorHeight)); 64 ERROR_CHECK(colorFrameDescription->get_BytesPerPixel(&colorBytesPerPixel)); 65 std::cout << "create : " << colorWidth << ", " << 66 colorHeight << ", " << 67 colorBytesPerPixel << std::endl; 68 69 // バッファーを作成する 70 colorBuffer.resize(colorWidth * colorHeight * colorBytesPerPixel); 71 } 72 73 void run() 74 { 75 while (1) { 76 update(); 77 draw(); 78 79 auto key = cv::waitKey(10); 80 if (key == 'q') { 81 break; 82 } 83 } 84 } 85 86private: 87 88 // データの更新処理 89 void update() 90 { 91 updateColorFrame(); 92 } 93 94 // カラーフレームの更新 95 void updateColorFrame() 96 { 97 // フレームを取得する 98 CComPtr<IColorFrame> colorFrame; 99 auto ret = colorFrameReader->AcquireLatestFrame(&colorFrame); 100 if (FAILED(ret)) { 101 return; 102 } 103 104 // BGRAの形式でデータを取得する 105 ERROR_CHECK(colorFrame->CopyConvertedFrameDataToArray( 106 colorBuffer.size(), &colorBuffer[0], ColorImageFormat_Bgra)); 107 } 108 109 // データの表示処理 110 void draw() 111 { 112 drawColorFrame(); 113 } 114 115 116 // カラーデータの表示処理 117 void drawColorFrame() 118 { 119 // カラーデータを表示する 120 cv::Mat colorImage(colorHeight, colorWidth, CV_8UC4, &colorBuffer[0]); 121 cv::imshow("Color Image", colorImage); 122 } 123}; 124 125void main() 126{ 127 try { 128 KinectApp app; 129 app.initialize(); 130 app.run(); 131 } 132 catch (std::exception& ex) { 133 std::cout << ex.what() << std::endl; 134 } 135}

このプロジェクトはGithubからも閲覧できます。
サンプルソースGitHub
C++(Native)/_Template/KinectV2-with-OpenCV

このプログラムを実行すると、未解決の外部シンボル、未解決の外部参照というエラーが発生していまいました。
エラー詳細

以前、似たようなエラーが出たことがあったのですが、その時はSDKのリンク付け部分を見直し修正することができました。今回はその修正したプロジェクトを利用しています。
その時にさせていただいた質問
また、GitHubからダウンロードしたプロジェクトを利用しても同様のエラーがでてしまいます。

言語はC++、開発環境はVisual Studio2015、プロジェクトにはOpenCV2.4.10を導入しています。

何かヒントになることでもいいので、助言をよろしくお願いします。

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

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

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

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

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

guest

回答2

0

Chironianさんの助言をもとに自己解決することができました。

エラーはOpenCVのリンクが行われていないことが原因でした。

以前、Visual Studio2012でOpenCVを利用していたのですが、このときはNuGetを用いたOpenCVの導入を行っていました。
今回も同様にNuGetを用いて導入したのですが、どうやらVisual Studio2015ではできないようです。
(自分もしっかりと調べていないので正しいはわかりませんが、NuGetを用いたOpenCV導入はツールセットが対応していないらしいです)

OpenCV公式からダウンロードし、パスを自分で引くことにより解決することができました。

参考
Visual Studio 2015 CommunityでOpenCVを使う (C++)
NuGet+OpenCVがVisual Studio2015で利用できないと書かれています。

Visual Studio 2015でOpenCVを動かすための環境設定
こちらの方法で解決することができました。

投稿2016/08/23 08:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

こんにちは。

エラーはOpenCVのライブラリをリンクしていないことが原因のようです。
OpenCVの適切なパッケージを適切な場所へセットアップする必要がある筈です。

GitHubのプロジェクトをちょっと見てみました。
まず、K4W2-Book-master\C++(Native)_Template\KinectV2-with-OpenCVはOpenCV2.4.8を使っているようです。バージョン違いが原因の可能性はあります。

しかし、OpenCVのライブラリをリンクする必要があるはずですが、リンクしている様子がありませんでした。
でも、KinectV2.vcxprojをテキスト・エディタでみると、Import Project="..\packages\OpenCV.2.4.8\build\native\OpenCV.propsとの記述がありますので、どこかにOpenCV 2.4.8を用意しておく必要がありそうな感じがします。

秀和システム(システミではないですよ)さんの本にOpenCVのセットアップについて説明はないでしょうか?

投稿2016/08/23 07:44

Chironian

総合スコア23272

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

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

退会済みユーザー

退会済みユーザー

2016/08/23 08:10

前回に引き続きご回答いただきありがとうございます。 自分もOpenCV絡みでエラーが出てしまっているなと考えて解決策を探していました。 NuGetでOpenCV2.4.10を導入していたのですが、Visual Studio2015のチップセットv140では、この方法でOpenCVを利用することはできなかったみたいです。 NuGetではなくOpenCV公式からOpenCVをダウンロードし、パスを自分で引くことによって動作させることができました。 ご回答ありがとうございました。また何かあったらよろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/08/23 08:23

チップセット→ツールセット 誤字です。すみません。 バージョンの違いは2.4.11を導入しても動作したので、問題なさそうでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問