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

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

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

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

Kinect

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

Q&A

解決済

1回答

5098閲覧

KINECTv2のエラーについて

kana_yamamoto

総合スコア7

C++

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

Kinect

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

0グッド

0クリップ

投稿2017/08/04 07:34

kinect v2で音声方向を扱うためのプログラミングを行ったのですが、LNK2019のエラーが出てしまい、先に進めなくなってしまいました。

###発生している問題・エラーメッセージ

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー LNK2019 未解決の外部シンボル "void __cdecl cv::line(class cv::Mat &,class cv::Point_<int>,class cv::Point_<int>,class cv::Scalar_<double> const &,int,int,int)" (?line@cv@@YAXAAVMat@1@V?$Point_@H@1@1ABV?$Scalar_@N@1@HHH@Z) が関数 "private: void __thiscall KinectApp::draw(void)" (?draw@KinectApp@@AAEXXZ) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー 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@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV_InputArray@1@@Z) が関数 "private: void __thiscall KinectApp::draw(void)" (?draw@KinectApp@@AAEXXZ) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z) が関数 "public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "void __cdecl cv::error(class cv::Exception const &)" (?error@cv@@YAXABVException@1@@Z) が関数 "public: __thiscall cv::Mat::Mat(int,int,int,void *,unsigned int)" (??0Mat@cv@@QAE@HHHPAXI@Z) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "public: __thiscall cv::_InputArray::_InputArray(class cv::Mat const &)" (??0_InputArray@cv@@QAE@ABVMat@1@@Z) が関数 "private: void __thiscall KinectApp::draw(void)" (?draw@KinectApp@@AAEXXZ) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "public: __thiscall 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@@QAE@HABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00H@Z) が関数 "public: __thiscall cv::Mat::Mat(int,int,int,void *,unsigned int)" (??0Mat@cv@@QAE@HHHPAXI@Z) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ) が関数 "public: void __thiscall cv::Mat::release(void)" (?release@Mat@cv@@QAEXXZ) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@QAEXABV12@@Z) が関数 "public: __thiscall cv::Mat::Mat(class cv::Mat const &)" (??0Mat@cv@@QAE@ABV01@@Z) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "public: virtual __thiscall cv::Exception::~Exception(void)" (??1Exception@cv@@UAE@XZ) が関数 "public: __thiscall cv::Mat::Mat(int,int,int,void *,unsigned int)" (??0Mat@cv@@QAE@HHHPAXI@Z) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "public: static class cv::MatExpr __cdecl cv::Mat::zeros(int,int,int)" (?zeros@Mat@cv@@SA?AVMatExpr@2@HHH@Z) が関数 "private: void __thiscall KinectApp::draw(void)" (?draw@KinectApp@@AAEXXZ) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YAHPAHH@Z) が関数 "public: __thiscall cv::Mat::Mat(class cv::Mat const &)" (??0Mat@cv@@QAE@ABV01@@Z) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1 エラー LNK2019 未解決の外部シンボル "int __cdecl cv::waitKey(int)" (?waitKey@cv@@YAHH@Z) が関数 "public: void __thiscall KinectApp::run(void)" (?run@KinectApp@@QAEXXZ) で参照されました。 kinect C:\Users\Daiki Tanaka\Documents\Visual Studio 2015\Projects\kinect\kinect\base.obj 1

###該当のソースコード

#include <iostream> #include <sstream> #include<Kinect.h> #include<opencv2\opencv.hpp>//opencv #include<atlbase.h>//opencv #define ERROR_CHECK( ret ) \ if ( (ret) != S_OK ){ \ std::stringstream ss; \ ss << " failed " #ret " " << std::hex << ret << std::endl; \ throw std::runtime_error( ss.str().c_str() );\ } class KinectApp { private: CComPtr<IKinectSensor>kinect = nullptr; CComPtr<IAudioBeamFrameReader> audioBeamFrameReader = nullptr; float beamAngle; float beamAngleConfidence; //IKinectSensor* kinect = nullptr; IColorFrameReader* colorFrameReader = nullptr; std::vector<BYTE> colorBuffer; int colorWidth; int colorHeight; unsigned int colorBytesPerPixel; WAITABLE_HANDLE waitableHandle = 0; bool isAvailable = false; public: void initialize() { //デフォルトのkinectを取得する ERROR_CHECK(::GetDefaultKinectSensor(&kinect)); ERROR_CHECK(kinect->Open()); //カラーリーダーを取得する CComPtr<IColorFrameSource> colorFrameSource; ERROR_CHECK(kinect->get_ColorFrameSource(&colorFrameSource)); ERROR_CHECK(colorFrameSource->OpenReader(&colorFrameReader)); //カラー画像のサイズを取得する CComPtr<IFrameDescription> colorFrameDescription; ERROR_CHECK(colorFrameSource->CreateFrameDescription(ColorImageFormat::ColorImageFormat_Bgra, &colorFrameDescription)); ERROR_CHECK(colorFrameDescription->get_Width(&colorWidth) ); ERROR_CHECK(colorFrameDescription->get_Height(&colorHeight)); ERROR_CHECK(colorFrameDescription->get_BytesPerPixel(&colorBytesPerPixel)); std::cout << "create :" << colorWidth << "," << colorHeight << "," << colorBytesPerPixel << std::endl; //バッファーを作成する colorBuffer.resize(colorWidth * colorHeight * colorBytesPerPixel); //オーディオを開く CComPtr<IAudioSource> audioSource; ERROR_CHECK(kinect->get_AudioSource(&audioSource)); ERROR_CHECK(audioSource->OpenReader(&audioBeamFrameReader)); } void updateAudioFrame() { CComPtr<IAudioBeamFrameList> audioBeamFrameList; auto ret = audioBeamFrameReader->AcquireLatestBeamFrames(&audioBeamFrameList); if (ret != S_OK) { return; } //ビームフレームを取得する UINT beamCount = 0; ERROR_CHECK(audioBeamFrameList->get_BeamCount(&beamCount)); for (int i = 0; i < beamCount; i++) { CComPtr<IAudioBeamFrame> audioBeamFrame; ERROR_CHECK(audioBeamFrameList->OpenAudioBeamFrame(i, &audioBeamFrame)); //サブフレームを取得する UINT subFrameCount = 0; ERROR_CHECK(audioBeamFrame->get_SubFrameCount(&subFrameCount)); for (int j = 0; j < subFrameCount; j++) { CComPtr<IAudioBeamSubFrame> audioBeamSubFrame; ERROR_CHECK(audioBeamFrame->GetSubFrame(j, &audioBeamSubFrame)); //角度及び角度の信頼性を取得する ERROR_CHECK(audioBeamSubFrame->get_BeamAngle(&beamAngle)); ERROR_CHECK(audioBeamSubFrame->get_BeamAngleConfidence(&beamAngleConfidence)); } } } void run() { while (1) { update(); draw(); auto key = cv::waitKey(10); if (key == 'q') { break; } } } private: void update() { updateColorFrame();// カラーフレームの更新 } // カラーフレームの更新 void updateColorFrame() { // フレームを取得する CComPtr<IColorFrame> colorFrame; auto ret = colorFrameReader->AcquireLatestFrame(&colorFrame); if (FAILED(ret)) { return; } //if (ret == S_OK) { // BGRAの形式でデータを取得する ERROR_CHECK(colorFrame->CopyConvertedFrameDataToArray( colorBuffer.size(), &colorBuffer[0], ColorImageFormat::ColorImageFormat_Bgra)); // スマートポインタを使ってない場合は、自分でフレームを解放する // colorFrame->Release(); // } } void draw() { drawColorFrame(); cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC4); //ラジアンから度に変換する auto angle = beamAngle * 180 / 3.1416; //線を回転させる(逆回転させる) auto alpha = 3.1416 / -angle; int offsetX = 320; int offsetY = 240; auto XZ = 0 * cos(alpha) - offsetY * sin(alpha); auto YZ = 0 * sin(alpha) + offsetY * cos(alpha); //回転させた線を描画する cv::line(image, cv::Point(offsetX, 0), cv::Point(offsetX + XZ, YZ), cv::Scalar(255, 255, 255), 10); cv::imshow("AudioBeamAngle", image); } void drawColorFrame() { // カラーデータを表示する cv::Mat colorImage(colorHeight, colorWidth, CV_8UC4, &colorBuffer[0]); cv::imshow("Color Image", colorImage); } }; void main() { try { KinectApp app; app.initialize(); app.run(); } catch (std::exception& ex) { std::cout << ex.what() << std::endl; } }

