我想从现有的轮廓列表创建四边形轮廓列表。我对编码相当陌生,所以请耐心等待我尝试的代码,我将用它来演示目标。
#Get Contours from an Image
(contours,hierarchy) = cv2.findContours(image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#Work in progress
def ListQuads(contours,c=0):
l = len(contours) #Gets total number of contours
while l > c:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
if len(approx) == 4:
Quads[c] = approx
c = c + 1
return Quads
Quads = ListQuads(contours)
最佳答案
在 Python 中通常完成此操作的方式是使用推导式:
approximations = [cv2.approxPolyDP(c, 0.02 * cv2.arcLength(c, True), True)
for c in contours]
quads = [apx for apx in approximations if len(apx) == 4]
您甚至可以通过在 quads
理解中嵌套近似值
,在单个语句中获得此结果,但这不会提高可读性。
只有当读取变得更容易时,在 Python 中保存写入才被认为是可以的。
请注意,您还可以使用生成器表达式来代替第一个表达式的推导式,方法是使用正则括号 (...)
而不是方括号 [...]
周围。
在这种情况下,其含义是使近似值
的计算变得“惰性”,如果原始列表很长,则可以节省内存。
关于Python 从现有列表创建新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31642017/