0

私は C# Windows フォームでプログラムを作成しています データベースに接続された 2 つのデータグリッド ビューや、PC に直接接続されたカメラなど、フォームにはたくさんの機能があります カメラ デバイスに接続するために AForge dll リファレンスを使用しています チュートリアルを見つけましたYouTubeで、それは私にとって完璧に機能します。前に述べたように、そのカメラを含む 1 つの形式のプログラムが多すぎるため、カメラのサイズを小さな解像度に変更する必要があることが判明したため、ポップアップ ボタンを作成することにしましたフォームのボタンをクリックしたときに、より広い解像度を表示する必要があります。

これは私のカメラのコードです。

    //Camera

    // get the devices name
    private void getCamList()
    {
        try
        {
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            comboBox1.Items.Clear();
            if (videoDevices.Count == 0)
                throw new ApplicationException();

            DeviceExist = true;
            foreach (FilterInfo device in videoDevices)
            {
                comboBox1.Items.Add(device.Name);
            }
            comboBox1.SelectedIndex = 0; //make dafault to first cam
        }
        catch (ApplicationException)
        {
            DeviceExist = false;
            comboBox1.Items.Add("No capture device on your system");
        }
    }

    //refresh button
    private void refresh_Click(object sender, EventArgs e)
    {
        getCamList();
    }

    //toggle start and stop button
    private void start_Click(object sender, EventArgs e)
    {
        if (start.Text == "&Start")
        {
            if (DeviceExist)
            {
                videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
                videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
                CloseVideoSource();
                videoSource.DesiredFrameSize = new Size(160, 120);
                //videoSource.DesiredFrameRate = 10;
                videoSource.Start();
                lblCam.Text = "Device running...";
                start.Text = "&Stop";
            }
            else
            {
                lblCam.Text = "Error: No Device selected.";
            }
        }
        else
        {
            if (videoSource.IsRunning)
            {
                CloseVideoSource();
                lblCam.Text = "Device stopped.";
                start.Text = "&Start";
            }
        }
    }

    //eventhandler if new frame is ready
    private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Bitmap img = (Bitmap)eventArgs.Frame.Clone();
        //do processing here
        pictureBox1.Image = img;
    }

    //close the device safely
    private void CloseVideoSource()
    {
        if (!(videoSource == null))
            if (videoSource.IsRunning)
            {
                videoSource.SignalToStop();
                videoSource = null;
            }
    }

    //prevent sudden close while device is running
    private void Form1_FormClosed(object sender, FormClosingEventArgs e)
    {
        CloseVideoSource();
    }


} }

私が話していることをさらに理解していただくために、写真も掲載しました。 ここに画像の説明を入力 右下隅に表示されているように、そこにポップアップ ボタンがあります。別の方法を試してみましたが、残念なことに何も機能しませんでした。 . 何か案が?

4

1 に答える 1

0
  • 新しいフォームを作成する
  • このフォームに PictureBox を配置します
  • フォームに現在のフレームを初期化して取得するすべてのメソッドを追加します (現在の画像を提供する FrameChanged のようなイベントを提供する独自のクラスにリファクタリングする必要があります)。
  • フォームに次のようなメソッドを追加します
    public void ShowCamPopup(string deviceName)
    {
      InitializeDevice(string deviceName, int width, int height);
      this.Show();
      this.BringToTop();
    }
    

Cam との通信を独自のクラスにリファクタリングすることを検討する必要があります。これにより、コードの重複が減り、ソリューションの 1 つの位置でパフォーマンスの調整 (後で確実に必要になります) を実行できるようになります。

于 2013-04-30T13:19:11.743 に答える