プロが教えるわが家の防犯対策術!

うまく直すことができませんでした。助言をお願いいたします。

Microsoft Visual Studio Professional 2013
Vewsion 12.0.30501.00 Update 2
(C) 2013 Microsoft Corporation.
All rights reserved.
ーーーーーーーー
・Kinect for Windows SDK v2をインストール
新しいプロジェクト→Win32 コンソールアプリケーション→コンソールアプリケーション(空のプロジェクト チェック入れる)
プロジェクトを右クリック→追加→新しい項目→C++ファイル
プロジェクトを右クリック→プロパティ→「構成」を「すべての構成」に変更→「構成プロパティ|C/C++|追加のインクルードファイル」に「$(KINECTSDK20_DIR)\inc」を追加
「構成プロパティ|リンカー|追加のライブラリディレクトリ」に「$(KINECTSDK20_DIR)\lib\x86」を追加
「構成プロパティ|リンカー|追加の依存ファイル」に「Kinect20.lib」
プロジェクトを右クリック→NuGetパッケージの管理…→opencv(Itseez)を追加
ーーーーーーーーー
プログラム
#include <iostream>
#include <sstream>

#include <Kinect.h>

#include <opencv2\opencv.hpp>

#include <atlbase.h>

#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 //クラス宣言
{
public:
//以下関数
void initialize()
{
//Kinect SDK//下10行分追加
CComPtr<IKinectSensor>kinect = nullptr;
CComPtr<IColorFrameReader>colorFrameReader = nullptr;

int colorWidth;
int colorHeight;
unsigned int colorBytesPerPixel;

ColorImageFormat colorFormat = ColorImageFormat::ColorImageFormat_Bgra;
//表示部分
std::vector<BYTE>colorBuffer;//上10行分追加

//デフォルトのKinectを取得する
IKinectSensor* Kinect = nullptr;
ERROR_CHECK(::GetDefaultKinectSensor(&Kinect));
ERROR_CHECK(Kinect->Open());
BOOLEAN isOpen = false;
ERROR_CHECK(Kinect->get_IsOpen(&isOpen));
if (!isOpen){
throw std::runtime_error("Kinectが開けません");


//カラーリーダーを取得する
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);
}
}


void run()
{
while (1){
//update();
//draw();

auto key = cv::waitKey(10);
if (key == 'q'){
break;
}
}
}

//データの更新処理
void update()
{
updateColorFrame();
}
//カラーフレームの更新
void updateColorFrame()
{
//フレームを取得する
CComPtr<IColorFrame>colorFrame;
CComPtr<IColorFrameReader>colorFrameReader = nullptr;//追加
auto ret = colorFrameReader->AcquireLatestFrame(&colorFrame);
if (FAILED(ret)){
return;
}

//BGRAの形式でデータを取得する
std::vector<BYTE>colorBuffer;//追加
ERROR_CHECK(colorFrame->CopyConvertedFrameDataToArray(colorBuffer.size(), &colorBuffer[0], ColorImageFormat_Bgra));
}

void draw()
{
drawColorFrame();
}
//データの表示処理
void drawColorFrame()
{
//カラーデータを表示する
int colorWidth;
int colorHeight;

ColorImageFormat colorFormat = ColorImageFormat::ColorImageFormat_Bgra;
//表示部分
std::vector<BYTE>colorBuffer;//上10行分追加
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;
}
}

ーーーーーーーー
エラー内容
エラー 2 error LNK1120: 1 件の未解決の外部参照 C:\Users\tsuruno\Documents\Visual Studio 2013\Projects\Kinectv2ver2\Debug\Kinectv2ver2.exe 1 1 Kinectv2ver2
エラー 1 error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 ___tmainCRTStartup で参照されました。 C:\Users\tsuruno\Documents\Visual Studio 2013\Projects\Kinectv2ver2\Kinectv2ver2\MSVCRTD.lib(wcrtexew.obj) Kinectv2ver2
ーーーーーーーー
参考文献は、
主:Kinect for Windows SDK プログラミング v2センサー対応版(中村薫 他 著)
及び
http://www.buildinsider.net/small/kinectv2cpp
です。色々エラーを起こしては直していたのですが、私では解決しきれない問題にぶつかってしまいました。どうにか直せないでしょうか?よろしくお願いします。

A 回答 (2件)

コード上にあるのは


>void main()
なのですから、リンカーがWinMainを要求している時点でなにか間違っています。
# たぶん/SUBSYSTEM:CONSOLEでないとダメかと。

で、文字コードセットの影響もあるかと思われますので、「マルチバイト文字セットを使用する」にした方がいいかと。
「unicode文字セットを使用する」の場合はwmain()ですかね。
https://msdn.microsoft.com/ja-jp/library/6wd819w …
あとは…void main()ではなく上記のURLの通りint main()にする…とか。
# まぁ、現状のWinMain()要求ではダメなんですけど。
    • good
    • 0
この回答へのお礼

遅くなりましたが、ありがとうございました。もう何度か立ち上げたらLINK2019のエラーは出なくなりビルドで正常終了するようになりました。
また、今度は一度目のビルドは成功するのですが、デバック開始後にメモリが破壊される旨のエラーが表示され、その後もう一度ビルドしたところ以下の一文しか表示されず原因よくわかりません。
========== ビルド: 0 正常終了、0 失敗、1 更新不要、0 スキップ ==========
今振り返ってもよくわかりませんが、たぶんwhile文の中にあるのではと疑っています。ソースコード上の何かがおかしいんだということはわかりました。

改めて、ネット上のサンプルコードを軸にしてみたら映像が表示されるようになったのでとりあえず原因究明に努めます。改めてありがとうございました。
またなにかありましたら、よろしくお願いします。

お礼日時:2016/06/17 21:48

>エラー 1 error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 ___tmainCRTStartup で参照されました。



WinMain()がねぇよ。
といわれています。

>新しいプロジェクト→Win32 コンソールアプリケーション→コンソールアプリケーション(空のプロジェクト チェック入れる)

ちゃんとコンソール選んでいなかった…という可能性でしょうかね。
もう一度プロジェクトの作成からやり直してみる。というのでどうでしょうかね。
記述したソースコードは「既存のファイル」で取り込めるでしょう。

プロジェクトの設定で、C/C++のプリプロセッサにあるプリプロセッサの定義とリンカーのシステムにあるサブシステムを変更することで切り替えられる…とは思いますけど。
    • good
    • 0
この回答へのお礼

さっそくのお答えありがとうございます。

うーん、以下のurlを参考にリンカーのサブシステムはWindows (/SUBSYSTEM:WINDOWS)とコンソール (/SUBSYSTEM:CONSOLE)を試してみましたが駄目でした。#include <tchar.h>の一文を冒頭に書いてみても変わらずです。
http://nononnno.blog.fc2.com/blog-entry-15.html
ご指摘の通り、立ち上がりの設定の誤りを考慮して、何度か作り直しもしてはいたのですが結果は同じでした。

お礼日時:2016/06/14 01:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!