应用场景
检测试卷填空题天空位置处的横线位置,能找到位置,可为下一步计算机识别答案打下基础
解决思路
使用图像形态学操作寻找直线,利用霍夫变化获取位置信息与显示,直接霍夫变换效果很差
代码演示
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
#define PIC_PATH "/work/opencv_pic/"
#define PIC_NAME "case2.jpeg"
Mat src,gray_src;
void morphpology_lines(void)
{
//图像二值化
Mat binary_img,morph_img;
//阈值自动
threshold(gray_src,binary_img,0,255,THRESH_BINARY_INV | THRESH_OTSU);
//显示二值图像
imshow("图像二值化",binary_img);
//图像开操作 过滤掉文字内容 只保留比较长的直线线段
Mat kernel = getStructuringElement(MORPH_RECT,Size(30,1),Point(-1,-1));
morphologyEx(binary_img,morph_img,MORPH_OPEN,kernel,Point(-1,-1));
//将获取到的元素进行膨胀 特征更加明显 利于后面进行特征提取
kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
dilate(morph_img,morph_img,kernel,Point(-1,-1));
//显示开操作后形态图
imshow("形态学操作图",morph_img);
//霍夫直线检测
vector<Vec4f> lines;
HoughLinesP(morph_img,lines,1,CV_PI/180.0,30,20);
Mat dst = src.clone();
for(size_t i=0;i<lines.size();i++)
{
Vec4f ln = lines[i];
line(dst,Point(ln[0],ln[1]),Point(ln[2],ln[3]),Scalar(0,0,255),2);
}
imshow("检测效果图",dst);
}
int main(void)
{
//获取完整的图片路径及名称
string pic = string(PIC_PATH)+string(PIC_NAME);
//打印图片路径
cout << "pic path is :"<<pic<<endl;
//读取图片
src = imread(pic);
//判断图片是否存在
if(src.empty())
{
cout<<"pic is not exist!!!!"<<endl;
return -1;
}
imshow("原图显示",src);
cvtColor(src,gray_src,COLOR_BGR2GRAY);
morphpology_lines();
waitKey(0);
destroyAllWindows();
return 0;
}