基于opencv答题卡识别判卷

news2024/12/24 8:45:49

我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万+粉丝,拥有2篇国家级人工智能发明专利。

社区特色:深度实战算法创新

获取全部完整项目数据集、代码、视频教程,请进入官网:zzgcz.com。竞赛/论文/毕设项目辅导答疑,v:zzgcz_com


1. 项目简介

本项目旨在开发一种自动化的试卷判分系统,通过图像处理技术对试卷中的多选题答案进行识别和评分。该项目采用了基于OpenCV的图像处理方法和深度学习模型,主要用于识别扫描图像中的试卷内容,提取考生的作答区域,并根据预设的正确答案进行自动评分。项目的核心技术包括边缘检测、轮廓识别、透视变换和Otsu阈值分割等。通过一系列图像处理操作,将输入的试卷图片转化为标准化的矩形结构,并根据候选区域的轮廓特征确定每道题目的答案。该项目的应用场景包括教育评估、考试系统自动化和作业批改等。最终实现了通过图像识别对多选题进行准确评分,极大提高了试卷批改的效率和准确性。
在这里插入图片描述

2.技术创新点摘要

本项目的主要创新点在于结合经典的图像处理技术与深度学习思想,实现了自动化试卷判分系统的准确答案识别和评分。项目中采用了一系列图像处理方法,包括边缘检测、透视变换、轮廓分析和Otsu阈值分割,这些技术相互配合,在无训练数据的情况下实现了对目标区域(试卷答案区)的精确定位和特征提取。此外,该系统通过对轮廓的几何特征进行分析和排序来定位每个答案的候选区域,并结合自定义规则(例如宽高比和面积等几何特征)过滤噪声区域,从而保证了答案提取的准确性和稳定性。

在答案识别部分,项目中采用了一个基于轮廓面积的局部特征提取方法,通过对每个选项区域的非零像素点数量进行统计,并使用最大值策略选择出考生最有可能的答案。这种方法的优势在于能够适应不同类型的扫描图像和字体大小变化,同时消除了因图像光照或模糊导致的噪声干扰。该项目还集成了自定义的答案映射表,通过与预设的答案键进行比对,实现了快速评分。

整体架构设计的亮点在于,通过图像预处理和深度学习思路的结合,实现了图像中复杂目标的精确识别和分类。在技术细节上,系统的创新体现在以下几个方面:1) 通过多种图像变换(如透视变换)将任意角度的试卷图像进行标准化处理,从而避免了输入图像角度不一致导致的定位误差;2) 通过Otsu阈值法实现了自适应的答案区分割策略,使得系统能在不同光照条件下保持较高的分割精度;3) 利用局部轮廓排序方法和面积分析准确定位每道题目答案,并结合深度学习框架中的卷积思想,通过逐像素计算非零值的分布特征,最终实现了高效的答案匹配与评分。该系统能够大幅提升传统考试批改工作的效率和准确度,是对传统试卷处理方式的有效改进。

3. 数据集与预处理

本项目主要处理的是扫描的试卷图像数据集,数据集的来源可以是扫描的纸质试卷或拍摄的电子试卷图像。这类数据集通常具有以下特点:图像分辨率和质量不一致、拍摄角度存在偏差、不同光照条件下可能出现局部阴影或模糊等问题。因此,在数据处理过程中,需要针对这些问题进行相应的图像预处理操作,以确保答案区域的提取和答案识别的准确性。

数据预处理流程:

  1. 图像读取与灰度化:首先将输入的彩色图像转换为灰度图,这一步骤能够有效降低计算复杂度,并消除颜色信息的干扰,使得后续的边缘检测更加稳定。
  2. 图像平滑与去噪:使用高斯模糊对图像进行平滑处理,减少图像中因噪声造成的误差。通过设置合适的滤波器大小,可以在保留主要轮廓特征的同时消除图像中的小噪声点。
  3. 边缘检测:采用Canny边缘检测算法提取图像中的明显边缘,便于后续轮廓的定位与提取。边缘检测能够帮助定位试卷区域以及答案区域的轮廓特征。
  4. 轮廓检测与排序:在检测到的边缘图中提取所有可能的轮廓,并通过轮廓面积和形状特征(如长宽比和位置)对答案区域进行排序和筛选。最终将包含候选答案的区域筛选出来,并按指定顺序排列,确保后续答案识别时不发生错位。
  5. 透视变换与图像矫正:为了消除图像拍摄角度和试卷摆放角度对答案定位的影响,使用透视变换将不规则的图像转换为标准的矩形图像。透视变换能够矫正图像中的倾斜角度,使试卷区域与参考答案的匹配更加精准。
  6. 二值化处理:使用Otsu自适应阈值分割法对矫正后的图像进行二值化处理,进一步提升答案区域的清晰度,确保在复杂光照条件下仍然能够分割出有效的答案区域。

