«Я пытался обнаружить хитрый край на изображении, и это было успешно, но я не знаю, как обнаружить его край, если я хочу это в реальном времени, вот мой код, в нем нет ошибки, но хитрое окно может не обрабатываться

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//using KomCit;
using System.Drawing.Imaging;
using System.IO;
using System.Timers;
using AForge;
using AForge.Imaging.Filters;
using AForge.Video.DirectShow;
using System.Threading;

namespace canny_video
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private FilterInfoCollection CaptureDevice;
        private VideoCaptureDevice FinalFrame;

        void FinalFrame_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            CameraBox.Image = (Bitmap)eventArgs.Frame.Clone();
        }

        private static Image resizeImage(Image imgToResize, Size size)
        {
            return (Image)(new Bitmap(imgToResize, size));
        }

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

            }
            listDevice.SelectedIndex = 0;
            FinalFrame = new VideoCaptureDevice();
        }

        private void start_Click(object sender, EventArgs e)
        {
            FinalFrame = new VideoCaptureDevice(CaptureDevice[listDevice.SelectedIndex].MonikerString);
            FinalFrame.NewFrame += new AForge.Video.NewFrameEventHandler(FinalFrame_NewFrame);
            FinalFrame.Start();
            //CannyBox.Image = (Bitmap)CameraBox.Image.Clone();    //capture image bitmap
            //Bitmap gambar = new Bitmap(CameraBox.Image);
            Bitmap gambar = new Bitmap(CameraBox.Image);
            Grayscale gray = new Grayscale(0.2125, 0.7154, 0.0721);
            CannyEdgeDetector cany = new CannyEdgeDetector(0, 70);
            Bitmap hasil = cany.Apply(gray.Apply(gambar));
            // BlobsFiltering blob = new BlobsFiltering(0, 0, 20, 20);
            //Bitmap hasil = blob.Apply(gray.Apply(gambar));
            //CannyBox.Width = gambar.Width;
            //CannyBox.Height = gambar.Height;
            CannyBox.Image = hasil;
        }



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

"

Моя проблема выше решена, спасибо :) но у меня есть другая проблема с интегральной проекцией, хотя я не знал, как это сделать. помогите пожалуйста заранее спасибо

0
Devi 6 Дек 2014 в 04:53

2 ответа

Некоторые комментарии:

  • Ваши две частные переменные очень запутанно названы. Ваш CaptureDevice — это набор всех устройств захвата на компьютере, а ваш FinalFrame — это устройство захвата.
  • Вы не ищете хитрых краев на растровом изображении при получении.
  • Обработчик событий NewFrame запускается в потоке потоковой передачи, поэтому вы должны использовать там .BeginInvoke, чтобы его можно было использовать в потоке пользовательского интерфейса.

Что вы можете сделать:

  • Внутри обработчика _NewFrame используйте BeginInvoke для передачи клонированного изображения в метод ProcessCameraImage (который, следовательно, будет выполняться в потоке пользовательского интерфейса).
  • Примените хитрое обнаружение краев в рамках этого метода.
  • Затем назначьте результат вашему фотобоксу.

Примечание. Я не знаю, насколько эффективен обнаружение краев процессора. Если это дорого, выполнение этого в потоке пользовательского интерфейса может заблокировать взаимодействие с пользователем. В этом случае вы можете сделать это в потоке потоковой передачи и передать только обработанное изображение для отображения. Но в зависимости от времени это может заставить камеру снизить частоту кадров.

0
Joan Charmant 6 Дек 2014 в 13:50
Спасибо за ваш ответ, да, обнаружение задерживается примерно на 5 секунд, не могли бы вы сказать мне, как уменьшить его задержку? меня это беспокоит
 – 
Devi
6 Дек 2014 в 17:40

Спасибо за ваш ответ, он был решен только что, я изменил его, и он как-то решил

Вот код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge;
using AForge.Imaging;
using AForge.Imaging.Filters;
using AForge.Video;
using AForge.Video.DirectShow;
using System.Drawing.Imaging;       //Save P2
using System.IO;                    //Save P2

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


        Bitmap video;

        private FilterInfoCollection CaptureDevice;
        private VideoCaptureDevice FinalFrame;
        int mode;



        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();
        }

        private void button1_Click(object sender, EventArgs e)      //Tombol Start
        {
            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();
            if (mode==1)
            {
                Grayscale gray = new Grayscale(0.2125, 0.7154, 0.0721);
                Bitmap video3 = gray.Apply(video2);
                CannyEdgeDetector canny = new CannyEdgeDetector(0, 70);
                canny.ApplyInPlace(video3);
                pictureBox2.Image = video3;
            }
            pictureBox1.Image = video;
        }

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

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


    }
}

Но сейчас я работаю над следующей проблемой, я пытаюсь определить местоположение объекта с помощью интегральной проекции, можно ли использовать aforge для этого?

0
Devi 6 Дек 2014 в 17:33