Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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
Can';使用opencv&;绘制相机校准和三维重建中的极线;python_Python_Opencv_Computer Vision_Camera Calibration_Opencv3.1 - Fatal编程技术网

Can';使用opencv&;绘制相机校准和三维重建中的极线;python

Can';使用opencv&;绘制相机校准和三维重建中的极线;python,python,opencv,computer-vision,camera-calibration,opencv3.1,Python,Opencv,Computer Vision,Camera Calibration,Opencv3.1,在我通过摄像机校准生成了基本矩阵和基本矩阵之后,我试图得到极线,并在我的图像中绘制它们来测试我生成的矩阵,如下所示 以下是实现绘制极线功能的代码: def drawlines(img1,img2,lines,pts1,pts2): ''' img1 - image on which we draw the epilines for the points in img2 lines - corresponding epilines

在我通过摄像机校准生成了基本矩阵和基本矩阵之后,我试图得到极线,并在我的图像中绘制它们来测试我生成的矩阵,如下所示

以下是实现绘制极线功能的代码:

    def drawlines(img1,img2,lines,pts1,pts2):
        ''' img1 - image on which we draw the epilines for the points in img2
            lines - corresponding epilines 
        '''
        r,c = img1.shape
        img1 = cv2.cvtColor(img1,cv2.COLOR_GRAY2BGR)
        img2 = cv2.cvtColor(img2,cv2.COLOR_GRAY2BGR)
        for r,pt1,pt2 in zip(lines,pts1,pts2):
            color = tuple(np.random.randint(0,255,3).tolist())
            x0,y0 = map(int, [0, -r[2]/r[1] ])
            x1,y1 = map(int, [c, -(r[2]+r[0]*c)/r[1] ])
            img1 = cv2.line(img1, (x0,y0), (x1,y1), color,1)
            img1 = cv2.circle(img1,tuple(pt1),5,color,-1)
            img2 = cv2.circle(img2,tuple(pt2),5,color,-1)
        return img1,img2
但是当我运行下面的代码来生成极线时,我得到了这个错误:

回溯(最后一次调用):文件“FundMat.py”,第124行,
在img5中,img6=绘图线(img1、img2、lines1、pts1、pts2)文件 “FundMat.py”,第21行,在抽绳中 img1=cv2.圆(img1,元组(pt1),5,颜色,-1)
TypeError:函数只接受2个参数(给定1个)


那么,我为什么会出现这个错误,以及如何解决它呢?

您的点的格式与OpenCV想要的格式不同。您的
pt1
pt2
可能看起来像
np.array([[x,y]])
,但是当您投射元组时,它看起来像什么:

>>> pt1 = np.array([[50, 50]])
>>> tuple(pt1)
(array([50, 50]),)
这是一个只有一个元素的元组,而不是您所期望的两个项。显然,对于绘图,它需要长度为2的元组(即
x
y
坐标)。因此出现了错误;内部函数需要两个参数,但元组中只有一个值。证明:

>>> pt1 = np.array([[50, 50]])
>>> cv2.circle(img, tuple(pt1), 5, 255, -1)
假设您希望能够处理以任何一种格式传递的点,只需首先重塑该点。无论哪种方式,在
pt1
pt2
数组中只有两个值,因此重塑不会影响它。例如,您可以使用numpy的
flatte()

>>> tuple(pt1.flatten())
(50, 50)
这会解决你的问题

>>> pt1 = np.array([[50, 50]])
>>> cv2.circle(img, tuple(pt1.flatten()), 5, 255, -1)
>>> 

您只为OpenCV添加了一个特定于版本的标记,而不是常规的
OpenCV
标记,这意味着您的问题在深渊中迷失了方向。堆栈上的应答者订阅特定的标签,这样他们就可以很容易地找到问题,而特定版本的问题就不那么流行了。如果您觉得问题可能与版本有关,请随意使用特定于版本的标记,但请始终包括用于曝光的一般标记,以便更多人实际看到您的问题。这就是为什么没有人回答这个问题,尽管这是一个简单的解决办法。
>>> tuple(pt1.flatten())
(50, 50)
>>> pt1 = np.array([[50, 50]])
>>> cv2.circle(img, tuple(pt1.flatten()), 5, 255, -1)
>>>