現在、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を導入しています。
何かヒントになることでもいいので、助言をよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。