随着人工智能的发展,让机器代替人的部分工作已成为大趋势。

在教育领域,人工智能也会有发挥的空间,需要指出的是很多人认为人工智能就是完全又机器代替人的工作,实际上当前人工智能的发展还只是在初级阶段,或者说称为弱人工智能。

我们这里就主要讲解在教育领域的弱人工智能应用:

智能问卷系统。

一、应用需求

如何通过系统生成问卷、生成答题卡、自动阅卷功能。

印象中以前我们中考或者高考会用到答题卡,那我们能够在平常每次考试中多用到答题卡么,答案时肯定的,只需要一张A4纸。

二、技术上的需求

我们使用图像处理技术opencv生成问卷、识别答题卡内容。

三、先讲如何生成问卷

/*** 创建答题卡** @param path* @param desFile* @param title* @param questionItems* @return* @throws Exception*/
public static boolean createAnswerCardImage(String path, String desFile, String title, List<QuestionItem> questionItems) throws Exception {Mat img = Imgcodecs.imread(path);//绘制整体边框线Imgproc.line(img, new Point(50, 50), new Point(2430, 50), new Scalar(0, 0, 0), 1);Imgproc.line(img, new Point(50, 50), new Point(50, 3458), new Scalar(0, 0, 0), 1);Imgproc.line(img, new Point(2430, 50), new Point(2430, 3458), new Scalar(0, 0, 0), 1);Imgproc.line(img, new Point(50, 3458), new Point(2430, 3458), new Scalar(0, 0, 0), 1);//绘制内容下边框Imgproc.line(img, new Point(50, 900), new Point(2430, 900), new Scalar(0, 0, 0), 1);//绘制答案及选项int rowNum = (questionItems.size() % 20 == 0) ? (questionItems.size() / 20) : (questionItems.size() / 20) + 1;int y = 1000;for (int i = 0; i < rowNum; i++) {int x = 60;int optionY = y;for (int j = 0; j < 20; j++) {Imgproc.putText(img, "" + (i * 20 + j + 1), new Point(x, y), Core.FONT_HERSHEY_SCRIPT_COMPLEX, 1, new Scalar(0, 0, 0));optionY += 100;//绘制4个选项A、B、C、DString[] options = {"[A]", "[B]", "[C]", "[D]"};for (int z = 1; z <= 4; z++) {String option = options[z - 1];Imgproc.putText(img, option, new Point(x, optionY), Core.FONT_HERSHEY_DUPLEX, 1, new Scalar(0, 0, 0));optionY += 100;}x += 100;if ((j + 1) % 4 == 0)x += 100;optionY = y;}y += 500;}Imgcodecs.imwrite(desFile, img);//绘制问卷标题writeTextToImage("问卷标题", 200, 200, desFile);return true;
}
public static void writeTextToImage(String text, int x, int y, String filePath) throws Exception {ImageIcon imgIcon = new ImageIcon(filePath);Image theImg = imgIcon.getImage();int width = theImg.getWidth(null) == -1 ? 200 : theImg.getWidth(null);int height = theImg.getHeight(null) == -1 ? 200 : theImg.getHeight(null);BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = bimage.createGraphics();Color mycolor = Color.black;g.setColor(mycolor);g.setBackground(Color.white);g.drawImage(theImg, 0, 0, null);g.setFont(new Font("宋体", Font.PLAIN, 70)); //字体、字型、字号System.out.println(text);g.drawString(text, x, y); //画文字g.dispose();try {FileOutputStream out = new FileOutputStream(filePath); //先用一个特定的输出文件名JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);param.setQuality(100, true);  //encoder.encode(bimage, param);out.close();} catch (Exception e) {throw e;}
}

四、如何自动阅卷

