当前位置: 首页 > 知识库问答 >
问题:

Python opencv:在点之间画线并找到完整轮廓

龙德海
2023-03-14

我有一组三角形的三个点。例如:[[39037],[371179],[555179]]

绘制直线后,如何在OpenCV中的点之间绘制直线?

如何在我刚才画的线条之间找到完整的轮廓?

我一直收到以下错误:

    img = np.zeros([1000, 1000, 3], np.uint8)
    cv2.drawContours(img, triangle_vertices, 0, (0, 0, 0), -1)
    contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

错误:(-210:不支持的格式或格式组合)[Start]FindContours在模式下仅支持CV_8UC1图像!=CV_RETR_FLOODFILL仅在函数“cvStartFindContours_Impl”中支持CV_32SC1图像

共有1个答案

邢博涛
2023-03-14

我相信你的主要问题是你只能在二值图像上找到轮廓(不是颜色)。您的点还需要位于Numpy数组中(如x,y对——请注意逗号)。下面是我如何在Python/OpenCV中实现的。

import cv2
import numpy as np

# create black background image
img = np.zeros((500, 1000), dtype=np.uint8)

# define triangle points
points = np.array( [[390,37], [371,179], [555,179]], dtype=np.int32 )

# draw triangle polygon on copy of input
triangle = img.copy()
cv2.polylines(triangle, [points], True, 255, 1)

# find the external contours
cntrs = cv2.findContours(triangle, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]

# get the single contour of the triangle
cntr = cntrs[0]

# draw filled contour on copy of input
triangle_filled = img.copy()
cv2.drawContours(triangle_filled, [cntr], 0, 255, -1)

# save results
cv2.imwrite('triangle.jpg', triangle)
cv2.imwrite('triangle_filled.jpg', triangle_filled)

cv2.imshow('triangle', triangle)
cv2.imshow('triangle_filled', triangle_filled)
cv2.waitKey()

三角形多边形图像:

三角形填充轮廓图像:

 类似资料:
  • 我有DynamoDB的运动流。我正在通过aws KCL sdk v1.14.0进行处理。我看到下面日志中偶尔出现错误。我还注意到,对于dynamodb租约表中的所有碎片,startingHashKey始终为1,endingHashKey为0。有什么线索吗?

  • 我的布局如下所示: 我的要求是在和之间画一条水平线 有人能帮忙吗?

  • 问题内容: 我正在用Matplotlib绘制两个子图,基本上如下: 我可以在这两个子图之间画线吗?我该怎么办? 问题答案: 在许多情况下,其他答案的解决方案不是最优的(因为它们只有在计算出点数后未对图进行任何更改的情况下才会起作用)。 更好的解决方案将使用特别设计的:

  • 我试图在传单中的标记(从JSON数据生成)之间插入行。我看到了一个示例,但它不能使用JSON数据。我能看到标记,但没有线条出现。 我的JSON数据:

  • 我对传单很陌生。 我在传单上的地图上画了多个标记/圆圈标记。

  • 问题内容: 假设我有x1,y1,还有x2,y2。 我如何找到它们之间的距离?这是一个简单的数学函数,但是此在线代码段吗? 问题答案: dist = sqrt( (x2 - x1)2 + (y2 - y1)2 ) 正如其他人指出的那样,您也可以使用等效的内置函数: