Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制approxPolyDP()仅返回最佳的4个角点?-Opencv 2.4.2_C++_Image Processing_Opencv_Artificial Intelligence - Fatal编程技术网

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透镜(近似值)
这是个不错的方法。