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.Controls; using AForge.Neuro; using AForge.Video; using AForge.Video.DirectShow; using static recharge.Form1; namespace recharge { public partial class Form1 : Form { FilterInfoCollection videoDevices;//摄像头设备集合 VideoCaptureDevice videoSource;//捕获设备源 public int selctedDeviceIndxe = 0; Bitmap img;//处理图片 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //先检测电脑所有的摄像头 videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); MessageBox.Show("检测到了" + videoDevices.ToString() + "个摄像头!"); } // CS0021.cs // compile with: /reference:CPP0021.dll private void pictureBox1_Click(object sender, EventArgs e) { } private void videoSourcePlayer1_Click(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); selctedDeviceIndxe = 0; videoSource = new VideoCaptureDevice(videoDevices[selctedDeviceIndxe].MonikerString); videoSource.VideoResolution = videoSource.VideoCapabilities[selctedDeviceIndxe]; videoSourcePlayer1.VideoSource = videoSource; videoSourcePlayer1.Start(); img = videoSourcePlayer1.GetCurrentVideoFrame(); } } }
时间: 2024-02-14 12:15:32 浏览: 159
根据您提供的代码,问题出现在 `videoSource = new VideoCaptureDevice(videoDevices[selctedDeviceIndxe].MonikerString);` 这一行,因为 `videoDevices` 是一个 `FilterInfoCollection` 类型的对象,而这个类型不支持通过方括号进行索引操作。
要解决这个问题,您可以使用 `videoDevices[selctedDeviceIndxe]` 的返回值来获取当前选中的 `FilterInfo` 对象,然后再使用它的 `MonikerString` 属性来创建 `VideoCaptureDevice` 对象。修改后的代码如下:
```
FilterInfo selectedDevice = videoDevices[selctedDeviceIndxe];
videoSource = new VideoCaptureDevice(selectedDevice.MonikerString);
videoSource.VideoResolution = videoSource.VideoCapabilities[selectedDevice];
```
这样就可以避免使用带有方括号的索引操作了。希望这可以帮助到您!
相关问题
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 System.IO.Ports; using System.Drawing.Drawing2D; using System.Drawing.Imaging;告诉我使用了visualstudio中哪些库
这段代码使用了以下库:
- System
- System.Collections.Generic
- System.ComponentModel
- System.Data
- System.Drawing
- System.Linq
- System.Text
- System.Windows.Forms
- System.IO.Ports
- System.Drawing.Drawing2D
- System.Drawing.Imaging
在 Visual Studio 中,您可以通过在代码文件中添加 using 语句来包含所需的命名空间和库。
using CodeEditor.CodeEdit; using Microsoft.CSharp; using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CodeEditor { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnCompile_Click(object sender, EventArgs e) { //【1】新建C#代码生成器和代码编译器的实例 CodeDomProvider Provider = CodeDomProvider.CreateProvider("CSharp"); //【2】配置用于调用编译器的参数 CompilerParameters Parameters = new CompilerParameters(); Parameters.ReferencedAssemblies.Add("System.dll"); Parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); Parameters.ReferencedAssemblies.Add("System.Linq.dll"); Parameters.GenerateExecutable = false; Parameters.GenerateInMemory = true; //【3】启动编译 CompilerResults Result = Provider.CompileAssemblyFromSource(Parameters, rtbCode.Text); if (Result.Errors.HasErrors) { AppendInfo("编译错误:"); foreach (CompilerError err in Result.Errors) { AppendInfo(err.ErrorText); } } else { // 通过反射,调用实例 Assembly objAssembly = Result.CompiledAssembly; object objHelloWorld = objAssembly.CreateInstance("CodeEditor.CodeEdit.Code"); MethodInfo objMI = objHelloWorld.GetType().GetMethod("Test"); object ReValue = objMI.Invoke(objHelloWorld, null); AppendInfo(ReValue); } } //追加字符 private void AppendInfo(object Info) { rtbResult.Text =Info+"\n\r"; } } }
这段代码是一个简单的代码编辑器程序的主窗体部分。它包含一个按钮(btnCompile)和两个文本框(rtbCode和rtbResult)。当用户点击按钮时,程序会将文本框中的C#代码编译并执行。
在点击按钮事件的处理方法(btnCompile_Click)中,代码首先创建了一个C#代码生成器(CodeDomProvider)和一个代码编译器(CompilerParameters)的实例。然后配置编译器参数,包括引用的程序集和编译选项。接下来,调用编译器的CompileAssemblyFromSource方法,将文本框中的代码作为参数进行编译。
如果编译过程中出现错误,则将错误信息逐一添加到结果文本框(rtbResult)中显示。否则,通过反射获取编译后程序集中的类(CodeEditor.CodeEdit.Code)实例,并调用其中的名为"Test"的方法。最后,将方法返回值添加到结果文本框中显示。
另外,代码中还包括一个私有方法(AppendInfo),用于将信息追加到结果文本框中。
请问你对以上代码有什么疑问吗?
阅读全文