python - 确定两条线位置的有效方法
问题描述
我正在尝试确定两条线的位置,到目前为止使用 numpy,但如有必要,我愿意使用 opencv。
我正在使用 X 坐标的方法。所以在第一张图片中,你可以看到中心的斑点是每条线的 X 坐标平均值的位置。您可以清楚地看到红线在绿线的“左侧”(因为 mean_read < mean_green)
问题是当一些线条像右边的图片那样很小时。您可以直观地知道,红线仍然在绿线的“左侧”。但是,如果我们看到均值,这一次 mean_red > mean_green。
有没有更好的方法使用 numpy 甚至使用 opencv 来正确确定绿线在红线的右侧?
解决方案
如果线的交点对你来说并不重要,如果它们延伸,这个想法就有效。
im = cv2.imread(sys.path[0]+'/im.png')
gr = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
bw = cv2.threshold(gr, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
cnts, _ = cv2.findContours(~bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
gMid, g1, g2, gColor = None, None, None, (100, 255, 50)
rMid, r1, r2, rColor = None, None, None, (100, 50, 255)
for c in cnts:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(im, (x, y), (x+w, y+h), (127, 127, 127), 2)
ROI = im[y:y+h, x:x+w]
if np.mean(ROI[:, :, 1]) > np.mean(ROI[:, :, 2]): # Green line
g1, g2 = ((x, y), (x+w, y+h))[:2] if ROI[0, 0, 0] == 255 else ((x+w, y), (x, y+h))[:2]
gMid = (x+w//2, y+h//2)
else: # red line
r1, r2 = ((x, y), (x+w, y+h))[:2] if ROI[0, 0, 0] == 255 else ((x+w, y), (x, y+h))[:2]
rMid = (x+w//2, y+h//2)
# Draw coordinates of green line
for p in [gMid, g1, g2]:
cv2.circle(im, p, 20, gColor, 5)
# Draw coordinates of red line
for p in [rMid, r1, r2]:
cv2.circle(im, p, 20, rColor, 5)
# Swap (Sort) green line start and end points
if r1[0]>r2[0]:
r1,r2=r2,r1
# Swap (Sort) red line start and end points
if g1[0]>g2[0]:
g1,g2=g2,g1
if r1[0] < g1[0] and r2[0] < g2[0]:
print("x-axis --- Red line is left")
elif r1[0] > g1[0] and r2[0] > g2[0]:
print("x-axis --- Green line is left")
elif r1[0] > g1[0] and r2[0] < g2[0]:
print("x-axis --- Red is inside Green zone")
else:
print("Something else")
视觉输出:
打印输出:
# For left sample:
# x-axis --- Red line is left
# For right sample:
# x-axis --- Red is inside Green zone
现在可能会出现其他情况。如果我们继续这些线,如果它们不平行,它们将相交。如果您想知道这些线相对于彼此的位置。首先,您需要计算两条线的方程。然后对于交点,搜索LineLineIntersection找到相关的数学方程。
推荐阅读
- react-native - 如何在反应导航中实现此视图?
- asp.net - 在 asp.net 完整项目中禁用脚本
- python - tkinterhtml.HtmlFrame.set_content() 在使用 64 位 Python 时崩溃
- autodesk-forge - 如何在同一应用程序中加载两个伪造查看器(Angular Forge 查看器组件)
- javascript - what is (function(){}()) in object when i make a function
- android - 自定义圆形进度条
- sql - Convert character string into this specific date format?
- python - Why does calling np.array() on this list comprehension produce a 3d array instead of 2d?
- c# - Two Thread tasks in Winforms Continuously Checking Back
- c++ - cin >> ws vs cin.ignore(numeric_limits
::max(), '\n')?