C++ 如何强制approxPolyDP()仅返回最佳的4个角点?-Opencv 2.4.2
这个问题说明了一切C++ 如何强制approxPolyDP()仅返回最佳的4个角点?-Opencv 2.4.2,c++,image-processing,opencv,artificial-intelligence,C++,Image Processing,Opencv,Artificial Intelligence,这个问题说明了一切 我有一些等高线,我想从中得到最好的四边形,你必须使用嵌套区间的方法为epsilon找到一个合适的值,因为点的数量随着epsion的减少而增加。但可能无法达到4个角点的值,因为在一定的ε值下,点的数量可能从3跳到5 如果要排除这种情况,可能需要自己实现Ramer–Douglas–Peucker算法并对其进行修改,以便返回给定数量的点。(顺便说一句,您要求的是“最佳”4个角。您必须指定最佳的含义。approxPolyDp()并不要求最佳解决方案!) 除此之外,我认为没有办法强制a
我有一些等高线,我想从中得到最好的四边形,你必须使用嵌套区间的方法为
epsilon
找到一个合适的值,因为点的数量随着epsion
的减少而增加。但可能无法达到4个角点的值,因为在一定的ε值下,点的数量可能从3跳到5
如果要排除这种情况,可能需要自己实现Ramer–Douglas–Peucker算法并对其进行修改,以便返回给定数量的点。(顺便说一句,您要求的是“最佳”4个角。您必须指定最佳的含义。approxPolyDp()
并不要求最佳解决方案!)
除此之外,我认为没有办法强制
approxPolyDP()
返回4分 我对圆角卡有一个问题,即使我得到approxPolyDP()
只返回4个点/边,它也从来不是最好的,因为经常选择“角”来更接近这些圆角。我的解决方案是增加沿着拐角返回的点数,然后我的问题允许我相对安全地假设找到的四条最长边代表边。将这四条最长的边按顺序排列,找出每对边的交点,就得到了四边形的点
作为奖励,您已经有了长度,因此您可以按正确的顺序将点输入透视变换,这样它就不会被挤压和拉伸到错误的方向。我相信您可以对
ε
值执行二进制搜索,以找到最佳简化
守则:
def simplify_contour(contour, n_corners=4):
'''
Binary searches best `epsilon` value to force contour
approximation contain exactly `n_corners` points.
:param contour: OpenCV2 contour.
:param n_corners: Number of corners (points) the contour must contain.
:returns: Simplified contour in successful case. Otherwise returns initial contour.
'''
n_iter, max_iter = 0, 100
lb, ub = 0., 1.
while True:
n_iter += 1
if n_iter > max_iter:
return contour
k = (lb + ub)/2.
eps = k*cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, eps, True)
if len(approx) > n_corners:
lb = (lb + ub)/2.
elif len(approx) < n_corners:
ub = (lb + ub)/2.
else:
return approx
def simplify_轮廓(轮廓,n_角=4):
'''
二进制搜索最佳“epsilon”值以强制轮廓
近似值正好包含“n_角点”点。
:参数轮廓:打开CV2轮廓。
:param n_corners:轮廓必须包含的角数(点)。
:返回:成功案例中的简化轮廓。否则返回初始轮廓。
'''
n_iter,max_iter=01100
lb,ub=0,1。
尽管如此:
n_iter+=1
如果n_iter>max_iter:
回程曲线
k=(磅+磅)/2。
eps=k*cv2.弧长(等高线,真)
近似值=cv2.近似聚合度(轮廓、eps、真实值)
如果长度(近似值)>n_角:
磅=(磅+磅)/2。
elif透镜(近似值)
这是个不错的方法。