public static void recogAnswerCard(String path, List<QuestionItem> questionItems) throws Exception {//装载图片Mat img = Imgcodecs.imread(path);Mat srcImage2 = new Mat();Mat srcImage3 = new Mat();Mat srcImage4 = new Mat();Mat srcImage5 = new Mat();//图片变成灰度图片Imgproc.cvtColor(img, srcImage2, Imgproc.COLOR_RGB2GRAY);//图片二值化Imgproc.adaptiveThreshold(srcImage2, srcImage3, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 255, 1);//确定腐蚀和膨胀核的大小Mat element = Imgproc.getStructuringElement(MORPH_RECT, new Size(1, 6));//腐蚀操作Imgproc.erode(srcImage3, srcImage4, element);//膨胀操作Imgproc.dilate(srcImage4, srcImage5, element);//Imgcodecs.imwrite("E:/picpool/bankcard/enresults.jpg", srcImage4);//确定每张答题卡的ROI区域Mat imag_ch1 = srcImage4.submat(new Rect(50, 900, 2380, 2558));//识别所有轮廓Vector<MatOfPoint> chapter1 = new Vector<>();Imgproc.findContours(imag_ch1, chapter1, new Mat(), 2, 3);Mat result = new Mat(imag_ch1.size(), CV_8U, new Scalar(255));Imgproc.drawContours(result, chapter1, -1, new Scalar(0), 2);Imgcodecs.imwrite("D://opencv//result.jpg", result);//new一个 矩形集合 用来装 轮廓List<answercard.RectComp> RectCompList = new ArrayList<>();for (int i = 0; i < chapter1.size(); i++) {Rect rm = Imgproc.boundingRect(chapter1.get(i));answercard.RectComp ti = new answercard.RectComp(rm);//把轮廓宽度区间在 50 - 80 范围内的轮廓装进矩形集合if (ti.rm.width > 50 && ti.rm.width < 100) {RectCompList.add(ti);}}//new一个 map 用来存储答题卡上填的答案 (A\B\C\D)TreeMap<Integer, String> listenAnswer = new TreeMap<>();//按 X轴 对listenAnswer进行排序RectCompList.sort((o1, o2) -> {if (o1.rm.x > o2.rm.x) {return 1;}if (o1.rm.x == o2.rm.x) {return 0;}if (o1.rm.x < o2.rm.x) {return -1;}return -1;});/*如果精度高,可以通过像素计算for (RectComp rc : RectCompList) {int x = RectCompList.get(t).getRm().x - 16;int y = RectCompList.get(t).getRm().y - 94;//计算x轴上的分割 如果超过5题,那么还会有一个大分割int xSplit = x/85 /5;//因为第一题 x=21 计算机中题目从0开始算,现实是从1开始 所以+1int xTitleNum = x/85 + 1;//由于精度问题  x轴会慢慢递减  递减到上一个答案去 如果不跨过两个答案以上,都没问题  如果答题卡x轴40题左右 会出问题if(x%85>20){System.out.println("x轴递减程度" + x%85);xTitleNum++;}xTitleNum = xTitleNum - xSplit;System.out.println(xTitleNum);}*///根据 Y轴 确定被选择答案 (A\B\C\D)for (answercard.RectComp rc : RectCompList) {for (int h = 0; h < 5; h++) {if ((RectUtil.rectContainRect(new Rect(0, 100 + 500 * h, 2380, 100), rc.rm, 30))) {int x=0;for (int j = 0; j < 20; j++) {if ((RectUtil.rectContainPoint(new Rect(x, 100 + 500 * h, 100, 100), new Point(rc.rm.x+rc.rm.width/2,rc.rm.y+rc.rm.height/2)))){listenAnswer.put(h*20+j+1,"C");break;}x += 100;if ((j + 1) % 4 == 0)x += 100;}} else if ((RectUtil.rectContainRect(new Rect(0, 200 + 500 * h, 2380, 100), rc.rm, 30))) {int x=0;for (int j = 0; j < 20; j++) {if ((RectUtil.rectContainPoint(new Rect(x, 200 + 500 * h, 100, 100), new Point(rc.rm.x+rc.rm.width/2,rc.rm.y+rc.rm.height/2)))){listenAnswer.put(h*20+j+1,"C");break;}x += 100;if ((j + 1) % 4 == 0)x += 100;}} else if ((RectUtil.rectContainRect(new Rect(0, 300 + 500 * h, 2380, 100), rc.rm, 30))) {int x=0;for (int j = 0; j < 20; j++) {if ((RectUtil.rectContainPoint(new Rect(x, 300 + 500 * h, 100, 100), new Point(rc.rm.x+rc.rm.width/2,rc.rm.y+rc.rm.height/2)))){listenAnswer.put(h*20+j+1,"C");break;}x += 100;if ((j + 1) % 4 == 0)x += 100;}} else if ((RectUtil.rectContainRect(new Rect(0, 400 + 500 * h, 2380, 100), rc.rm, 30))) {int x=0;for (int j = 0; j < 20; j++) {if ((RectUtil.rectContainPoint(new Rect(x,400 + 500 * h, 100, 100), new Point(rc.rm.x+rc.rm.width/2,rc.rm.y+rc.rm.height/2)))){listenAnswer.put(h*20+j+1,"C");break;}x += 100;if ((j + 1) % 4 == 0)x += 100;}}}}Iterator iter = listenAnswer.entrySet().iterator();while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();Object key = entry.getKey();Object val = entry.getValue();System.out.println("第" + key + "题,分数:" + val);}
}

github地址

一能科技为您提供

小倍客服