4. 模型架构

1) 模型结构的逻辑

该项目的代码主要基于图像处理算法来完成答案识别与评分,而不是传统的深度学习模型。因此,并没有标准的神经网络层结构,但在图像处理的各个步骤中,包含了许多数学模型和算法逻辑。以下是主要的模型逻辑描述及其数学公式:

  • 图像灰度化 (Grayscale Conversion) : 使用OpenCV中的cv2.cvtColor函数将彩色图像转换为灰度图像。数学上,每个像素点的灰度值可以表示为:
  • G r a y = 0.299 × R + 0.587 × G + 0.114 × B Gray = 0.299 \times R + 0.587 \times G + 0.114 \times B Gray=0.299×R+0.587×G+0.114×B
  • 其中,R,G,B 分别表示红、绿、蓝通道的值。
  • 图像平滑与高斯模糊 (Gaussian Blurring) : 使用高斯模糊处理来降低噪声并平滑图像,采用 cv2.GaussianBlur。高斯模糊的数学表示为:
  • G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2
  • 其中,σ 为高斯函数的标准差。
  • Canny边缘检测 (Canny Edge Detection) : 用于提取图像的边缘,通过计算图像的梯度变化来检测边缘。其数学表示为:
  • G = G x 2 + G y 2 G = \sqrt{G_x^2 + G_y^2} G=Gx2+Gy2
  • 其中,Gx 和 Gy 分别表示图像在 x 和 y 方向的梯度值。
  • 透视变换与矩阵映射 (Perspective Transform) : 使用四点透视变换将图像转换为标准矩形。映射矩阵 MMM 的计算公式为:
  • [ x ′ y ′ 1 ] = M × [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = M \times \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} xy1 =M× xy1
  • 其中,M 是基于输入坐标和输出坐标计算的3x3矩阵,[x,y,1] 为输入坐标,[x′,y′,1] 为输出坐标。
  • Otsu自适应阈值分割 (Otsu’s Binarization) : 使用Otsu方法计算最佳的全局阈值,以最小化类间方差。目标是找到一个阈值 ttt 使得图像的类内方差最小:
  • σ w 2 ( t ) = q 1 ( t ) σ 1 2 ( t ) + q 2 ( t ) σ 2 2 ( t ) \sigma^2_w(t) = q_1(t)\sigma^2_1(t) + q_2(t)\sigma^2_2(t) σw2(t)=q1(t)σ12(t)+q2(t)σ22(t)
  • 其中,q1 和 q2 是两类像素点的概率分布,σ12 和 σ22 是两类的方差。

2) 模型的整体训练流程

虽然本项目没有传统的深度学习训练流程,但可以将其看作一个基于图像处理的“训练”过程,其中包含以下步骤:

  1. 数据准备:项目使用输入的扫描图像作为数据源,并且不需要进行复杂的数据预处理(如数据增强、归一化等),只需对输入的图像进行灰度化和边缘检测处理。
  2. 特征提取与处理:通过轮廓检测和透视变换,将试卷中每个多选题的答案区域定位并提取出来。特征提取过程中,主要使用几何特征(轮廓面积、宽高比、位置)来判断是否属于有效的候选区域。
  3. 答案匹配与评分:使用非零像素统计法对每个答案区域进行特征提取,并与预设的答案进行比对。在答案比对过程中,使用了如下判别逻辑:

s c o r e = 正确答案数 总题目数 × 100 score = \frac{\text{正确答案数}}{\text{总题目数}} \times 100 score=总题目数正确答案数×100

这里,正确答案数是通过与预设答案进行逐个比对得到的。

  1. 模型评估与指标:本项目的核心评估指标是“答案识别准确率”,通过下述公式计算:

准确率 = 正确识别的答案个数 所有识别的答案总数 \text{准确率} = \frac{\text{正确识别的答案个数}}{\text{所有识别的答案总数}} 准确率=所有识别的答案总数正确识别的答案个数

本项目的目标是将识别准确率提升到接近100%,确保每个扫描图像都能够被精准判分。

整体来看,本项目通过图像处理技术(而非传统深度学习模型)完成了试卷答案的识别、定位与评分,并且引入了透视变换、Otsu自适应阈值等多种处理策略来提升系统在不同环境下的鲁棒性与准确性。

