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

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

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

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1231閲覧

範囲for文がtimer1_Tickで使えるがbutton1_Clickで使えない。

hsgru3

総合スコア22

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/05/10 02:12

編集2019/05/21 12:42

前提・実現したいこと

c++で動的配列の構造体内の変数のアクセスのしかたがわからず困っています。
解決策、アドバイスをいただきたいです。

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

c++/CLRでWindowsフォームアプリケーションの作成をしています。
以下のように範囲for文を使って動的配列の構造体の変数にアクセスし処理を行っています。

for (auto &i : result_vec) { 処理 }

この関数が以下のソースコード内でtimer1_Tickの中では正常に動作しますがbutton1_Clickの中では動作せず困っています。

該当のソースコード

USP.h

#include <iostream> #include <time.h> #include <fstream> #include <vector> #include "yolo_v2_class.hpp" #include "opencv2\opencv.hpp" #include "pxcsensemanager.h" #include "PXCProjection.h" #include "aufd_v.1.3.h" using namespace cv; using namespace std; //カラー画像(処理用、保存用) Mat src, dst; //座標変換インスタンス PXCProjection *projection = nullptr; const PXCCapture::Sample *sample; PXCSenseManager *senseManager = 0; //デプス画像の距離情報格納バッファ vector<unsigned short> depthBuffer; 変数の設定 namespace UI { 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: System::Windows::Forms::Timer^ timer1; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::Button^ button3; private: System::Windows::Forms::Button^ button4; private: System::Windows::Forms::ComboBox^ comboBox1; private: System::Windows::Forms::ComboBox^ comboBox2; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Label^ label2; private: System::ComponentModel::IContainer^ components; private: /// <summary> /// 必要なデザイナー変数です。 /// </summary> #pragma region Windows Form Designer generated code /// <summary> /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// </summary> void InitializeComponent(void) { ~~~~~省略~~~~~ #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); // 超音波集束装置の初期化 hDevice = OpenDevice(); DummyOutput(hDevice); StopOutput(hDevice); //タイマーの初期化 timer1->Interval = 33; timer1->Enabled = true; //設定値の呼び出し FILE *fp; SaveData Data; fp = fopen("savedata.dat", "rb"); fread(&Data, sizeof(Data), 1, fp); fclose(fp); Frequency = Data.F; Time = Data.T; comboBox1->SelectedIndex = Frequency/10; comboBox2->SelectedIndex = Time - 1; } //実行 private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { //描画 captureImage(); //設定値の反映 Int32::TryParse(comboBox1->SelectedItem->ToString(), Frequency); Int32::TryParse(comboBox2->SelectedItem->ToString(), Time); } //フレーム取得 private: System::Void captureImage() { // フレームを取得する pxcStatus sts = senseManager->AcquireFrame(false); if (sts < PXC_STATUS_NO_ERROR) { return; } // Colorフレームデータを取得する sample = senseManager->QuerySample(); if (sample) { // 各データを表示する updateColorImage(sample->color); } // Depthフレームデータを取得する if (sample) { // 各データを表示する updateDepthData(sample->depth); } // フレームを解放する senseManager->ReleaseFrame(); //保存用の画像 dst = src.clone(); //イチゴ花検出 std::vector<bbox_t> result_vec = detector.detect(dst); //花の領域表示 draw_boxes(dst, result_vec); //花の座標表示 //show_result(result_vec); //描画 drawImage(pictureBox1, dst); } //描画 private: System::Void drawImage(PictureBox^ pic, Mat mat) { ~~~~~~~省略~~~~~~ } //花の領域表示 private: System::Void draw_boxes(cv::Mat mat_img, std::vector<bbox_t> result_vec) { for (auto &i : result_vec) { rectangle(mat_img, Rect(i.x, i.y, i.w, i.h), Scalar(50, 200, 50), 3); circle(mat_img, cv::Point(i.x+i.w/2, i.y+i.h/2), 5, Scalar(50, 200, 50), -1); } } //花の座標表示 private: System::Void show_result(std::vector<bbox_t> result_vec) { for (auto &i : result_vec) { int X, Y, Z; cv::Point point = { (int)(i.x + i.w / 2), (int)(i.y + i.h / 2) }; ColorToDevice(point, &X, &Y, &Z); cout << "(" << X << "," << Y << "," << Z << ") prob = " << (int)(i.prob * 100) << "%" << "(" << point.x << "," << point.y <<")" << endl; } } //フレーム更新(カラー) private: System::Void updateColorImage(PXCImage* colorFrame) { ~~~~~~~~省略~~~ } //フレーム更新(距離) private: System::Void updateDepthData(PXCImage* depthFrame) { ~~~~~~省略~~~~ } //カラー座標を超音波装置座標に変換する private: System::Void ColorToDevice(cv::Point point, int *dpointx, int *dpointy, int *dpointz) { ~~~~~~~~省略~~~~~ } //ボタン1 加振開始 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { //イチゴ花検出 std::vector<bbox_t> result_vec = detector.detect(dst); cv::Point point; //順番に加振 for (auto &i : result_vec) { int X, Y, Z; point = {(int)(i.x + i.w/ 2), (int)(i.y + i.h/ 2)}; ColorToDevice(point, &X, &Y, &Z); StartOutput(hDevice, X, Y, Z, P, Frequency); //出力 cout << "出力 (" << X << "," << Y << "," << Z << ")" << endl; Sleep(Time * 1000); StopOutput(hDevice); cout << "停止" << endl; } } //ボタン2 ストップ private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { ~~~~~省略~~~ } //ボタン3 画像の保存 private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { ~~~~~~~省略~~~~~~~~~~ } //ボタン4 設定値の保存 private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) { ~~~~~~~~~~省略~~~~~~ } //マウスイベント private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) { ~~~~~~~~~~~省略~~~~ } }; }

試したこと

範囲for文がtimer1_Tickで動作してbutton1_Clickで動作しない理由がよくわかりません。
別の書き方でもいいので教えていただきたいです。

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

Windows 10
visual studio community 2015
opencv 3.4.0

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

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

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

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

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

k.matsuda

2019/05/24 03:59

動作しないとは? ボタンクリックイベントは発生しているが、for文だけが実行されない ということですか?
k.matsuda

2019/05/24 04:08

あと、ボタンクリックしたときの各変数の値は確認してますか?
guest

回答1

0

//イチゴ花検出 std::vector<bbox_t> result_vec = detector.detect(colorImage);

上記にしっかりとアクセス出来ているかを調べてみてもらえますか?
同じクラス内でcaptureImageにアクセスしているポイントを洗い出せばわかると思いますが、2つ目のプログラムの最初の方が切れていますのでアドバイスを行うには少し情報が足りません。

投稿2019/05/10 08:54

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問