使用opencv& amp; amp;相位校准和3D重建不能绘制极线。蟒

时间:2017-11-22 08:04:58

标签: python opencv computer-vision camera-calibration opencv3.1

在我从相机校准生成基本和基本矩阵后,我试图获取极线,并在我的图像中绘制它们以测试我生成的矩阵,遵循python-opencv tutorial

这是用于绘制绘图极线函数的代码:

    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 = drawlines(img1,img2,lines1,pts1,pts2)文件   " FundMat.py",第21行,在画线中         img1 = cv2.circle(img1,tuple(pt1),5,color,-1)
     TypeError:function只需要2个参数(给定1个)

那么,为什么我得到这个错误以及如何解决它?

1 个答案:

答案 0 :(得分:0)

您的积分与OpenCV想要的格式不同。您的pt1pt2可能看起来像np.array([[x, y]]),但看看你投下它时的元组是什么样的:

>>> pt1 = np.array([[50, 50]])
>>> tuple(pt1)
(array([50, 50]),)

这是一个包含单个元素的元组,而不是您期望的两个项目。显然,对于绘图,它需要一个长度为2的元组(即xy坐标)。因此错误;内部函数需要两个参数,但元组中只有一个值。为了证明:

>>> pt1 = np.array([[50, 50]])
>>> cv2.circle(img, tuple(pt1), 5, 255, -1)
Traceback (most recent call last):  
  File "...", line 10, in <module>  
    cv2.circle(img, tuple(pt1), 5, 255, -1) TypeError: function takes exactly 2 arguments (1 given)

相反,这就是你想要元组的样子:

>>> tuple(pt1[0])
(50, 50)

假设您希望能够处理以任一格式传递的点数,请先重塑该点。无论哪种方式,pt1pt2数组中只有两个值,因此重塑不会影响它。对于例如你可以使用来自numpy的flatten()

>>> tuple(pt1.flatten())
(50, 50)

这应该可以解决你的问题。

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