薛晖 北京市育英学校信息技术教师,北京市青少年机器人竞赛技术委员会成员,北京市机器人骨干教师,海淀区信息技术骨干教师,海淀区优秀科技辅导教师。曾任全国智能控制大赛裁判长,北京青少年机器人竞赛裁判,北京市海淀区创客秀项目负责人。指导学生获得中国青少年机器人竞赛创意项目一等奖,北京市青少年创新大赛一等奖,北京市青少年科技后备人才早期培养计划展评活动最佳学生奖,等等。
教学背景
本节课的主题是“视觉识别——感兴趣区域ROI”,利用Python语言实现图像及视频中兴趣点的单独选取,能够节省网络监控摄像机带宽占用和视频存储空间。复习课前知识为本节课的项目做好充足的准备,过程中教师注重提示学生摄像头的视频显示就是一帧帧已经存储好的单张图像显像,图像按照一定的时间间隔不断地刷新,就形成了视频的播放。
感兴趣区域(Region of Interest,ROI)的行与列是对图像的裁剪范围,教师通过范例讲解,帮助学生理清进行区域选择的方法,为项目中的兴趣点选取做准备。在项目实施过程中为学生提供已学程序的资料,减轻学生的代码输入量;在项目临近成功时增加改变项目需求的环节,让学生体验解决突发问题的过程,锻炼学生的信息意識。
教学目标
1.了解什么是ROI,学会如何在数字化图像处理中实现兴趣点的裁剪。
2.通过需求分析来解决问题,经过自主探究,结合实际效果,实现视频中单独显示兴趣点的程序设计。
3.对发现的问题能够进行自主探究和修正,提升信息意识。在反复尝试的过程中进行深入思考,通过思考、编程,实现理想的效果,从而获得成功的喜悦。
教学重点与难点
教学重点 理解什么是ROI,学会裁剪图像中的兴趣点。
教学难点 设计出单独显示兴趣点的视频。
教学准备
广播软件、Python软件、Anaconda 3软件、Spyder开发环境、计算机、摄像头等。
教学过程
一、了解计算机视觉中的图像原理
在计算机视觉中,如果我们对视野中的某一个位置感兴趣,就要对该位置进行单独的提取和图像处理。首先,我们要了解的就是图像的数字化存储,也就是RGB彩色图像的制作方法。
彩色图像由一个三维数组组成,在Python中用[行像素范围,列像素范围,颜色通道号]来表示,例如:
img[10:20,0:100,0]=0
img[10:20,0:100,1]=255
img[10:20,0:100,2]=255
其中img变量中10:20表示10至20行的像素范围,0:100表示0至100列的像素范围,0表示蓝色通道,1表示绿色通道,2表示红色通道。蓝色通道0,绿色、红色通道255,混合出来的颜色就是黄色。
二、实验探究
实验1:摄像头的视频显示
师:视频显示多张静态图片,按照一定的时间间隔不断地刷新,也就是一帧一帧地播放图片形成了视频的效果。在Python中使用cv2.VideoCapture(0)函数可以读取实时的视频图像并存储到变量中,再把读取到的变量通过cv2.imshow()函数显示出来,如此弹屏循环就实现了摄像头拍摄的实时视频图像。在程序中,“ret, frame = capture.read()”表示一帧一帧读取视频图像并存储到frame变量中。“frame = cv2.flip(frame, 1)”表示将图像镜像翻转。
教师下发程序代码,学生进行程序实验,具体程序如下:
import cv2
capture = cv2.VideoCapture(0)
while True:
ret, frame = capture.read()
frame = cv2.flip(frame, 1)
cv2.imshow('video', frame)
c = cv2.waitKey(10)
if c == ord('q'):
print("press q")
break
capture.release()
cv2.destroyAllWindows()
实验2:感兴趣区域(ROI)
师:在图像处理过程中,我们可能对某一特定区域感兴趣,该区域称为感兴趣区域(ROI)。例如,如果我们对图1中的五角星感兴趣,就可以用“img[70:170,460:590]”来表示,其中70:170指的是行的像素范围,460:590指的是列的像素范围,如图2。
程序语句“interest=img[70:170,460:590]”的作用是裁剪范围内的图像,其中70:170是行的范围,460:590是列的范围。“cv2.imshow('Interest',interest)”的作用是显示裁剪后的interest存储的图像,窗口名称为“Interest”。
教师下发程序代码,学生进行实验,具体程序如下:
import cv2
img=cv2.imread("YX2.jpg")
interest=img[70:170,460:590]
cv2.imshow('Interest',interest)
cv2.waitKey()
cv2.destroyAllWindows()
实验3:探究在视频中如何进行ROI的裁剪方法
教师引导学生进行思考,通过实验1和实验2分析如何进行视频ROI的方法:把cv2.VideoCapture(0)函数读取到的图像进行裁剪,然后新建一个窗口显示出来,窗口名称为“video interest”。具体程序设计如下:
import cv2
cap = cv2.VideoCapture(0)
while True:
flag, frame = cap.read()
frame = cv2.flip(frame, 1)
interest=frame[70:170,460:560]
cv2.imshow('video interest', interest)
if ord('q') == cv2.waitKey(40)
break
cap.release()
cv2.destroyAllWindows()
三、情景化项目研究
教师提出项目需求:学校门前安装了固定机位的安保摄像机,且摄像机不能移动。现在想对画面中部分内容进行识别,但画面中有很多无用的部分,影响了识别的效果,需要对识别的部分进行单独提取使用。
使用电脑摄像头设备来模拟固定机位的安保摄像机,请学生根据本节课的三个实验开展自主研究,探究如何只显示原始视频指定位置的单独画面。教师要明确摄像头画面大小为480行×640列,需要单独显示整体的视频画面,窗口名称为“video all”。需要单独显示指定部分的画面,窗口名称“video interest”。教师指定视频画面中,右上角区域范围100×100的位置是本节课需研究的项目。
程序设计中右上角的100×100区域,并不能直接写进程序,因为视频画面大小为480行×640列,左上角为(0,0),所以右上角的范围为[0:100,540:640]。其中0:100是行的范围,540:640是列的范围。再使用实验2方法对采集的图像进行裁剪,完整程序如下:
import cv2
cap = cv2.VideoCapture(0)
while True:
flag, frame = cap.read()
frame = cv2.flip(frame, 1)
interest=frame[0:100,540:640]
cv2.imshow('video all', frame)
cv2.imshow('video interest', interest)
if ord('q') == cv2.waitKey(40):
break
cap.release()
cv2.destroyAllWindows()
在学生进行项目研究的过程中,教师巡视并进行单独指导。若部分学生已完成右上角兴趣区域的单独显示,教师可增加项目任务——单独显示视频左下角200行×50列的区域,推算区域范围。教师应鼓励学生挑战更高的任务难度,分层递进教学,促进不同层次学生发展,锻炼学生的应变能力。
四、教学评价
使用项目验收单对学生的项目完成情况进行验收,并给予相应的分数。评价标准共10分,分为是否实现单独窗口显示全部画面(5分)、是否实现单独窗口显示右上角兴趣点(2分)、窗口大小是否为100×100(1分)、是否实现单独窗口显示左下角兴趣点(1分)、窗口大小是否为200×50(1分)等评价指标。
教学反思
在本节课中的教学过程中,笔者努力落实新课程改革要求,让学生自主发现问题并解决问题。本节课采用了情景化项目研究的形式开展探究学习,以图像中的兴趣點为主线展开自主探究。视觉识别作为我校特色校本课程,充分利用现有的教学资源,结合当前人工智能国家战略,培养学生的信息技术学科素养。利用知识的迁移引导学生发散思维,用已学知识解决更多的生活实际问题,为国家培养科技人才做出自己的贡献。
在课程实施的过程中,发现学生自主研究的能力偏弱,遇到未知问题时对自己的能力不够自信,不知道自行探究解决方法,存在坐等教师讲解灌输的现象,这也导致学生进入研究状态慢,课堂时间不够用。本节课是学生情景化项目研究的第一次尝试,后续的课程也会采用类似的方法进行自主研究,相信在学生适应这种学习方式后,能够提高课堂时间效率。