如何在OpenCV中定位HoughLinesP的特定区域?

uqcuzwp8  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(141)

我试图针对视频的特定区域,使HoughLines不显示在视频的其他部分。我不知道如何做到这一点,但这里是我的代码到目前为止:

import cv2
import numpy as np
import window_names
import track_bars

frame_counter = 0

vid = 'rain.mkv'

cap = cv2.VideoCapture(vid)

while (True):
    ret, frame = cap.read()

    frame_counter += 1

    if frame_counter == cap.get(cv2.CAP_PROP_FRAME_COUNT):
        frame_counter = 0
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

    grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    output = np.empty(grey.shape, dtype=np.uint8)

    cv2.normalize(
        grey,
        output,
        alpha=0,
        beta=255,
        norm_type=cv2.NORM_MINMAX)

    hist = cv2.equalizeHist(output)

    track_bars.lower_threshold = cv2.getTrackbarPos("lower", window_names.window_canny)
    track_bars.upper_threshold = cv2.getTrackbarPos("upper", window_names.window_canny)
    track_bars.smoothing_neighbourhood = cv2.getTrackbarPos("smoothing", window_names.window_canny)
    track_bars.sobel_size = cv2.getTrackbarPos("sobel size", window_names.window_canny)

    track_bars.smoothing_neighbourhood = max(3, track_bars.smoothing_neighbourhood)
    if not (track_bars.smoothing_neighbourhood % 2):
        track_bars.smoothing_neighbourhood = track_bars.smoothing_neighbourhood + 1

    track_bars.sobel_size = max(3, track_bars.sobel_size)
    if not (track_bars.sobel_size % 2):
        track_bars.sobel_size = track_bars.sobel_size + 1

    smoothed = cv2.GaussianBlur(
        hist, (track_bars.smoothing_neighbourhood, track_bars.smoothing_neighbourhood), 0)

    edges = cv2.Canny(
        smoothed,
        track_bars.lower_threshold,
        track_bars.upper_threshold,
        apertureSize=track_bars.sobel_size)

    rho = 1  # distance resolution in pixels of the Hough grid
    theta = np.pi / 180  # angular resolution in radians of the Hough grid
    threshold = 15  # minimum number of votes (intersections in Hough grid cell)

    min_line_length = 50  # minimum number of pixels making up a line
    max_line_gap = 20  
    line_image = np.copy(frame) * 0

    lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
                        min_line_length, max_line_gap)

    if lines is not None:
        for x1, y1, x2, y2 in lines[0]:
            cv2.line(frame,(x1,y1),(x2,y2),(255,0,0),5)

    lines_edges = cv2.addWeighted(frame, 0.8, line_image, 1, 0)

    cv2.imshow(window_names.window_hough, frame)
    cv2.imshow(window_names.window_canny, edges)

    key = cv2.waitKey(27)
    if (key == ord('x')) & 0xFF:
        break

cap.release()
cv2.destroyAllWindows()

代码工作得很好,但我只是想让它的Houghlines不显示在其他部分,只是位,我选择。

kadbb459

kadbb4591#

我认为您可以通过指定遮罩来定义感兴趣区域(ROI),然后将其应用于Canny边缘检测的输出,以仅提取ROI中的边缘。

# Define ROI mask
mask = np.zeros_like(edges)
height, width = mask.shape[:2]
roi_left = width // 4
roi_right = 3 * width // 4
roi_top = height // 4
roi_bottom = 3 * height // 4
mask[roi_top:roi_bottom, roi_left:roi_right] = 1

# Apply mask to edges
roi_edges = cv2.bitwise_and(edges, edges, mask=mask)

然后将roi_edges图像而不是边缘传递给cv2.HoughLinesP()函数,以仅检测ROI中的线:

lines = cv2.HoughLinesP(roi_edges, rho, theta, threshold, np.array([]),
                    min_line_length, max_line_gap)

相关问题