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)
>>>