1

A Forge.NET ライブラリを使用して c# で Web カメラの作成に取り組んでおり、Web カメラを開いて rubix キューブの写真を撮りたいと考えています。画像ボックスを使用してウェブカメラ フレームを処理し、画像ボックス内に 3*3 のグリッドを作成したいと考えました。

動作しますが、実行の 3 秒後に例外が生成されます。

g = Graphics.FromImage(videoBox.Image);  ----> InvalidOperationException

これが私のコードです:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;

namespace WebcamTester
{
    public partial class Form1 : Form
    {
        public Form1()
        {
        InitializeComponent();
        }

    private FilterInfoCollection webcam;
    private VideoCaptureDevice cam;
    private Bitmap bit = new Bitmap(640, 480);
    private Graphics g;
    private int cellsNumber;
    private int cellSize;

    private void Form1_Load(object sender, EventArgs e)
    {
        webcam = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        foreach (FilterInfo VideoCaptureDevice in webcam)
        {
            comboBox1.Items.Add(VideoCaptureDevice.Name);
        }
        comboBox1.SelectedIndex = 0;

        cam = new VideoCaptureDevice(webcam[comboBox1.SelectedIndex].MonikerString);
        cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
        cam.Start();

    }


    void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        bit = (Bitmap)eventArgs.Frame.Clone();
        videoBox.Image = bit;
        g = Graphics.FromImage(videoBox.Image);
        Pen p = new Pen(Color.Black, 2);

        cellSize = 100;
        cellsNumber = 4;

        for (int y = 0; y <= cellsNumber; ++y)
        {
            g.DrawLine(p, 0, y * cellSize, cellsNumber * cellSize, y * cellSize);
        }

        for (int x = 0; x <= cellsNumber; ++x)
        {
            g.DrawLine(p, x * cellSize, 0, x * cellSize, cellsNumber * cellSize);
        }

    }

    private void button2_Click(object sender, EventArgs e)
    {
        saveFileDialog1.InitialDirectory = @"d:\picture";
        cam.Stop();
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {

            videoBox.Image.Save(saveFileDialog1.FileName);
            cam.Start();
        }

        else
            cam.Start();
    }
}

}

4

2 に答える 2

0

この例外は、「オブジェクトは現在他の場所で使用されています。」に関連しています。おそらく、リリースされていないためです...

試してみてください:

    (...)

    for (int x = 0; x <= cellsNumber; ++x)
    {
        g.DrawLine(p, x * cellSize, 0, x * cellSize, cellsNumber * cellSize);
    }
    g.Dispose();

}
于 2013-02-09T23:04:32.543 に答える
0

これで解決しない場合は、使用してみてください

private object Lock = new object();

  lock (Lock) {

      using (var g = Graphics.FromImage(videoBox.Image) {  

        Pen p = new Pen(Color.Black, 2);

        cellSize = 100;
        cellsNumber = 4;

        for (int y = 0; y <= cellsNumber; ++y)
        {
            g.DrawLine(p, 0, y * cellSize, cellsNumber * cellSize, y * cellSize);
        }

        for (int x = 0; x <= cellsNumber; ++x)
        {
            g.DrawLine(p, x * cellSize, 0, x * cellSize, cellsNumber * cellSize);
        }

        g.Dispose();

     }        

  }
于 2013-02-09T23:14:49.743 に答える