opencv实例之检测试卷填空位置

应用场景

检测试卷填空题天空位置处的横线位置,能找到位置,可为下一步计算机识别答案打下基础


解决思路

使用图像形态学操作寻找直线,利用霍夫变化获取位置信息与显示,直接霍夫变换效果很差


代码演示

#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;
}

效果演示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值