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

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

ただいまの
回答率

90.35%

  • C++

    3759questions

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

  • OpenCV

    1228questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • Kinect

    95questions

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

kinectからカラー画像の取得

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 225

noa_remiria

score 3

 前提・実現したいこと

kinectを使ったカラー画像の取得するためにサンプルコードを動かしたい。
下記のサンプルコード使用しました。
(https://github.com/K4W2-Book/K4W2-Book/blob/master/C%2B%2B(Native)/01_Color/KinectV2-Color-01/KinectV2/main.cpp)

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

1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\ucrt\stdio.h(208): note: 'fopen' の宣言を確認してください
C4996    . Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    kinect color    d:\vsc++2017\opencv\build\include\opencv2\flann\logger.h

 該当のソースコード

#include <iostream>
#include <sstream>
#include <map>

#include <Kinect.h>
#include <opencv2\opencv.hpp>

#include <atlbase.h>

// 次のように使います
// ERROR_CHECK( ::GetDefaultKinectSensor( &kinect ) );
// 書籍での解説のためにマクロにしています。実際には展開した形で使うことを検討してください。
#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:

    // Kinect SDK
    CComPtr<IKinectSensor> kinect = nullptr;

    CComPtr<IColorFrameReader> colorFrameReader = nullptr;

    int colorWidth;
    int colorHeight;
    unsigned int colorBytesPerPixel;

    ColorImageFormat colorFormat = ColorImageFormat::ColorImageFormat_Bgra;

    // 表示部分
    std::vector<BYTE> colorBuffer;

public:

    ~KinectApp()
    {
        // Kinectの動作を終了する
        if (kinect != nullptr) {
            kinect->Close();
        }
    }

    // 初期化
    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> defaultColorFrameDescription;
        ERROR_CHECK(colorFrameSource->get_FrameDescription(&defaultColorFrameDescription));
        ERROR_CHECK(defaultColorFrameDescription->get_Width(&colorWidth));
        ERROR_CHECK(defaultColorFrameDescription->get_Height(&colorHeight));
        ERROR_CHECK(defaultColorFrameDescription->get_BytesPerPixel(&colorBytesPerPixel));
        std::cout << "default : " << colorWidth << ", " << colorHeight << ", " << colorBytesPerPixel << std::endl;

        // カラー画像のサイズを取得する
        CComPtr<IFrameDescription> colorFrameDescription;
        ERROR_CHECK(colorFrameSource->CreateFrameDescription(
            colorFormat, &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;
            }
        }
    }

private:

    // データの更新処理
    void update()
    {
        updateColorFrame();
    }

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

        // 指定の形式でデータを取得する
        ERROR_CHECK(colorFrame->CopyConvertedFrameDataToArray(
            colorBuffer.size(), &colorBuffer[0], colorFormat));
    }

    // データの表示処理
    void draw()
    {
        drawColorFrame();
    }

    // カラーデータの表示処理
    void drawColorFrame()
    {
#if 0
        // カラーデータを表示する
        cv::Mat colorImage(colorHeight, colorWidth, CV_8UC4, &colorBuffer[0]);
        cv::imshow("Color Image", colorImage);
#else
        cv::Mat colorImage(colorHeight, colorWidth, CV_8UC4, &colorBuffer[0]);
        cv::Mat harfImage;
        cv::resize(colorImage, harfImage, cv::Size(), 0.5, 0.5);
        cv::imshow("Harf Image", harfImage);
#endif
    }
};

void main()
{
    try {
        KinectApp app;
        app.initialize();
        app.run();
    }
    catch (std::exception& ex) {
        std::cout << ex.what() << std::endl;
    }
};

 試したこと

パッケージに問題があると思いopencvをNuGetのパッケージの2.4.11をopencvの公式サイトから最新の3.4.1に変えたり、x84からx64に変えて
試してみたのですが、exeファイルが作成されず決まって上記のようなエラーメッセージが出てしまいます。

 補足情報(FW/ツールのバージョンなど)

Visual Studio 2017 ,opencv3.4.1 , kinect V2 for Windows , kinect SDK v2.0_1409

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Visual Studio(以下VSと略す) の警告です。
回避方法は
①#pragma warning(disable:4996)
もしくは
②#define _CRT_SECURE_NO_WARNINGS
を#include <stdio.h>の前に書く。
それかVSのプロジェクトのメニューで
①「プロジェクト」→「(プロジェクト名)のプロパティ」
②構成の部分を「全ての構成」にして
③「構成プロパティ」→「C/C++」→「詳細」→「指定の警告を無効にする」で"4669”を指定。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 12:10

    ありがとうございました。4669のエラーメッセージが表示され無くなりました!

    キャンセル

同じタグがついた質問を見る

  • C++

    3759questions

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

  • OpenCV

    1228questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • Kinect

    95questions

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