英文:
OpenCV python: How do I draw a line using the gradient and the first point?
问题
我正在尝试使用OpenCV从实时视频流中绘制一条线。我使用一个帧并存储x、y坐标。我使用下一个帧的点的x、y坐标来计算斜率((y2-y1)/(x2-x1))。我想绘制一条从第一个坐标开始直通第二个坐标并继续的直线,从而绘制一个轨迹。我目前可以使用cv2.line()
在两点之间绘制一条直线。以下是我的代码。任何建议将不胜感激!谢谢
import cv2
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()
英文:
I am trying to draw a line using a live feed with opencv. I am using one frame and storing the x,y coordinates. I use the next frame's x,y coordinate of the point to work out the gradient ((y2-y1)/(x2-x1)). I want to draw a straight line from the first coordinate straight through the second and continue past which would draw a trajectory. I can currently draw a straight line between the two points using cv2.line()
. My code is below. Any suggestions would be wonderful! Thank you
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()
答案1
得分: 3
从这个答案中找到了一个解决方案,它是用C编写的,已转换为Python并根据您的用例进行了修改。
解决方案用于在给定两个点的情况下在图像中绘制无限线。
def slope(x1, y1, x2, y2):
###找到斜率
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':
### 这里我们实际上是将线段延伸到x=0和x=width,
### 并计算与之相关联的y
##起始点
px = 0
py = -(x1 - 0) * m + y1
##结束点
qx = w
qy = -(x2 - w) * m + y2
else:
### 如果斜率为零,则绘制一条线段,其中x=x1且y=0和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)`。
[1]: https://stackoverflow.com/a/23186665/9605907
英文:
Found a solution from this answer which was in c, Converted to python and modified for your usecase.
Solution to draw infinte line in image given two points.
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)
you can replace (px,py)
with (x1,y1)
or (qx,qy)
with (x2,y2)
according to your usecase.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论