###試したこと
プログラミングしている環境は、visualstudio2015で行っています。構成プロパティのC/C++の追加のインクルードディレクトリに、$(KINECTSDK20_DIR)\incを、構成プロパティ|リンカー|追加のライブラリディレクトリに$(KINECTSDK20_DIR)\lib\x86を、構成プロパティ|リンカー|入力|追加の依存ファイルにKINECT20.libは追加済みです。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

OpenCVのリンクを設定していないのが問題です。

OpenCVがないのならインストールしてください。
もしあるのなら、『追加のライブラリディレクトリ』『追加の依存ファイル』にOpenCVに関する設定を書き込む必要があります。


インストールが終わりましたら、次の設定をお忘れなく。

  • 環境変数pathへの登録

OpenCVの〇〇.dllのあるディレクトリを追加してください。要再起動。
私の環境の場合、OpenCV310\x64\vc14\binでした。

  • 『追加のインクルードディレクトリ』の設定追加

opencv.hppが入っている、opencv2ディレクトリのあるディレクトリを追加(回りくどい)。
私の環境の場合、C:\OpenCV310\includeでした。

  • 『追加のライブラリディレクトリ』の設定追加

OpenCVの〇〇.libのあるディレクトリを追加してください。
私の環境の場合、C:\OpenCV310\x64\vc14\libでした。

  • 『追加の依存ファイル』の設定追加

とりあえず次を設定しておいてください。後は適宜エラーを見つつ追加すればよいです。
opencv_core310.lib opencv_highgui310.lib

  • 実行の設定 (任意)

x64のリリースモードに合わせた方が色々楽です。


『追加の依存ファイル』が不足している場合、次のサイトを確認して情報を集めてください。

『3.1モジュール構成』を参考にしてください。少し古いので、適宜読み替える必要があります。

少々読みづらいですが、情報が網羅されています。

cv::lineの場合、opencv_imgproc310.libを追加する必要があることがわかります。

投稿2017/08/04 07:37

編集2017/08/09 02:34
LouiS0616

総合スコア35660

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

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

LouiS0616

2017/08/04 07:46

よく考えたら、コンパイルエラーが生じない時点で、おそらくOpenCVはインストール済みですね。 バージョンはどれをお使いでしょうか?
kana_yamamoto

2017/08/04 09:21

素早い回答ありがとうございます。 2.4.10を使っていましたが、今3.1をダウンロードしています。
kana_yamamoto

2017/08/09 01:29

上記に書かれていることを全て行なった結果、デバックした際に、「Kinect.exe-システムエラー opencv_highgui310d.dllが見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題を解決できる場合があります。」 と出て来てデバックできません。 opencv_core310d.dllにも同様のエラーが発生しています。 .dllへのパスは通してあります。また、追加の依存ファイルにもdllファイルは追加してあります。 お返事待っています。
LouiS0616

2017/08/09 02:01

Kinect.exeは、質問者様の書いたコードの実行ファイルでしょうか? もしそうなら、リリースモードでビルドするようにして、opencv_core310.libとopencv_highgui310.libを追加の依存ファイルに登録してください。 OpenCVのlibは、デバッグモードではopencv_(モジュール名)d.libを、リリースモードではopencv_(モジュール名).libを用います。
kana_yamamoto

2017/08/09 02:21

ありがとうございます。回答者様のおかげでそのエラーは解決しました! しかし、新しいエラーが出てしまいました。 Void draw()内に記載してある、cv::lineが未解決のシンボルエラーを起こしてしまいました。これはなぜなんでしょうか?
LouiS0616

2017/08/09 02:23

依存ファイルの不足ですね。 参照すべき情報を追記しておきます。
kana_yamamoto

2017/08/09 05:31

無事にコンパイルできるようになりました! まだわからない点があるのですがそれはまた別に質問をしてみます! 丁寧に回答していただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問