#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
Mat src,roiImage,dst;
void morhpologyLines(int, void*);
int main(int argc, char** argv)
{
//读图像 灰度
src = imread("C:/Users/lenovo/Desktop/open cv/案例/2.1.png",0);
if (src.empty())
{
cout << "图片文件不存在";
return -1;
}
namedWindow("1-原图", 1);
imshow("1-原图", src);
//去边,缩小区域 获取感兴趣区域
Rect roi = Rect(10, 10, src.cols - 20, src.rows - 20);
roiImage = src(roi);
imshow("2-获取感兴趣区域", roiImage);
//形态学操作
morhpologyLines(0, 0);
waitKey(0);
return 0;
}
void morhpologyLines(int, void*)
{
//二值化
Mat binary;
threshold(roiImage, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU); //二值取反加自动阈值
imshow("3-二值化", binary);
//开操作 去掉字母
Mat kernel = getStructuringElement(MORPH_RECT, Size(35, 1), Point(-1, -1)); //获取结构元素,保留直线
morphologyEx(binary, binary, MORPH_OPEN, kernel, Point(-1, -1));
imshow("4-形态学开操作", binary);
//膨胀操作 直线变粗
kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
dilate(binary, binary, kernel, Point(-1, -1));
imshow("5-膨胀操作", binary);
//霍夫直线绘制
vector<Vec4i> lines;
HoughLinesP(binary, lines, 1, CV_PI / 180.0, 30, 20.0, 0);
Mat result;
result = roiImage.clone();
cvtColor(result, result, COLOR_GRAY2BGRA);
for (size_t t = 0; t < lines.size(); t++)
{
Vec4i ln = lines[t];
line(result, Point(ln[0], ln[1]), Point(ln[2], ln[3]), Scalar(0, 0, 255), 2, 8);
}
imshow("6-霍夫直线显示结果", result);
}
小案例-英语填空直线检测
最新推荐文章于 2020-08-02 13:32:31 发布