opencv 智能答卷识别系统

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 智能答卷识别系统相关的知识,希望对你有一定的参考价值。

目标

这里是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这种答案,多选识别
未完待续

以上是关于opencv 智能答卷识别系统的主要内容,如果未能解决你的问题,请参考以下文章

opencv ORB特征匹配

opencv 模板匹配

Python OpenCV开发MR智能人脸识别打卡系统(三工具模块设计)

Python OpenCV开发MR智能人脸识别打卡系统(四服务模块设计)

Python OpenCV开发MR智能人脸识别打卡系统(五程序入口设计与测试)

opencv AKAZE 局部特征匹配算法