5. 核心代码详细讲解

1. 读取输入图像并进行灰度化和边缘检测
# 读取输入图像并生成副本
image = cv2.imread(args["image"])
contours_img = image.copy()
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  • cv2.imread(args["image"]): 从指定路径读取输入图像文件,并以彩色图像格式加载。
  • contours_img = image.copy(): 创建一个图像副本,用于后续画出轮廓时使用,避免修改原始图像。
  • cv2.cvtColor(image, cv2.COLOR_BGR2GRAY): 将原始彩色图像转换为灰度图像,减少颜色信息的干扰,同时降低计算复杂度。
# 进行高斯模糊处理,减少噪声
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
  • cv2.GaussianBlur(gray, (5, 5), 0): 应用5x5大小的高斯模糊滤波器来平滑图像,以去除小的噪声点,使得后续边缘检测更加稳定。参数 (5, 5) 表示高斯核的大小,0 表示根据内置算法自适应地计算标准差。
# 使用Canny边缘检测,提取图像的边缘
edged = cv2.Canny(blurred, 75, 200)
  • cv2.Canny(blurred, 75, 200): 使用Canny算法提取图像边缘。Canny算法采用了双阈值方法,75 是最小阈值,200 是最大阈值。这一步能够提取出图像中的显著边缘,便于轮廓的检测和定位。
2. 检测并排序轮廓
# 使用findContours函数检测图像中所有的轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
# 在图像中绘制所有轮廓
cv2.drawContours(contours_img, cnts, -1, (0, 0, 255), 3)
  • cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE): 识别二值化图像中的轮廓。参数 cv2.RETR_EXTERNAL 仅检测外部轮廓,cv2.CHAIN_APPROX_SIMPLE 使用点近似算法来减少存储每个轮廓点的数量。
  • cv2.drawContours(contours_img, cnts, -1, (0, 0, 255), 3): 在图像副本中绘制所有检测到的轮廓,-1 表示绘制所有轮廓,颜色为红色 (0, 0, 255),线条宽度为 3 像素。
3. 透视变换与图像矫正
# 执行透视变换以获取标准化的试卷区域
warped = four_point_transform(gray, docCnt.reshape(4, 2))
  • four_point_transform(gray, docCnt.reshape(4, 2)): 调用自定义函数 four_point_transform,通过将轮廓点映射到标准矩形坐标系中,矫正图像角度,消除图像拍摄角度不一致带来的误差。
def four_point_transform(image, pts):# 按顺序排列输入的4个顶点坐标
    rect = order_points(pts)
    (tl, tr, br, bl) = rect
    ...# 计算透视变换矩阵,并对图像进行变换
    M = cv2.getPerspectiveTransform(rect, dst)
    warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))return warped
  • order_points(pts): 先对输入的四个顶点进行排序,确保四个角点分别对应左上、右上、右下和左下。
  • cv2.getPerspectiveTransform(rect, dst): 计算透视变换矩阵 M,根据输入顶点和目标顶点位置进行图像变换。
  • cv2.warpPerspective(image, M, (maxWidth, maxHeight)): 执行透视变换,将原图像变换为矩形的标准形态。
4. 二值化处理和答案识别
# 对矫正后的图像进行二值化处理,区分背景与前景
thresh = cv2.threshold(warped, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
  • cv2.threshold(warped, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU): 使用Otsu阈值法进行二值化处理,将图像分为前景(白色)和背景(黑色)。cv2.THRESH_BINARY_INV 表示使用二值反转(即前景为白色时显示为黑色)。
# 检测并筛选出可能的答案圆圈轮廓
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
  • 再次使用 cv2.findContours 检测二值化图像中的圆圈轮廓,并按比例和大小特征进行筛选,确定为有效的候选答案区域。
5. 选项识别与答案评分
# 对每个题目的候选区域进行特征提取,并进行答案比对for (q, i) in enumerate(np.arange(0, len(questionCnts), 5)):# 按从左到右顺序对候选区域进行排序
    cnts = sort_contours(questionCnts[i:i + 5])[0]
    bubbled = Nonefor (j, c) in enumerate(cnts):# 创建掩码图像,仅保留当前轮廓
        mask = np.zeros(thresh.shape, dtype="uint8")
        cv2.drawContours(mask, [c], -1, 255, -1)# 计算掩码区域的非零像素数量
        total = cv2.countNonZero(mask)if bubbled is None or total > bubbled[0]:
            bubbled = (total, j)
  • mask = np.zeros(thresh.shape, dtype="uint8"): 创建一个与原图同大小的全黑掩码图像。
  • cv2.drawContours(mask, [c], -1, 255, -1): 在掩码图像上填充当前轮廓区域,使其为白色(前景)。
  • cv2.countNonZero(mask): 统计当前掩码图像中非零像素点的数量,判断考生在该选项处是否涂黑。

6. 模型优缺点评价

该项目的模型优势在于基于图像处理的非深度学习方法,通过经典的边缘检测、轮廓分析、透视变换和Otsu阈值等图像处理技术,在无训练数据的情况下实现了高效的答案区域提取和答案判别。该方法的优点主要体现在以下几个方面:1) 计算效率高:与深度学习模型相比,不需要大量计算资源即可完成多选题答案识别。2) 鲁棒性好:在不同图像分辨率、拍摄角度和光照条件下,经过预处理后的图像仍然能够稳定识别答案区域。3) 实现简单:不需要复杂的模型训练流程和大规模数据集,易于部署和维护。

