上课前逐个检查 23 个实验后的修改:补上三处评分漏洞(项目 3 任务 1、项目 4 任务 3 的关闭和项目 7 任务 2 的熄灯,程序什么都不做也能通过);评分说明的空格;任务说明按实测补充(项目 2 任务 1–3、项目 3 任务 2、项目 4 任务 2、项目 7 任务 1–3、项目 8 任务 5)。使用说明、设计方案同步,设计方案记下以后可能扩展"物联网设备安装与调试"课 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.6 KiB
3.6 KiB
任务目标
做一个校园监控程序:输入摄像机 IP 点"开",图片框里实时显示摄像机拍到的画面;用四个方向键转动摄像机;点"拍照"把当前画面保存成图片。
练习重点:图片框(PictureBox)、给设备的事件绑定处理方法(+=)、static 变量、文件夹和图片的保存。详细步骤见书 p78–81。
界面和控件名
| 控件 | 名称(Name) | 文字(Text)和用途 |
|---|---|---|
| 窗体 | Form1 |
网络摄像机 |
| 图片框 | pictureBox1 |
显示画面;背景色设为黑色,显示方式选"拉伸填满"(StretchImage) |
| 标签 | label1 |
摄像机IP |
| 文本框 | txt_ip |
输入摄像机的 IP |
| 按钮 | btn_open |
开(打开后变成"关") |
| 按钮 | btn_up |
↑(向上转) |
| 按钮 | btn_down |
↓(向下转) |
| 按钮 | btn_left |
←(向左转) |
| 按钮 | btn_right |
→(向右转) |
| 按钮 | btn_camera |
拍照 |
实现步骤
- 代码开头加上
using System.IO;和using DeviceCtrlLibrary;。 - 声明 4 个全局变量:拍照保存路径
CameraPath(static,程序所在目录下的Camera/文件夹)、摄像机 IPIpCameraIPAddress(static)、bool IsOpen、存当前画面的Image ReadImage。 - 写一个方法
ipCameraHelper_ImageRead(ImageReadEvenArgs e):把e.img存进ReadImage,再显示到pictureBox1。 - Form1_Load:
Camera文件夹不存在就用Directory.CreateDirectory建一个;用+=把第 3 步的方法绑定到DeviceCtrlHelper.ipCameraHelper.ImageRead事件上。 - btn_open 的 Click:先把
IsOpen取反;- 打开时:取
txt_ip里的 IP,调用ipCameraHelper.Open(IP, "admin", "")连接,再Start()开始传画面,按钮文字改成"关"; - 关闭时:
Stop()停止传画面,按钮文字改回"开"。
- 打开时:取
- 四个方向键的 Click:分别调用
ipCameraHelper.PanUp()、PanDown()、PanLeft()、PanRight()。 - btn_camera 的 Click:
ReadImage不是 null 时,用当前时间做文件名,ReadImage.Save(...)存成 .jpg 到CameraPath。
和书上不一样的地方
书上第 6 步只写了
using System.IO.Ports;,可是Directory要用using System.IO;,不加会编译不过。这个任务不用串口,System.IO.Ports可以不写。
在平台上怎么试
- 运行后在 IP 框里填 192.168.2.50(填别的 IP 也能连上,但不能空着:空着点"开",按钮照样变,画面却一直是黑的),点"开",按钮变成"关",图片框里出现东围墙的画面,实训台顶棚的网络摄像头亮起。
- 窗体比较大,运行区会缩小显示,可以点运行区右上角的"放大"。点四个方向键,画面应跟着转动:每点一次转一格,左右各 3 格、上下各 1 格,转到头就不再动。
- 点"拍照",运行区下方出现"程序保存的图片",点开能看到刚拍的照片(只在这次运行中保留)。
- 再点"关",按钮变回"开",画面停止更新。