java 自动考试阅卷系统(一、自动答卷生成,自动阅卷功能)相关推荐

  1. 计算机网络应用答题卡,网上阅卷系统中答题卡模板自动生成技术研究

    摘要: 存各种考试阅卷工作中,传统的手工阅卷消耗巨大的人力和物力,阅卷效率低,且不能保证阅卷质量,同时纸质试卷的保存和运输工作也非常繁杂.因此,随着计算机网络技术和数字图像处理技术的快速发展,一套基于 ...

  2. 小学自动组卷系统C语言,题库管理自动组卷系统设计-PB(源程序+论文+开题报告+答辩PPT)...

    题库管理自动组卷系统设计-PB(源程序+论文+开题报告+答辩PPT) 摘 要 本文首先分析了自动组卷系统在具体的教学活动过程中的实际需求,然后以C语言程序设计的教学为背景,设计与实现了一个实际通用的自 ...

  3. 鼎诚网上阅卷系统.html,鑫众博网上阅卷系统各类答题卡轻松识别

    网上阅卷系统工作流程 一.命题及答题卡设计 命题老师采用题.卡分离方式分别制作试题和答题卡,采用系统自带的标准Word答题卡模版,答题卡设计简单.方便. 本系统兼容任意第三方答题卡 二.答题卡印刷 支 ...

  4. 丽升网上阅卷系统服务器地址,丽升网上阅卷系统介绍书(校园版).doc

    文档介绍: 用户第一信誉至上专注教育服务教育 1 校园版介绍书用户第一信誉至上专注教育服务教育 2 丽升答题卡设计软件可通过 WORD 快速制卷, 只需设置答题卡幅面, 客观题数量, 答题卡格式即可自 ...

  5. 丽升网上阅卷系统服务器地址,丽升网上阅卷系统肿么改分

    在网上阅卷过程中,如果某道题由多名教师参与阅卷,那么网上阅卷系统会将个人评分标准与总体评分标准进行比较,这就是所谓的一致性偏差.全通纸笔王网上阅卷系统的一致性偏差最优值是1.36,也就说多人评分标准完 ...

  6. java排课系统源代码,JSP自动排课系统 - WEB源码|JSP源码/Java|源代码 - 源码中国

    JSP自动排课系统 JSP自动排课系统\JSP自动排课系统 JSP自动排课系统\JSP自动排课系统\JSP自动排课系统录像.avi JSP自动排课系统\JSP自动排课系统\paike JSP自动排课系 ...

  7. 2021-2027全球与中国自动卡车卸货系统 (ATLS)市场现状及未来发展趋势

    本报告研究全球与中国市场自动卡车卸货系统 (ATLS)的产能.产量.销量.销售额.价格及未来趋势.重点分析全球与中国市场的主要厂商产品特点.产品规格.价格.销量.销售收入及全球和中国市场主要生产商的市 ...

  8. 2022-2028全球与中国自动输送分拣系统市场现状及未来发展趋势

    根据QYR(恒州博智)的统计及预测,2021年全球自动输送分拣系统市场销售额达到了 亿美元,预计2028年将达到 亿美元,年复合增长率(CAGR)为 %(2022-2028).地区层面来看,中国市场在 ...

  9. 基于python的12306自动抢票系统的设计与实现

    铁路售票系统12306网站作为一个广受人们的日常使用工具,受大极大的关注.铁路售票的管理者都主要考虑降低成本,提升售票服务满意度.一年一度的春运和节假日出行高峰期,给众多的出行群众者带来了极大的烦恼, ...

  10. 2022-2028全球及中国自动运输网络(ATN)系统市场研究

    2021年全球自动运输网络(ATN)系统市场规模大约为 亿元(人民币),预计2028年将达到 亿元,2022-2028期间年复合增长率(CAGR)为 %.未来几年,本行业具有很大不确定性,本文的202 ...

最新文章

  1. Linux中常见shell命令总结
  2. 从Demo到日千万PV,就是快! – 爱线下的上云实践
  3. idea 中javax.servlet.http.HttpServlet包导不进来
  4. Android DatePicker, TimePicker控件的使用
  5. java gc 次数_浅谈如何减少GC的次数
  6. 基于 HTML5 WebGL 的 3D 智慧隧道漫游巡检
  7. 快速显示代码信息工具 Tokei
  8. 的标题形状工具在哪里_一分钟教你做一款让人眼前一亮的标题!你想学吗?「Word技巧」...
  9. CCF NOI1026 表演打分
  10. word多个文档标签显示在一个窗口
  11. 破解WIFI密码之密码字典
  12. OpenCvSharp DnnSuperres图像超分辨率Demo测试
  13. 服务器 端口映射 dmz,如何使用端口映射功能与 DMZ 主机设置
  14. vue博客模板—Gblog
  15. 产品原型绘制要求与规范
  16. Dijskra迪杰斯特拉算法
  17. 检查IP或端口是否被封
  18. BDW01手把手系列04:基于TencentOS Tiny、腾讯云、腾讯连连之自制定位器
  19. VM虚拟机去虚拟化教程(三)修改内存品牌和序列号
  20. 商标销售可以是有利可图的业务

热门文章

  1. 黑莓手机的一些小技巧
  2. flutter 给icon图标添加阴影
  3. 倩女服务器维护时间,《倩女幽魂》更新公告
  4. java poi 通用工具类
  5. 缓存解释(一级缓存,二级缓存)
  6. Vue指令(续)、小黑记事本案例
  7. ByteBuffer解密
  8. POJ-2484 A Funny Game (坑爹的博弈论)
  9. LaTeX快速入门-蔡炎龙
  10. 如何获得更好的交互体验_如何使用有限的调色板获得更好的照片