然而,该模型也存在一定局限性:1) 无法处理复杂背景或噪声严重的图像:依赖于图像的清晰边缘和稳定的轮廓特征,当图像质量较差时(如模糊、强光反射、角度偏差过大),识别效果可能不理想。2) 缺乏通用性:仅能处理预定义格式的标准化试卷,对于其他类型的文档(如含有文本、表格等)适用性较差。3) 灵活性不足:无法动态适应答案区域位置变化(如多选题的题目数量和选项数量不同)。

改进方向:1) 引入深度学习模型:可以考虑使用深度学习的目标检测模型(如YOLO或Faster R-CNN)来替代传统的轮廓检测,从而提高复杂背景下的答案区域定位能力。2) 加入数据增强:在图像预处理时使用数据增强策略(如随机旋转、裁剪、噪声注入等),提高模型在不同拍摄条件下的鲁棒性。3) 优化透视变换算法:加入更复杂的几何校正方法,以适应更多种类的拍摄角度和变形情况,进一步提升模型的稳定性与识别精度。

↓↓↓更多热门推荐:
钢板表面缺陷检测基于HRNET模型
基于opencv的人脸闭眼识别疲劳监测

全部项目数据集、代码、教程进入官网zzgcz.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel使用技巧:数据-》分列:处理log数据,把有用的信息提取出来;查找Ctrl+F,替换Ctrl+H;通配符

Excel的正确用法: Excel是个数据库,不要随意合并单元格。 数据输入的时候一定要按照行列输入,中间不要留空,不然就没有关联。 数据-》分列:处理log数据,把有用的信息提取出来。 按照向导一步一步操作。…

D36【python 接口自动化学习】- python基础之函数

day36 函数的定义 学习日期:20241013 学习目标:输入输出与文件操作﹣-49 函数定义:如何优雅地反复引用同一段代码? 学习笔记: 函数的用途 定义函数 调用函数 # 定义函数 def foo():print(foo)print(foo …

数据传送指令

文章目录 MOVXCHGPUSH和POPIN和OUTXLATLEA LDS LESLEALDSLES LAHF SAHFPUSHF POPF总结 MOV MOV dst, src ; dst <-- src可以进行8位或16位数据的传送源操作数可为立即数、寄存器、存储器操作数目的操作数不可为立即数&#xff0c;CS、IP寄存器两操作数必有一个寄…

Hi3244 应用指导

Hi3244 是一款DIP8封装高性能、多模式工作的原边控制功率开关。Hi3244内高精度的恒流、恒压控制机制结合完备的保护功能&#xff0c;使其适用于小功率离线式电源应用中。在恒压输出模式中&#xff0c;Hi3244 采用多模式工作方式&#xff0c;即调幅控制&#xff08;AM&#xff0…

LLM - 配置 ModelScope SWIFT 环境与 Qwen2-VL 模型推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142827217 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SWIFT …

AI 工具大比拼:ChatGPT 与豆包的魅力与未来展望

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

C++的类和动态内存分配(深拷贝与浅拷贝)并实现自己的string类

首先&#xff0c;我们先写一个并不完美的类&#xff1a; #include<iostream> #include<cstring> using namespace std;class Mystring{private:char *p;int len;static int num;friend ostream& operator<<(ostream& os, const Mystring& c);pu…

QT开发--多线程

第十四章 多线程 QThread 是 Qt 中实现多线程编程的核心类&#xff0c;提供跨平台线程管理。 使用 QThread 有两种方法&#xff1a; 1、 继承 QThread&#xff1a;重写 run() 方法&#xff0c;实现线程的具体操作。Qt4.8 之前较常用。 2、 使用 QObject 和 moveToThread()&…

