Камера Macbook не выключается, и небольшая проблема с C# aforge

Я сделал проект, который мог отслеживать объекты, используя Visual Studio C#, используя платформу Aforge на MacBook Pro с bootcamp. Проблема в том, когда я запускаю код и закрываю его. Затем запустите его снова, код больше не будет отображать изображения на моей камере. Кроме того, зеленый индикатор на моей веб-камере продолжает гореть после остановки кода.

Моя вторая проблема заключается в том, что, когда я нажимаю "кнопку отслеживания объекта" и применяю фильтр к изображениям, по некоторым причинам он применяет фильтр к двум графическим полям вместо одного. Мне нужна помощь в отладке моего кода. Я попытался перестроить строки, которые применяют фильтр, но я не могу понять, как это правильно.

вот мой код

namespace VideoProcessing1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Graphics g;
        Bitmap video;
        bool OnOff;
        int mode;
        int thoigianddemnguoc;

        private FilterInfoCollection CaptureDevice;
        private VideoCaptureDevice FinalFrame;

        private void Form1_Load(object sender, EventArgs e)
        {
            CaptureDevice = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            foreach (FilterInfo Device in CaptureDevice)
            {
                comboBox1.Items.Add(Device.Name);

            }
            comboBox1.SelectedIndex = 0;
            FinalFrame = new VideoCaptureDevice();
            //FinalFrame.Stop();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            FinalFrame = new VideoCaptureDevice(CaptureDevice[comboBox1.SelectedIndex].MonikerString);
            FinalFrame.NewFrame += new NewFrameEventHandler(FinalFrame_NewFrame);
            FinalFrame.Start();

        }

        void FinalFrame_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            video = (Bitmap)eventArgs.Frame.Clone();
            Bitmap video2 = (Bitmap)eventArgs.Frame.Clone();
            g = Graphics.FromImage(video2);
            g.DrawString("Test", new Font("Arial", 20), new SolidBrush(Color.White), new PointF(2, 2));
            g.Dispose();

            if (mode == 1)
            {
                ColorFiltering colorfilter = new ColorFiltering();
                colorfilter.Red = new AForge.IntRange(0, 255);
                colorfilter.Green = new AForge.IntRange(0, 75);
                colorfilter.Green = new AForge.IntRange(0, 75);
                colorfilter.ApplyInPlace(video2);
                BlobCounter blobcounter = new BlobCounter();
                blobcounter.MinHeight = 20;
                blobcounter.MaxWidth = 20;
                blobcounter.ObjectsOrder = ObjectsOrder.Size;
                blobcounter.ProcessImage(video2);
                Rectangle[] rect = blobcounter.GetObjectsRectangles();

                if (rect.Length > 0)
                {
                    Rectangle objec = rect[0];
                    Graphics graphic = Graphics.FromImage(video2);
                    using (Pen pen = new Pen(Color.White, 3))
                    {
                        graphic.DrawRectangle(pen, objec);
                    }
                    graphic.Dispose();
                }
                pictureBox2.Image = video2;

            }
            pictureBox1.Image = video2;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
          if(FinalFrame.IsRunning==true)
            {
                FinalFrame.Stop();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
           pictureBox2.Image = (Bitmap)pictureBox1.Image.Clone();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            mode = 1;
        }
    }
}

1 ответ

Решение

Призвание Stop на вашем устройстве захвата видео не рекомендуется. Согласно документам: "Правильный способ остановить камеру - это остановить ее, а затем дождаться завершения фонового потока".

Вы должны попробовать использовать что-то вроде этого, чтобы остановить:

FinalFrame.SignalToStop();
FinalFrame.WaitForStop();

Поведение потоков может стать непредсказуемым, если оно не используется должным образом, я думаю, что ваша проблема лежит здесь.

Что касается вашего второго вопроса, проблемная строка

pictureBox1.Image = video2;

Вы уже храните video2 в pictureBox2.Image поэтому я предполагаю, что вы не хотите делать это с другим pictureBox.

Другие вопросы по тегам