首页 > 解决方案 > 如何为多个图片框应用相机新框架?

问题描述

我对视频应用了过滤器,我可以从 picfilter.Image 获取视图,但我想使用两个图片框,我希望其中一个(picoriginal.Image)可以显示原始视图,另一个可以显示过滤后的视图。我不能那样做。可能我应该使用“if”来执行此操作,并且我应该说当按下 btnapply 时将其设为灰色过滤,或者当按下 button1 时将其设为 sobel 过滤。我该怎么做?(我在不同的类中编写了过滤器。)

这是主程序的代码:

using AForge.Video.DirectShow;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace dnm1310img
{
    public partial class Form1 : Form
    {
       
        public Form1()
        {
            InitializeComponent();
        }
        public FilterInfoCollection devices;
        public VideoCaptureDevice camera;
        private void Form1_Load(object sender, EventArgs e)
        {
            devices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            foreach (FilterInfo item in devices)
            {
                comboBox1.Items.Add(item.Name);

            }
            

            camera = new VideoCaptureDevice();

            comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (camera.IsRunning == false)

                {
                    camera = new VideoCaptureDevice(devices[comboBox1.SelectedIndex].MonikerString);
                    camera.NewFrame += Camera_NewFrame;
                    camera.Start();
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message + "");
            }
        }
        private void Camera_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            picoriginal.Image = image;
        }
        private void btnapply_Click(object sender, EventArgs e)
        {
           Bitmap image = new Bitmap(picoriginal.Image);
           Bitmap gray = dnm1310img.Gray.GrayFilter(image);
           picfilter.Image = gray;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (picfilter.Image != null)
            {
                Bitmap image = new Bitmap(picfilter.Image);
                Bitmap sbl = dnm1310img.Sobel.SobelFilter(image);
                picfilter.Image = sbl;
            }
            else
            {
                Bitmap image = new Bitmap(picoriginal.Image);
                Bitmap sbl = dnm1310img.Sobel.SobelFilter(image);
                picfilter.Image = sbl;
            }
            
        }

        private void GeriAL_Click(object sender, EventArgs e)
        {
            picfilter.Image=null;
        }
    }
}

这是应该改变的部分:

private void Camera_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            picoriginal.Image = image;
        }

例如,当我编写此代码时,它正在工作,但是如何根据按下按钮来执行此操作?(例如,获取每个类的视图:picfilter.Image = dnm1310img.Sobel.SobelY(image);)

picfilter.Image = dnm1310img.Gray.GrayFilter(image);

标签: c#oopimage-processing

解决方案


编辑:我解决了这个问题:

public void Camera_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            picoriginal.Image = image;
            if(btnapplyWasClicked ==true)
            {
                Bitmap image2 = (Bitmap)eventArgs.Frame.Clone();
                picfilter.Image = dnm1310img.Gray.GrayFilter(image2);
            }
private bool btnapplyWasClicked = false;
private void btnapply_Click(object sender, EventArgs e)
        {
            btnapplyWasClicked = true;
            Bitmap image = new Bitmap(picoriginal.Image);
            Bitmap gray = dnm1310img.Gray.GrayFilter(image);
            picfilter.Image = gray;
        }

推荐阅读