首页 文章

OpenCV Python:仅在ROI中检测行

提问于
浏览
0

我想检测一个感兴趣区域内的线条 . 我的输出图像应显示原始图像和所选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 << 3) - 1))(((1)-1)<< 3))in function cv :: HoughLinesProbabilistic

我的假设是 roi 没有正确的格式 . 我使用Python 3.6与Spyder 3.2.8 . 谢谢你的帮助!

1 回答

  • 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 ,并且's because you'仍然需要 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)
    

相关问题