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

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

ただいまの
回答率

89.09%

C++/CLI Windowsフォームアプリケーションの画像表示

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,063

hsgru3

score 22

前提・実現したいこと

C++/CLI、opencvを用いてボタンを押すと画像をpictureboxに表示させるwindowsフォームアプリケーションの作成をしています。
imreadで画像を読み込んでビットマップにかえて画像を表示させようとしています。
エラーなく実行はできるのですがフォームのボタンを押すと「ハンドルされていない例外が発生しました。使用されたパラメーターが有効ではありません。」というウィンドウが表示されてしまいます。
何か案があれば教えていただきたいです。

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

イメージ説明

Just-In-Time (JIT) デバッグを呼び出すための詳細については、
ダイアログ ボックスではなく、このメッセージの最後を参照してください。

************** 例外テキスト **************
System.ArgumentException: 使用されたパラメーターが有効ではありません。
   場所 System.Drawing.Bitmap..ctor(Int32 width, Int32 height, Int32 stride, PixelFormat format, IntPtr scan0)
   場所 test.MyForm.drawImage(PictureBox pic, Mat* mat) 場所 c:\users\aselab\documents\visual studio 2015\projects\test\test\myform.h:行 112
   場所 test.MyForm.button1_Click(Object sender, EventArgs e) 場所 c:\users\aselab\documents\visual studio 2015\projects\test\test\myform.h:行 121
   場所 System.Windows.Forms.Control.OnClick(EventArgs e)
   場所 System.Windows.Forms.Button.OnClick(EventArgs e)
   場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   場所 System.Windows.Forms.Control.WndProc(Message& m)
   場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   場所 System.Windows.Forms.Button.WndProc(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** 読み込まれたアセンブリ **************
mscorlib
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3324.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
test
    アセンブリ バージョン:0.0.0.0
    Win32 バージョン:
    コードベース:file:///c:/users/aselab/documents/visual%20studio%202015/Projects/test/Debug/test.exe
----------------------------------------
System
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3353.0 built by: NET472REL1LAST_B
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3324.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3190.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3324.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Core
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3324.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Xml
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3190.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Drawing.resources
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3190.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing.resources/v4.0_4.0.0.0_ja_b03f5f7f11d50a3a/System.Drawing.resources.dll
----------------------------------------
System.Windows.Forms.resources
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3190.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_ja_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
mscorlib.resources
    アセンブリ バージョン:4.0.0.0
    Win32 バージョン:4.7.3190.0 built by: NET472REL1LAST_C
    コードベース:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_ja_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------

************** JIT デバッグ **************
Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、
またはコンピューター (machine.config) の構成ファイルの jitDebugging 
値を system.windows.forms セクションで設定しなければなりません。
アプリケーションはまた、デバッグを有効にしてコンパイルされなければ
なりません。

例:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、
ハンドルされていない例外はすべてコンピューターに登録された
JIT デバッガーに設定されなければなりません。

該当のソースコード

MyForm.h

#pragma once

#include "opencv2\opencv.hpp"

using namespace cv;



namespace test {

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

    protected:
        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        ~MyForm()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::PictureBox^  pictureBox1;
    private: System::Windows::Forms::Button^  button1;
    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());
            this->button1 = (gcnew System::Windows::Forms::Button());
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->BeginInit();
            this->SuspendLayout();
            // 
            // pictureBox1
            // 
            this->pictureBox1->Location = System::Drawing::Point(11, 12);
            this->pictureBox1->Name = L"pictureBox1";
            this->pictureBox1->Size = System::Drawing::Size(225, 241);
            this->pictureBox1->TabIndex = 0;
            this->pictureBox1->TabStop = false;
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(242, 128);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(75, 23);
            this->button1->TabIndex = 1;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
            // 
            // MyForm
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(323, 261);
            this->Controls->Add(this->button1);
            this->Controls->Add(this->pictureBox1);
            this->Name = L"MyForm";
            this->Text = L"MyForm";
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->EndInit();
            this->ResumeLayout(false);

        }
#pragma endregion

    private: System::Void drawImage(PictureBox^ pic, 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;
    }

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        Mat input = imread("C:\\Users\\aselab\\Desktop\\itigo.jpg", IMREAD_UNCHANGED);
        drawImage(pictureBox1, input);
    }
    };
}

Source.cpp

#include "MyForm.h"

using namespace test;

[STAThreadAttribute]
int main() {
    MyForm ^ui = gcnew MyForm();
    ui->ShowDialog();
    return 0;
}

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

Windows 10
opencv 3.4.0

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

drawImage(pictureBox1,input);の上の行に
cvtColor(input,input,CV_BGR2BGRA);で問題なく動きました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 89.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる