答案 0 :(得分:1)
最简单(尽管不是最快)的解决方案是使用Hough变换来检测线条,然后测量线条的斜率并仅留下垂直线条。
请先查看本教程https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html。
这是一个代码示例,可以或多或少地解决您的问题。您可能需要调整一些参数以获得更好的结果:
std::vector<cv::Vec4i> extractVerticalLines(const std::vector<cv::Vec4i>& lines, int tollerance)
{
std::vector<cv::Vec4i> output;
for(const auto& line : lines)
{
// subtract x0 and x1 component (horizontal beginning and horizontal end)
if(std::abs(line[0] - line[2]) <= tollerance)
{
output.push_back(line);
}
}
return output;
}
void drawLines(cv::Mat& inputImage, const std::vector<cv::Vec4i>& lines, const cv::Scalar& color, int thickness)
{
for(const auto& line : lines)
{
cv::line(inputImage, cv::Point2i(line[0], line[1]), cv::Point2i(line[2], line[3]), color, thickness);
}
}
std::vector<cv::Vec4i> extractAllLines(const cv::Mat& image, int threshold, double minLength = 100)
{
std::vector<cv::Vec4i> lines;
cv::HoughLinesP(image, lines, 1, CV_PI / 180, threshold, minLength);
return lines;
}
int main()
{
auto image = cv::imread("lines.png", cv::IMREAD_GRAYSCALE);
auto output = cv::Mat(image.size(), image.type(), cv::Scalar::all(0));
image = ~image; // invert colors because background should be black and lines white
auto lines = extractAllLines(image, 50);
auto verticalLines = extractVerticalLines(lines, 5);
drawLines(output, verticalLines, cv::Scalar::all(255), 1);
cv::imshow("Result", output);
cv::waitKey(0);
}
这会产生以下结果: 请记住,在输出中有多行合并在一起。如果您希望垂直方向只有一条线,则必须首先对图像进行骨架化,以使所有内容都厚度为1px,或尝试对结果进行一些智能过滤。