opencv+C++ 获取试卷中填空线段

目标:获取试卷中的填空线位置,为后续的自动判卷进行定位。
方法: 形态学处理+霍夫变换。
待处理图像:
在这里插入图片描述

1.假如直接对待处理图像进行霍夫直线检测,效果如下:在这里插入图片描述
可以看到,会存在检测长度不足甚至漏检的情况,效果很不好。

2.下面使用形态学先对图片进行处理后再结合霍夫变换,效果如下:
在这里插入图片描述
检测效果明显提升。

具体操作流程及代码:
1.操作流程:
(1)图像ROI获取
在这里插入图片描述
(2)图像二值化
在这里插入图片描述
(3)形态学处理:使用横向直线结构体去除图片中非直线部分
在这里插入图片描述
(4)膨胀,得到效果更好的直线
在这里插入图片描述
(5)霍夫直线检测并显示到原图中
在这里插入图片描述

2.实现代码:

#include "stdafx.h"
#include<opencv2/opencv.hpp>
#include<iostream>
#include "math.h"

using namespace std;
using namespace cv;

Mat src, dst, roiImage;
char* input = "input Image";
char* output = "output Image";
void morhpologyLines(int,void*);

int _tmain(int argc, _TCHAR* argv[])
{
	src = imread("D:/pictures/ftest.png");
	if (src.empty())
	{
		printf("could not found Img...");
		return -1;
	}
	namedWindow(input, CV_WINDOW_AUTOSIZE);
	namedWindow(output, CV_WINDOW_AUTOSIZE);
	imshow(input, src);
	Rect roi = Rect(10, 10, src.cols - 20, src.rows - 20);
	roiImage = src(roi);
	imshow("ROI", roiImage);
	morhpologyLines(0, 0);
	waitKey(0);
	return 0;
}
void morhpologyLines(int, void*)
{
	//binary image
	Mat binaryImage, morhpImage;
	cvtColor(roiImage, roiImage, CV_BGR2GRAY);
	threshold(roiImage, binaryImage, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	imshow("binary",binaryImage);

	//morphology operation
	Mat kernel = getStructuringElement(MORPH_RECT, Size(40, 1), Point(-1, -1));
	morphologyEx(binaryImage, morhpImage, MORPH_OPEN, kernel, Point(-1, -1));
	imshow("morphology",morhpImage);

	kernel = getStructuringElement(MORPH_RECT, Size(3, 3),Point(-1,-1));
	dilate(morhpImage, morhpImage, kernel);
	imshow("morphologys",morhpImage);

	//hough lines
	vector<Vec4i>lines;
	HoughLinesP(morhpImage, lines, 1, CV_PI /180.0, 30, 30.0, 0);
	Mat resultImg = roiImage.clone();
	cvtColor(resultImg, resultImg, CV_GRAY2BGR);
	for (size_t t = 0; t < lines.size(); t++)
	{
		Vec4i ln = lines[t];
		line(resultImg, Point(ln[0], ln[1]), Point(ln[2], ln[3]),Scalar(0,0,255) ,2, 8, 0);
	}
	imshow(output, resultImg);
	return;
}

总结:
houghlinesp() : 渐进概率Hough变换,与houghlines()相似,但是有两个重要的区别,第一个是lines参数变为四通道(或者一个Vec4i类型的向量),四通道分别是找出的线段的两个端点的坐标,(x0,y0),(x1,y1)(按顺序)。第二个重要的区别是最后两个参数的含义,minlineLength设置了返回线段的最小长度,maxLineGap设置了共线线段间的最小间隔,防止算法把他们连为一条线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值