OPENCV- TypeError: integer argument expected, got float

OPENCV- TypeError: integer argument expected, got float

伙计们,我正在尝试学习这个快速教程。 我也在努力学习我们输入的每一个代码。 但是我得到了一个错误。我正在努力学习每一个代码,所以你能告诉我为什么会出现这个错误吗?以及如何解决这个错误?

我得到 def draw_lines(img, lines, color=[255, 0, 0], thickness=3):[= 函数错误15=]

我得到的错误:

File "C:\Users\alpgu\Desktop\opencv\yolboyama.py", line 112, in poly_left = np.poly1d(np.polyfit(

File "<array_function internals>", line 5, in polyfit

File "C:\Users\alpgu\anaconda3\lib\site-packages\numpy\lib\polynomial.py", line 599, in polyfit raise TypeError("expected non-empty vector for x")

TypeError: expected non-empty vector for x

我认为问题出在::

这一行
poly_left = np.poly1d(np.polyfit(
        left_line_y,
        left_line_x,
        deg=1
    ))

为什么会这样?

备注==> 当我更改我的最大 x 和最小 y 代码时(你说它应该是 int 所以我试图更改我的代码。我也尝试做 int 但它给出了另一个错误。所以我不明白我应该知道什么?)::

min_y = int(yol_resmi.shape * (3 / 5)) # <-- Just below the horizon
    max_y = int(yol_resmi.shape)

给出了

的错误

TypeError: can't multiply sequence by non-int of type 'float'

问题是关于我的 max_x - min_y 值还是关于我的 polly_left 值?

我的所有代码:

from os.path import sep
import cv2
import numpy as np
import math

cap = cv2.VideoCapture('photos' + sep + 'roads.mp4')

while(cap.isOpened()):
    ret, yol_resmi = cap.read()
    
    # Define a blank matrix that matches the image height/width.
    def region_of_interest(img, vertices):
        mask = np.zeros_like(img)
        
        channel_count = yol_resmi.shape[2]
        
        match_mask_color = (255,) * channel_count
        
        cv2.fillPoly(mask, vertices, match_mask_color)
        
        masked_image = cv2.bitwise_and(img, mask)
        return masked_image
    
    height, width, channel = yol_resmi.shape 
    
    region_of_interest_vertices = [
        (0, height),
        (width / 2, height / 2),
        (width, height),
    ]
    
    def draw_lines(img, lines, color=[255, 0, 0], thickness=3):
        line_img = np.zeros(
            (
                img.shape[0],
                img.shape[1],
                3
            ),
            dtype=np.uint8
        )
        img = np.copy(img)
        if lines is None:
            return
        for line in lines:
            for x1, y1, x2, y2 in line:
                cv2.line(line_img, (x1, y1), (x2, y2), color, thickness)
        img = cv2.addWeighted(img, 0.8, line_img, 1.0, 0.0)
        return img
    
    #COLOR_BGR2GRAY ekle
    gray_image = cv2.cvtColor(yol_resmi, cv2.COLOR_RGB2GRAY)
    cannyed_image = cv2.Canny(gray_image, 200, 300)
    cropped_image = region_of_interest(
        cannyed_image,
        np.array(
            [region_of_interest_vertices],
            np.int32
        ),
    )
    lines = cv2.HoughLinesP(
        cropped_image,
        rho=6,
        theta=np.pi / 60,
        threshold=160,
        lines=np.array([]),
        minLineLength=40,
        maxLineGap=25
    )
    print(lines)
    
    line_image = draw_lines(yol_resmi, lines)
    
    left_line_x = []
    left_line_y = []
    right_line_x = []
    right_line_y = []
    
    for line in lines:
        for x1, y1, x2, y2 in line:
            slope = (y2 - y1) / (x2 - x1) # <-- Calculating the slope.
            if math.fabs(slope) < 0.5: # <-- Only consider extreme slope
                continue
            if slope <= 0: # <-- If the slope is negative, left group.
                left_line_x.extend([x1, x2])
                left_line_y.extend([y1, y2])
            else: # <-- Otherwise, right group.
                right_line_x.extend([x1, x2])
                right_line_y.extend([y1, y2])
    min_y = yol_resmi.shape[0] * (3 / 5) # <-- Just below the horizon
    max_y = yol_resmi.shape[0] # <-- The bottom of the image
    poly_left = np.poly1d(np.polyfit(
        left_line_y,
        left_line_x,
        deg=1
    ))
    left_x_start = int(poly_left(max_y))
    left_x_end = int(poly_left(min_y))
    poly_right = np.poly1d(np.polyfit(
        right_line_y,
        right_line_x,
        deg=1
    ))
    right_x_start = int(poly_right(max_y))
    right_x_end = int(poly_right(min_y))
    line_image = draw_lines(
        yol_resmi,
        [[
            [left_x_start, max_y, left_x_end, min_y],
            [right_x_start, max_y, right_x_end, min_y],
        ]],
        thickness=5,
    )
    
    # Convert to grayscale here.
    #gray_image = cv2.cvtColor(cropped_image, cv2.COLOR_RGB2GRAY)
    
    # Call Canny Edge Detection here.
    #cannyed_image = cv2.Canny(gray_image, 100, 200)
    
    #cv2.imshow('yol resmi', yol_resmi)
    cv2.imshow('edge detection', cropped_image)
    cv2.imshow('line detection', line_image)
    #cv2.imshow('Edge Detection', cannyed_image)
    
    cv2.waitKey(1)

这就是我所能做的:

from os.path import sep
import cv2
import numpy as np
import math
import warnings

cap = cv2.VideoCapture('photos' + sep + 'roads.mp4')

while cap.isOpened():
    ret, yol_resmi = cap.read()

    # Define a blank matrix that matches the image height/width.
    def region_of_interest(img, vertices):
        mask = np.zeros_like(img)

        channel_count = yol_resmi.shape[2]

        match_mask_color = (255,) * channel_count

        cv2.fillPoly(mask, vertices, match_mask_color)

        masked_image = cv2.bitwise_and(img, mask)
        return masked_image


    height, width, channel = yol_resmi.shape

    region_of_interest_vertices = [
        (0, height),
        (width / 2, height / 2),
        (width, height),
    ]


    def draw_lines(img, lines, color=[255, 0, 0], thickness=3):
        line_img = np.zeros(
            (
                img.shape[0],
                img.shape[1],
                3
            ),
            dtype=np.uint8
        )
        img = np.copy(img)
        if lines is None:
            return
        for line in lines:
            for x1, y1, x2, y2 in line:
                print(type(x1), type(x2), type(y1), type(y2))
                cv2.line(line_img, (x1, y1), (x2, int(y2)), color, thickness)
        img = cv2.addWeighted(img, 0.8, line_img, 1.0, 0.0)
        return img


    # COLOR_BGR2GRAY ekle
    gray_image = cv2.cvtColor(yol_resmi, cv2.COLOR_RGB2GRAY)
    cannyed_image = cv2.Canny(gray_image, 200, 300)
    cropped_image = region_of_interest(
        cannyed_image,
        np.array(
            [region_of_interest_vertices],
            np.int32
        ),
    )
    lines = cv2.HoughLinesP(
        cropped_image,
        rho=6,
        theta=np.pi / 60,
        threshold=160,
        lines=np.array([]),
        minLineLength=40,
        maxLineGap=25
    )
    print(lines)
    print(len(lines))

    line_image = draw_lines(yol_resmi, lines)

    left_line_x = [0, 0]
    left_line_y = [0, 0]
    right_line_x = [0, 0]
    right_line_y = [0, 0]

    for line in lines:
        for x1, y1, x2, y2 in line:
            slope = (y2 - y1) / (x2 - x1)  # <-- Calculating the slope.
            if math.fabs(slope) < 0.5:  # <-- Only consider extreme slope
                continue
            if slope <= 0:  # <-- If the slope is negative, left group.
                left_line_x = [x1, x2]
                left_line_y = [y1, y2]
            else:  # <-- Otherwise, right group.
                right_line_x = [x1, x2]
                right_line_y = [y1, y2]
    min_y = yol_resmi.shape[0] * (3 / 5)  # <-- Just below the horizon
    max_y = yol_resmi.shape[0]  # <-- The bottom of the image
    try:
        poly_left = np.poly1d(np.polyfit(
            left_line_y,
            left_line_x,
            deg=1
        ))
        left_x_start = int(poly_left(max_y))
        left_x_end = int(poly_left(min_y))
        poly_right = np.poly1d(np.polyfit(
            right_line_y,
            right_line_x,
            deg=1
        ))
        right_x_start = int(poly_right(max_y))
        right_x_end = int(poly_right(min_y))
    except np.linalg.LinAlgError as e:
        warnings.warn("There is no lines in chosen region")
        cv2.imshow('line detection', yol_resmi)
        cv2.waitKey(1)
        continue
    line_image = draw_lines(
        yol_resmi,
        [[
            [left_x_start, max_y, left_x_end, min_y],
            [right_x_start, max_y, right_x_end, min_y],
        ]],
        thickness=5,
    )

    # Convert to grayscale here.
    # gray_image = cv2.cvtColor(cropped_image, cv2.COLOR_RGB2GRAY)

    # Call Canny Edge Detection here.
    # cannyed_image = cv2.Canny(gray_image, 100, 200)

    # cv2.imshow('yol resmi', yol_resmi)
    cv2.imshow('edge detection', cropped_image)
    cv2.imshow('line detection', line_image)
    # cv2.imshow('Edge Detection', cannyed_image)

    cv2.waitKey(1)