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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

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

C++

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

Q&A

0回答

665閲覧

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

hsgru3

総合スコア22

Visual Studio

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

C++

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

0グッド

1クリップ

投稿2019/03/25 05:01

前提・実現したいこと

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

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

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

該当のソースコード

C++

1#pragma once 2 3#include <iostream> 4#include <time.h> 5#include <fstream> 6#include <vector> 7#include "string.h" 8#include "opencv2\opencv.hpp" 9#include "pxcsensemanager.h" 10#include "PXCProjection.h" 11#include "aufd_v.1.3.h" 12 13PXCSenseManager *senseManager = 0; 14 15//カラー画像 16cv::Mat colorImage; 17 18//座標変換インスタンス 19PXCProjection *projection = nullptr; 20 21//デプス画像の距離情報格納バッファ 22std::vector<unsigned short> depthBuffer; 23 24//カラー画像の幅、高さ、解像度 25const int COLOR_WIDTH = 640; 26const int COLOR_HEIGHT = 480; 27const int COLOR_FPS = 30; 28 29//デプス画像の幅、高さ、解像度 30const int DEPTH_WIDTH = 640; 31const int DEPTH_HEIGHT = 480; 32const int DEPTH_FPS = 30; 33 34namespace USPver3 { 35 36 using namespace System; 37 using namespace System::ComponentModel; 38 using namespace System::Collections; 39 using namespace System::Windows::Forms; 40 using namespace System::Data; 41 using namespace System::Drawing; 42 43 /// <summary> 44 /// USP の概要 45 /// </summary> 46 public ref class USP : public System::Windows::Forms::Form 47 { 48 public: 49 USP(void) 50 { 51 InitializeComponent(); 52 // 53 //TODO: ここにコンストラクター コードを追加します 54 // 55 } 56 57 protected: 58 /// <summary> 59 /// 使用中のリソースをすべてクリーンアップします。 60 /// </summary> 61 ~USP() 62 { 63 if (components) 64 { 65 delete components; 66 } 67 } 68 private: System::Windows::Forms::PictureBox^ pictureBox1; 69 70 protected: 71 72 private: 73 /// <summary> 74 /// 必要なデザイナー変数です。 75 /// </summary> 76 System::ComponentModel::Container ^components; 77 78#pragma region Windows Form Designer generated code 79 /// <summary> 80 /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 81 /// コード エディターで変更しないでください。 82 /// </summary> 83 void InitializeComponent(void) 84 { 85 this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox()); 86 (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->BeginInit(); 87 this->SuspendLayout(); 88 // 89 // pictureBox1 90 // 91 this->pictureBox1->Location = System::Drawing::Point(12, 12); 92 this->pictureBox1->Name = L"pictureBox1"; 93 this->pictureBox1->Size = System::Drawing::Size(735, 416); 94 this->pictureBox1->TabIndex = 0; 95 this->pictureBox1->TabStop = false; 96 // 97 // USP 98 // 99 this->AutoScaleDimensions = System::Drawing::SizeF(6, 12); 100 this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 101 this->ClientSize = System::Drawing::Size(764, 440); 102 this->Controls->Add(this->pictureBox1); 103 this->Name = L"USP"; 104 this->Text = L"USP"; 105 (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->EndInit(); 106 this->ResumeLayout(false); 107 108 } 109#pragma endregion 110 111 // 初期化 112 private: System::Void USP_Load(System::Object^ sender, System::EventArgs^ e) 113 { 114 // SenseManagerを生成する 115 senseManager = PXCSenseManager::CreateInstance(); 116 if (senseManager == 0) { 117 throw std::runtime_error("SenseManagerの生成に失敗しました"); 118 } 119 120 // カラーストリームを有効にする 121 auto sts = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_COLOR, 122 COLOR_WIDTH, COLOR_HEIGHT, COLOR_FPS); 123 if (sts < PXC_STATUS_NO_ERROR) { 124 throw std::runtime_error("カラーストリームの有効化に失敗しました"); 125 } 126 127 // Depthストリームを有効にする 128 sts = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_DEPTH, 129 DEPTH_WIDTH, DEPTH_HEIGHT, DEPTH_FPS); 130 if (sts < PXC_STATUS_NO_ERROR) { 131 throw std::runtime_error("Depthストリームの有効化に失敗しました"); 132 } 133 134 // パイプラインを初期化する 135 sts = senseManager->Init(); 136 if (sts < PXC_STATUS_NO_ERROR) { 137 throw std::runtime_error("パイプラインの初期化に失敗しました"); 138 } 139 140 // デバイスを取得する 141 auto device = senseManager->QueryCaptureManager()->QueryDevice(); 142 143 // 座標変換オブジェクトを作成 144 projection = device->CreateProjection(); 145 146 // depthBufferの作成 147 depthBuffer.resize(DEPTH_WIDTH * DEPTH_HEIGHT); 148 149 } 150 151 // フレームを更新する 152 private: System::Void updateFrame() 153 { 154 // フレームを取得する 155 pxcStatus sts = senseManager->AcquireFrame(false); 156 if (sts < PXC_STATUS_NO_ERROR) { 157 return; 158 } 159 160 // フレームデータを取得する 161 const PXCCapture::Sample *sample = senseManager->QuerySample(); 162 if (sample) { 163 // 各データを表示する 164 updateColorImage(sample->color); 165 } 166 167 // フレームを解放する 168 senseManager->ReleaseFrame(); 169 } 170 171 // カラー画像を更新する 172 private: System::Void updateColorImage(PXCImage* colorFrame) 173 { 174 if (colorFrame == 0) { 175 return; 176 } 177 178 // データを取得する 179 PXCImage::ImageData data; 180 pxcStatus sts = colorFrame->AcquireAccess( 181 PXCImage::Access::ACCESS_READ, 182 PXCImage::PixelFormat::PIXEL_FORMAT_RGB32, &data); 183 if (sts < PXC_STATUS_NO_ERROR) { 184 throw std::runtime_error("カラー画像の取得に失敗"); 185 } 186 187 // データをコピーする 188 PXCImage::ImageInfo info = colorFrame->QueryInfo(); 189 190 colorImage = cv::Mat(info.height, info.width, CV_8UC4); 191 memcpy(colorImage.data, data.planes[0], data.pitches[0] * info.height); 192 193 // データを解放する 194 colorFrame->ReleaseAccess(&data); 195 196 //描画 197 drawImage(pictureBox1, colorImage); 198 } 199 //描画 200 private: System::Void drawImage(PictureBox^ pic, cv::Mat mat) { 201 if ((pic->Image == nullptr) || (pic->Width != mat.cols) 202 || (pic->Height != mat.rows)) { 203 pic->Width = mat.cols; 204 pic->Height = mat.rows; 205 Bitmap^ bmpPicBox = gcnew Bitmap(pic->Width, pic->Height); 206 pic->Image = bmpPicBox; 207 } 208 Graphics^g = Graphics::FromImage(pic->Image); 209 Bitmap^ bmp = gcnew Bitmap(mat.cols, mat.rows, mat.step, 210 System::Drawing::Imaging::PixelFormat::Format32bppRgb, IntPtr(mat.data)); 211 g->DrawImage(bmp, 0, 0, mat.cols, mat.rows); 212 pic->Refresh(); 213 delete g; 214 } 215 }; 216} 217

試したこと

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

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

Visual Studio Community 2015
Windows 10

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/03/25 12:50 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問