【问题标题】:OpenCV Python: Detecting lines only in ROIOpenCV Python:仅在 ROI 中检测线
【发布时间】:2018-11-07 13:11:06
【问题描述】:

我想检测感兴趣区域内的线条。我的输出图像应显示原始图像和所选 ROI 中检测到的线条。到目前为止,在原始图像中查找线条或选择 ROI 都不是问题,但仅在 ROI 内查找线条不起作用。我的 MWE 读取图像,将其转换为灰度并让我选择 ROI,但当 HoughLinesP 想要读取 roi 时会出错。

import cv2
import numpy as np

img = cv2.imread('example.jpg',1)
gray = cv2.cvtColor(img ,cv2.COLOR_BGR2GRAY)

# Select ROI
fromCenter = False
roi = cv2.selectROI(gray, fromCenter)

# Crop ROI
roi = img[int(roi[1]):int(roi[1]+roi[3]), int(roi[0]):int(roi[0]+roi[2])]

# Find lines
minLineLength = 100
maxLineGap = 30
lines = cv2.HoughLinesP(roi,1,np.pi/180,100,minLineLength,maxLineGap)
for x in range(0, len(lines)):
    for x1,y1,x2,y2 in lines[x]:
        cv2.line(img,(x1,y1),(x2,y2),(237,149,100),2)

cv2.imshow('Image',img)
cv2.waitKey(0) & 0xFF

cv2.destroyAllWindows()

控制台显示:

lines = cv2.HoughLinesP(roi,1,np.pi/180,100,minLineLength,maxLineGap)

错误:OpenCV(3.4.1) C:\Miniconda3\conda-bld\opencv-suite_1533128839831\work\modules\imgproc\src\hough.cpp:441: 错误:(-215) image.type() == (((0) & ((1

我的假设是roi 的格式不正确。我将 Python 3.6 与 Spyder 3.2.8 一起使用。 感谢您的帮助!

【问题讨论】:

    标签: python opencv houghlinesp


    【解决方案1】:

    cv2.HoughLinesP 函数需要单通道图像,因此可以从灰度图像中获取裁剪区域,从而消除错误:

    # Crop the image
    roi = list(map(int, roi)) # Convert to int for simplicity
    cropped = gray[roi[1]:roi[1]+roi[3], roi[0]:roi[0]+roi[2]]
    

    请注意,我将输出名称从 roi 更改为 cropped,这是因为您仍然需要 roi 框。 x1x2y1y2 点是裁剪图像中的像素位置,而不是完整图像。要正确绘制图像,您只需从roi 添加左上角像素位置。 这是带有相关编辑的 for 循环:

    # Find lines
    minLineLength = 100
    maxLineGap = 30
    lines = cv2.HoughLinesP(cropped,1,np.pi/180,100,minLineLength,maxLineGap)
    for x in range(0, len(lines)):
        for x1,y1,x2,y2 in lines[x]:
            cv2.line(img,(x1+roi[0],y1+roi[1]),(x2+roi[0],y2+roi[1]),(237,149,100),2)
    

    【讨论】:

    • 更改cv2.line 的坐标是有意义的,谢谢! croppedgray 都是 dtype=uint8 的数组,只是长度不同,但 cv2.HoughLinesP(gray,...) 提供检测到的线的坐标,而 cv2.HoughLinesP(cropped,...) 只返回 None。你知道在哪里可以找到我的错误吗?
    • 这只是意味着在作物中没有发现任何线条。您可以在 for 循环之前添加 if lines is not None: 以防止出现此错误。如果您认为应该检测到线路,您可以尝试更改参数(minLineLengthmaxLineGap 等)。此外,在您的帖子中,您说您想在图像上运行HoughLinesP,但它可能有助于在精巧的边缘检测图像上运行它like shown in this tutorial
    • 非常感谢!在调整rho 内的rho 值后,它也可以工作HoughLinesP。它没有找到我想要的那么多行,但现在我的问题得到了回答。输入图像已经是一个精巧的边缘检测图像。
    猜你喜欢
    • 2012-07-27
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多