opencv 智能答卷识别系统(一)

2023-11-19

目标

这里是2 智能答卷之别系统二

识别答卷答案,识别准号证号码,识别姓名

识别试卷类别

试卷是有标记的,如试卷上方的黑框,
排序结构,使用c++的标准排序算法

struct Ruley {
	bool operator()(const Rect &a1, const Rect &a2) {
		return (a1.y) < (a2.y);
	}
};
```c
 ```c

 void findpos(Mat img)
{
	Mat gray,edge;
	cv::cvtColor(img, gray, COLOR_BGR2GRAY);

	cv::threshold(gray, gray, 200, 255, cv::THRESH_BINARY_INV);
#if 1
	int edgeT = 1;
	Canny(gray, edge, edgeT, 3, 7);
	//cv::HoughLinesP()
	//edge = MyDilate(edge);
#endif

	//gray = MyDilate(gray);
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(edge, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
	vector<Rect> recs;
	vector<vector<Point>>::iterator It;
	int littleflag = 0;
	for (It = contours.begin(); It < contours.end(); It++) {                        //画出可包围数字的最小矩形

		Rect rect = boundingRect(*It);
		if (rect.area() > 100 && rect.y > 10)
		{
			if ((rect.area() > 2000 && rect.width > 800 && rect.x < img.cols / 5) || (rect.y < 150))
			{
				if (rect.y < 150)
					littleflag++;
				Point2f vertex[4];
				vertex[0] = rect.tl();                                                              //矩阵左上角的点
				vertex[1].x = (float)rect.tl().x, vertex[1].y = (float)rect.br().y;                 //矩阵左下方的点
				vertex[2] = rect.br();                                                              //矩阵右下角的点
				vertex[3].x = (float)rect.br().x, vertex[3].y = (float)rect.tl().y;                 //矩阵右上方的点
				for (int j = 0; j < 4; j++)
					line(img, vertex[j], vertex[(j + 1) % 4], Scalar(0, 0, 255), 1);
				recs.push_back(rect);
			}
		}
	}
	std::sort(recs.begin() , recs.end(), Ruley());
	int r_answer1 = littleflag + 1; //跳过最上面最大的就是答案的地方圆角矩形
	int r_answer2 = littleflag + 2; //被包含的矩形
	Rect &a1 = recs[r_answer1];
	Rect &a2 = recs[r_answer2];
	if (a1.x < a2.x && (a2.y + a2.height)<(a1.y + a1.height) && a1.width > a2.width)
	{
		//cout << "find it";
		//cout << "the rect is :" << a2.x << " " << a2.y << a2.width << a2.height << endl;
	}
	cout << "little flag is " << littleflag << endl;
	cout << "the size is " << recs.size() << endl;
}

答卷识别第一步

调用主函数

int main()
{
	Mat img; //声明一个保存图像的类
	img = imread("D:/opencv/5.tif"); //读取图像,根据图片所在位置填写路径即可
	if (img.empty()) //判断图像文件是否存在
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	findpos(img);
	img = GetSmallPic(img);
	imshow("img", img);
	//imshow("edge", edge);
	waitKey(0);
}

识别1 号码 2 答案和多选答案

1 识别号码函数

2 识别答案

比如ABC这种答案,多选识别
未完待续

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 智能答卷识别系统(一) 的相关文章

随机推荐

  • 复杂交通环境感知

    作者 黄浴 编辑 计算机视觉深度学习和自动驾驶 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 后台回复 领域综述 获取自动驾驶感知定位融合近80篇综述论文 近年来 计算机
  • TIA博途中如何为IO设备分配设备名称

    TIA博途中如何为IO设备分配设备名称 Robot PLC 自动化学院 CSDN博客
  • React 引入ant-design开发指南

    使用create react app搭建react开发环 创建react脚手架 create react app react antd demo 进入react antd demo cd react antd demo 运行react an
  • MYSQL中索引与主键的区别

    MYSQL中索引与主键的区别 索引 索引好比是一本书的目录 可以快速的通过页码找到你需要的那一页 惟一地标识一行 主键 做为数据库表唯一行标识 作为一个可以被外键有效引用的对象 索引是一种特殊的文件 InnoDB数据表上的索引是表空间的一个
  • Unity中的重载和重写

    Unity中的重载和重写 一 重载 二 重写 三 重载和重写的区别 一 重载 重载 两个必须一个可以 参数名必须相同 参数列表必须不同 返回值类型可以不同 代码示例 using System Collections using System
  • Linux 磁盘命令工具 比df更好用

    对于分析磁盘使用情况 有两个非常好用的命令 du 和 df 简单来说 这两个命令的作用是这样的 du 命令 它是英文单词 disk usage 的简写 主要用于查看文件与目录占用多少磁盘空间 df 命令 它是英文单词 disk free 的
  • python爬取证券之星网站

    周末无聊 找点乐子 coding utf 8 import requests from bs4 import BeautifulSoup import random import time 抓取所需内容 user agent Mozilla
  • 安卓逆向学习-Crack01 学习记录

    Crack01 学习记录 要感谢京峰教育 资料下载 https download csdn net download m0 47210241 85053839 利用jadx gui打开 分析代码 package com zhy editVi
  • nodejs封装api

    安装了nodeJs 执行 安装淘宝镜像 npm install g cnpm registry https registry npm taobao org 安装 yarn 我使用这个 淘宝镜像总是莫名其妙各种bug npm install
  • aix安装 php,CNESA

    aix安装samba服务器可以使用两种方式安装 一种是使用rpm包进行安装 一种是使用源码编译安装 一 使用samba的rpm包进行安装 1 下载samba的rpm包 下载地址为http www bullfreeware com searc
  • C++笔记--线程间共享数据

    当线程在访问共享数据的时候 必须制定一些规矩 用来限定线程可访问的数据位 还有 一个线程更新了共享数据 需要对其他线程进行通知 从易用性的角度 同一进程中的多个线程进行数据共享 错误的共享数据使用是产生并发bug的一个主要原因 当涉及到共享
  • 为什么训练集用fit_transform()而测试集用transform()及sklearn.feature_extraction.text.CountVectorizer API详解

    真正讲明白的 https blog csdn net yyhhlancelot article details 85097656 API https scikit learn org stable modules generated skl
  • mysql+mybatis 批量插入与批量更新

    首先批量更新需要增加 数据库的链接必须加上但是数据库连接必须加上 allowMultiQueries true 属性 不然会报错 You have an error in your SQL syntax check the manual t
  • 各种源码下载地址(目前只有ffmpeg和nginx,libcurl,RapidJSON 文档)

    各种源码下载地址 目前只有ffmpeg和nginx libcurl RapidJSON 文档 ffmpeg源码下载地址 http ffmpeg org download html releases nginx源码下载地址 http hg n
  • H5监听移动端物理/浏览器返回键

    JavaScript没有监听物理返回键的API 所以只能使用 popstate 事件监听 工具类如下 export function handleBrowserGoBack back console log back pushHistory
  • 论文阅读——基于深度学习智能垃圾分类

    B Fu S Li J Wei Q Li Q Wang and J Tu A Novel Intelligent Garbage Classification System Based on Deep Learning and an Emb
  • su命令切换用户输入密码后,提示:鉴定故障

    在终端通过su命令切换用户输入密码后 提示 鉴定故障 这是因为在安装linux系统时未设置root用户密码造成的 需要重新设置密码后再切换用户 具体操作命令如下 设置root用户密码 sudo passwd root 切换用户 su
  • 三步搞定ABAP DOI操作EXCEL

    ABAP可以使用OLE与DOI两种方式实现操作EXCEL 使用OLE时 每个单元格的值和样式都需要写代码实现 特别是对于不规则的格式 代码量巨大 而DOI是从服务器已经上传的EXCEL模板中下载模板然后打开修改实现数据保存 当然 也可以直接
  • springboot中的kafka的KafkaTemplate的配置类

    package com lf report utils import org apache kafka clients producer ProducerConfig import org apache kafka common seria
  • opencv 智能答卷识别系统(一)

    目标 这里是2 智能答卷之别系统二 识别答卷答案 识别准号证号码 识别姓名 识别试卷类别 试卷是有标记的 如试卷上方的黑框 排序结构 使用c 的标准排序算法 struct Ruley bool operator const Rect a1