2024-10-13 NO.1 Quest3 激活教程

文章目录 1 下载 Occlus 助手2 打开 quest 热点3 Quest3 连接 wifi4 详细文档5 参考教程 1 下载 Occlus 助手 ​ 网址&#xff1a;https://ochelper.xlemon.cn/home.html。 2 打开 quest 热点 ​ 下载 Occlus 助手后&#xff0c;双击 exe 文件打开。 ​ 过程中按照程序提示执…

各类排序详解

前言 本篇博客将为大家介绍各类排序算法&#xff0c;大家知道&#xff0c;在我们生活中&#xff0c;排序其实是一件很重要的事&#xff0c;我们在网上购物&#xff0c;需要根据不同的需求进行排序&#xff0c;异或是我们在高考完报志愿时&#xff0c;需要看看院校的排名&#…

【动手学深度学习】6.2 图像卷积(个人向笔记)

1. 互相关运算 严格来说&#xff0c;卷积层是一个错误的叫法&#xff0c;因为它本质上是互相关运算而不是卷积运算。我们暂时忽略通道看看二维图像数据和隐藏表示。那么输出大小可以表示为 我们自己实现一个二维互相关运算 2. 卷积层 卷积层中有两个参数&#xff1a;卷积核权…

Medieval Kingdom UI 中世纪王国AAA级UI游戏界面

这款中世纪王国风格的大型素材包包含大量绘图、图标、用户界面(UI)元素、完整的世界地图和文明图标。它将助您打造一款游戏,或为您的3D游戏增添亮点。您还可以为对话制作国王的动画,为4K游戏创建独特的面板和窗口。提供两种独特皮肤:经典(冷色调)和白金(暖色调)。 素…

国家基本药物目录数据库查询3种方法(2018、2012、2009年版)

国家基本药物目录是一份由国家卫生健康委员会等相关部门制定的药品清单&#xff0c;旨在满足国家公共卫生需求&#xff0c;保障基本医疗服务。该目录包括了多种药品&#xff0c;覆盖了不同的疾病治疗领域&#xff0c;如抗生素、心血管药物、神经系统药物、抗肿瘤药物、维生素和…

STM32 -- USB CDC 虚拟串口通信

本篇操作: 通过CubeMX Keil&#xff0c;配置STM32作为USB设备端&#xff0c;与电脑上位机进行通信&#xff08;CDC&#xff09;&#xff1b;通用带USB功能的 STM32 芯片 &#xff08;如F1、F4等&#xff0c;系统时钟配置不同&#xff0c;代码通用&#xff09;。 目录 一、 S…

[论文精读]Active and Semi-Supervised Graph Neural Networks for Graph Classification

论文网址&#xff1a;Active and Semi-Supervised Graph Neural Networks for Graph Classification | IEEE Journals & Magazine | IEEE Xplore英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若…

大数据-168 Elasticsearch 单机云服务器部署运行 详细流程

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

PyQt: QMessageBox Duplication

在使用 PyQt 的 QMessageBox 时&#xff0c;如果你遇到 消息框重复显示 或 QMessageBox 重复实例化 的问题&#xff0c;通常是因为消息框没有正确管理或关闭&#xff0c;或者消息框的创建和显示逻辑中存在重复调用。以下是一些常见原因和解决方案。 1、问题背景 在 PyQt 中使用…

无心剑七绝《泊院雕楼》

七绝泊院雕楼 清歌咏尽桂花香 泊院雕楼醉夕阳 逸兴无端飞万里 幽情宛转忆潇湘 2024年10月13日 平水韵七阳平韵 这首七绝《泊院雕楼》以清新脱俗的语言&#xff0c;描绘了一幅宁静致远的画面。 首句“清歌咏尽桂花香”&#xff0c;以“清歌”起兴&#xff0c;形象地描绘了桂花香…

C++——类和对象(三)

一.赋值运算符 1.运算符重载 (1) 运算符重载是具有特殊名字的函数&#xff0c;他的名字是由operator和后面要定义的运算符共同构成。和其他函数一样&#xff0c;它也具有其返回类型和参数列表以及函数体。 (2) 重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。…

React.createRef(),React.forwardRef(),forwardRef()结合next.js的link进行路由跳转

码云https://gitee.com/skyvilm/react-next.js 1.React.createRef() 作用&#xff1a;获取dom元素 使用 import React,{Component} from react export default class Index extends Componen{ constructor(props){ super(props) this.myrefReact.createRef(); //创建节点 } c…