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 智能答卷识别系统的主要内容,如果未能解决你的问题,请参考以下文章
Python OpenCV开发MR智能人脸识别打卡系统(三工具模块设计)
Python OpenCV开发MR智能人脸识别打卡系统(四服务模块设计)