【问题标题】:Remove small lines detected by OpenCV HoughLines删除 OpenCV HoughLines 检测到的小线条
【发布时间】:2017-12-01 13:02:41
【问题描述】:

我试图从嘈杂的图像中检测线条,结果我得到了太多线条。我需要多次遍历行,这对于这么多行来说太慢了,我只对足够长的行感兴趣。

我检测线条的代码如下:

// Edge detection
int lowThreshold = 35;
Canny(greyMat, dst, lowThreshold, lowThreshold * 3, 3);
cv::blur(dst, dst, cv::Size(2,2));
// Standard Hough Line Transform
std::vector<cv::Vec2f> lines; // will hold the results of the detection
HoughLines(dst, lines, 1, rho_resolution, 150, 0, 0 ); // runs the actual detection

我的源图片是

Canny 生成的图像是

HoughLines 将检测 100 条线,我只对中间形成矩形的长线感兴趣。如何删除短线?如果我提高 Canny 阈值,则无法检测到我需要的某些行。

【问题讨论】:

  • 您可以使用HoughLinesP。第 6 个参数是要检测的最小行长度
  • 如果你想得到红色矩形,你可以试试findContoursboundingRect/minAreaRect
  • @Silencer 这就是我想要的,但是当我尝试检测电视屏幕时,有时边缘会因颜色渗出而模糊。首先尝试使用 findContours 直接检测矩形,但不起作用,现在尝试从线条中找出矩形。
  • @superg 你应该做一些预处理,例如GaussBlurmorphologyEx 以减少噪音。而且您没有发布原始图像,因为很难决定使用哪种方法。
  • @Silencer 实际上第一个是“原始”图像。它是来自捕获的视频的累积差异数据。电视屏幕上的任何动作基本上最终都会使像素变红。 OpenCV erode 功能可能会在 Canny 之前去除细线,会试一试。

标签: opencv hough-transform canny-operator


【解决方案1】:

模糊图像以减少帧中的噪点或小细节,它对我有用。

kernel = np.ones((5, 5), np.float32) / 25    
smoothed = cv2.filter2D(frame, -1, kernel)

gray=cv2.cvtColor(smoothed, cv2.COLOR_BGR2GRAY)

edge=cv2.Canny(gray, 100, 150)

lines = cv2.HoughLines(edge, 1, np.pi / 180, 200)
print(lines)

【讨论】:

    【解决方案2】:

    一般的方法是模糊图像,这样做是为了确保图像中的噪声被抑制,只留下待检测物体的实际边缘。

    使用的方法类型取决于图像。您可以在提取边缘之前尝试使用中值或/和高斯滤波器并检查是否发现任何改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-20
      • 2013-03-30
      • 1970-01-01
      • 2019-09-28
      • 2018-10-21
      • 1970-01-01
      • 2015-03-12
      • 2018-03-15
      相关资源
      最近更新 更多