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

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

ただいまの
回答率

90.51%

  • C++

    4431questions

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

  • Visual Studio

    2359questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++ WindowsアプリケーションにおけるWebカメラの表示

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 184

hsgru3

score 4

前提・実現したいこと

C++でWebカメラのIntel RealSense F200の映像を表示するwindowsフォームアプリケーションの作成でつまずいています。
エラーなくプログラムの実行はできるのですがpictureboxに映像の表示ができません。
何か解決策があれば教えていただきたいです。

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

作成したwindowsフォームアプリケーションをデバックなしで開始したときにウィンドウは表示されるのですがpictureboxに画像が表示されないといった問題が発生しています。

該当のソースコード

#pragma once

#include <iostream>
#include <time.h>
#include <fstream>
#include <vector>
#include "string.h"
#include "opencv2\opencv.hpp"
#include "pxcsensemanager.h"
#include "PXCProjection.h"
#include "aufd_v.1.3.h"

PXCSenseManager *senseManager = 0;

//カラー画像
cv::Mat colorImage;

//座標変換インスタンス
PXCProjection *projection = nullptr;

//デプス画像の距離情報格納バッファ
std::vector<unsigned short> depthBuffer;

//カラー画像の幅、高さ、解像度
const int COLOR_WIDTH = 640;
const int COLOR_HEIGHT = 480;
const int COLOR_FPS = 30;

//デプス画像の幅、高さ、解像度
const int DEPTH_WIDTH = 640;
const int DEPTH_HEIGHT = 480;
const int DEPTH_FPS = 30;

namespace USPver3 {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// USP の概要
    /// </summary>
    public ref class USP : public System::Windows::Forms::Form
    {
    public:
        USP(void)
        {
            InitializeComponent();
            //
            //TODO: ここにコンストラクター コードを追加します
            //
        }

    protected:
        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        ~USP()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::PictureBox^  pictureBox1;

    protected:

    private:
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        void InitializeComponent(void)
        {
            this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->BeginInit();
            this->SuspendLayout();
            // 
            // pictureBox1
            // 
            this->pictureBox1->Location = System::Drawing::Point(12, 12);
            this->pictureBox1->Name = L"pictureBox1";
            this->pictureBox1->Size = System::Drawing::Size(735, 416);
            this->pictureBox1->TabIndex = 0;
            this->pictureBox1->TabStop = false;
            // 
            // USP
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(764, 440);
            this->Controls->Add(this->pictureBox1);
            this->Name = L"USP";
            this->Text = L"USP";
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->EndInit();
            this->ResumeLayout(false);

        }
#pragma endregion

        // 初期化
    private: System::Void USP_Load(System::Object^  sender, System::EventArgs^  e)
    {
        // SenseManagerを生成する
        senseManager = PXCSenseManager::CreateInstance();
        if (senseManager == 0) {
            throw std::runtime_error("SenseManagerの生成に失敗しました");
        }

        // カラーストリームを有効にする
        auto sts = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_COLOR,
            COLOR_WIDTH, COLOR_HEIGHT, COLOR_FPS);
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("カラーストリームの有効化に失敗しました");
        }

        // Depthストリームを有効にする
        sts = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_DEPTH,
            DEPTH_WIDTH, DEPTH_HEIGHT, DEPTH_FPS);
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("Depthストリームの有効化に失敗しました");
        }

        // パイプラインを初期化する
        sts = senseManager->Init();
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("パイプラインの初期化に失敗しました");
        }

        // デバイスを取得する
        auto device = senseManager->QueryCaptureManager()->QueryDevice();

        // 座標変換オブジェクトを作成
        projection = device->CreateProjection();

        // depthBufferの作成
        depthBuffer.resize(DEPTH_WIDTH * DEPTH_HEIGHT);

    }

             // フレームを更新する
    private: System::Void updateFrame()
    {
        // フレームを取得する
        pxcStatus sts = senseManager->AcquireFrame(false);
        if (sts < PXC_STATUS_NO_ERROR) {
            return;
        }

        // フレームデータを取得する
        const PXCCapture::Sample *sample = senseManager->QuerySample();
        if (sample) {
            // 各データを表示する
            updateColorImage(sample->color);
        }

        // フレームを解放する
        senseManager->ReleaseFrame();
    }

             // カラー画像を更新する
    private: System::Void updateColorImage(PXCImage* colorFrame)
    {
        if (colorFrame == 0) {
            return;
        }

        // データを取得する
        PXCImage::ImageData data;
        pxcStatus sts = colorFrame->AcquireAccess(
            PXCImage::Access::ACCESS_READ,
            PXCImage::PixelFormat::PIXEL_FORMAT_RGB32, &data);
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("カラー画像の取得に失敗");
        }

        // データをコピーする
        PXCImage::ImageInfo info = colorFrame->QueryInfo();

        colorImage = cv::Mat(info.height, info.width, CV_8UC4);
        memcpy(colorImage.data, data.planes[0], data.pitches[0] * info.height);

        // データを解放する
        colorFrame->ReleaseAccess(&data);

        //描画
        drawImage(pictureBox1, colorImage);
    }
             //描画
    private: System::Void drawImage(PictureBox^ pic, cv::Mat mat) {
        if ((pic->Image == nullptr) || (pic->Width != mat.cols)
            || (pic->Height != mat.rows)) {
            pic->Width = mat.cols;
            pic->Height = mat.rows;
            Bitmap^ bmpPicBox = gcnew Bitmap(pic->Width, pic->Height);
            pic->Image = bmpPicBox;
        }
        Graphics^g = Graphics::FromImage(pic->Image);
        Bitmap^ bmp = gcnew Bitmap(mat.cols, mat.rows, mat.step,
            System::Drawing::Imaging::PixelFormat::Format32bppRgb, IntPtr(mat.data));
        g->DrawImage(bmp, 0, 0, mat.cols, mat.rows);
        pic->Refresh();
        delete g;
    }
    };
}

試したこと

おそらくビットマップ形式の問題があるのかなと思っていますが、いまいちよくわかっていません。
またdrawImage関数はVisual Studio Community 2013で使用していた関数でそのときはうまく動作していました。

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

Visual Studio Community 2015
Windows 10

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • wwbQzhMkhhgEmhU

    2019/03/25 21:46 編集

    すみませんが、回答は持っていません。

    ただ、
    ・.Net Framework前提である点
    ・C++ではなくC++/CLIである点
    ・The Intel RealSense SDKを使用している点
    ・OpenCVを使用している点
    は明記すべきです。そしてこれらの環境を持っていない人は試すことすらできないことも考慮しましょう。
    万一全く同じH/Wを持っていて、なぜかC++/CLIを使って実装する人がいたとすれば回答もあると思いますが、多分いないと思うので、まずは
    (1)カメラからの入力が出来ている=静止画を何らかの画像形式でファイルに保存し、目視確認できること
    (2)任意の画像を.NETのpictureboxにC++/CLIで表示できること
    に分けてください。原因の切り分けも出来ていない状態で、レアな構成で普通しない方法のやり方を他人に聞いていても時間の無駄だと思います。(自力で解決できるなら)恐らく自分で調べた方がまだ早いでしょう。

    なお、普通の人はこう思ったとして、面倒なのでわざわざコメントに書いたりしません。
    よく考えてから質問しましょう。

    キャンセル

まだ回答がついていません

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

  • C++

    4431questions

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

  • Visual Studio

    2359questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。