写在前面
一般提取水平竖直线都是相对于二值图像来说的,要先对原始图像二值化处理。
代码只跑找到竖线的算法(横线换一个结构体就行了)
代码
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("A:\\专用\\TestForTheCV\\class13水平垂直线.jpg");
imshow("图片", src);
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2GRAY);
Mat binary_src;
adaptiveThreshold(gray_src, binary_src, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
//定义两个结构体,分别是横线和竖线
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows/10), Point(-1, -1));
//进行开操作
Mat dst;
erode(binary_src, dst, hline);
dilate(dst, dst, hline);
//直接开操作
Mat dstt;
morphologyEx(binary_src, dstt, CV_MOP_OPEN, vline);
//为了好看,咱们将图像反色,然后做一下均值滤波,更圆滑
bitwise_not(dstt, dstt);
imshow("result", dstt);
blur(dstt, dstt, Size(3, 3));
imshow("result after bluring", dstt);
waitKey(0);
return 0;
}
结果