python - OpenCV python:如何使用渐变和第一个点画一条线?

标签 python opencv line opencv-python

我正在尝试使用带有opencv的实时供稿来画一条线。我正在使用一帧并存储x,y坐标。我使用下一帧的点的x,y坐标计算出渐变((y2-y1)/(x2-x1))。我想从第一个坐标一直到第二个坐标绘制一条直线,然后继续过去,这将绘制一条轨迹。我目前可以使用cv2.line()在两点之间绘制一条直线。我的代码如下。任何建议将是美好的!谢谢

import numpy as np
import math
import matplotlib.pyplot as plt

lower_red = np.array([-10,160,160])
upper_red = np.array([10,255,255])

oX, oY = 0,0

cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while(1):
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower_red, upper_red)
    #ret, thresh = cv2.threshold(mask, 80, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

    if len(contours) != 0:
        c = max(contours, key = cv2.contourArea)
        x1, y1, w, h = cv2.boundingRect(c)
        x2, y2 = x1 + w, y1 + h
        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
        x3, y3 = round((x1+x2)/2), round((y1+y2)/2)
        cv2.circle(frame, (x3,y3), 4, (255,0,0), 2)
        #print(x3, y3)

        if oX and oY != 0:
            try:
                angle = (x3-oX)/(y3-oY)
                cv2.line(frame,(oX,oY),(x3, y3),(0,255,255),2)
            except ZeroDivisionError:
                oX, oY = x3, y3

    oX, oY = x3, y3

    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)


    if cv2.waitKey(1) == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

最佳答案

从位于c中的answer找到了一个解决方案,转换为python并针对您的用例进行了修改。

给定两点在图像中画无限线的解决方案。

def slope(x1,y1,x2,y2):
    ###finding slope
    if x2!=x1:
        return((y2-y1)/(x2-x1))
    else:
        return 'NA'

def drawLine(image,x1,y1,x2,y2):

    m=slope(x1,y1,x2,y2)
    h,w=image.shape[:2]
    if m!='NA':
        ### here we are essentially extending the line to x=0 and x=width
        ### and calculating the y associated with it
        ##starting point
        px=0
        py=-(x1-0)*m+y1
        ##ending point
        qx=w
        qy=-(x2-w)*m+y2
    else:
    ### if slope is zero, draw a line with x=x1 and y=0 and y=height
        px,py=x1,0
        qx,qy=x1,h
    cv2.line(image, (int(px), int(py)), (int(qx), int(qy)), (0, 255, 0), 2)

您可以根据用例用(px,py)替换(x1,y1)或用(qx,qy)替换(x2,y2)

关于python - OpenCV python:如何使用渐变和第一个点画一条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59578855/

相关文章:

java - 检测文件中的行尾

python - Pygame绘制抗锯齿粗线

python - 基于现有字符串数组创建新的数字数组

python - +\Python 中的运算符

python - 如何使用 python 更快地读取文件中的几行?

python-3.x - Python中的颜色检测和比较

regex - Notepad++ : Cannot remove empty line

python - 如何创建一系列单词作为超参数进行迭代?

c++ - 我是否必须释放 New 在 C++ 接口(interface)的 Opencv C 包装器中分配的内存

python - OpenCV错误: Assertion failed (scn == 3 || scn == 4) in cvtColor