gpt4 book ai didi

opencv - 查找图像中指向一个方向的所有线

转载 作者:太空宇宙 更新时间:2023-11-03 22:45:20 24 4
gpt4 key购买 nike

我正试图想出一个过滤器,它只会显示指向一个方向的线。

假设我们有这样的原始图像: Original Image

我需要应用什么过滤器才能只选择垂直线。就像这里用红色突出显示的那些。 Red Highlight on Vertical lines

此过滤器是否可以通用以允许我选择其他方向?例如,从左下角到右上角的对角线。

最佳答案

最直接(虽然不是最快)的解决方案是使用霍夫变换来检测直线,然后测量直线的斜率,只留下垂直的。

请先看看本教程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);
}

这会产生以下结果: Result请记住,输出中有多行合并在一起。如果你想要垂直只有一条线,你必须首先对图像进行骨架化,这样所有的东西都是 1px 厚,或者尝试对结果进行一些智能过滤。

关于opencv - 查找图像中指向一个方向的所有线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48412374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com