头文件包含错误导致的,在你的opencv中找到对应包含calcOpticalFlow函数的头文件,添加上即可。
在整个电脑找下这个 legacy.hpp呢。(可以下载个everything 软件,这是一个搜索文件的软件,调试vs的这种问题很有用)
如果有,那就是你的包含目录没配对,或者你include写错了。
这个可以参考下,具体怎么加包含目录。
如果没有这个文件,那估计就是你的opencv没下载完整。
https://blog.csdn.net/weixin_52336311/article/details/131216334
https://csdnimg.cn/release/notification/test0ecad1c1-d998-4da7-9803-8f839ff6b2b3.jpg
可能是你使用的OpenCV版本不包含该头文件导致的。在OpenCV 3之后的版本中,legacy模块已经被废弃
用这个代替试试
#include <opencv2/opencv.hpp>
#include <opencv2/video/tracking.hpp>
【相关推荐】
二维点的获取就是特征点的获取,因为的需求很简单, 只需要左右两个点和拐点就行,因此提取很简单,就不发出来了,主要说一下特征点是如何获得三维点的。
简单说就是根据前面的标定获得Q矩阵,即重投影矩阵,再根据重投影矩阵反求坐标
def getAngle(A1,B1,C1,A2,B2,C2):
Q = c_config.Q
print(Q)
cx = Q[0][3]
cy = Q[1][3]
print("cx = ", cx)
print("cy =", cy)
f = Q[2][3]
E = Q[3][3]
Tx = Q[3][2]
# Tx = 0.008333333
# Tx = 0.01667
print(f)
print(Tx)
print(E)
print("1=",A1,B1,C1)
print("2=", A2, B2, C2)
deep = np.array([A1[1]-A2[1],B1[1]-B2[1] , C1[1]-C2[1]])
print("deep=",deep)
w = deep * Tx + E
Z = f / w
y = np.array([A1[0], B1[0], C1[0]])
x = np.array([A1[1], B1[1], C1[1]])
X = (x + cx)/w
Y = (y + cy)/w
T = np.vstack((X, Y, Z)).T
print("T= ", T)
print(T[0])
print(T[1])
print(T[2])
A = np.array([T[0][0], T[0][1], T[0][2]])
B = np.array([T[1][0], T[1][1], T[1][2]])
C = np.array([T[2][0], T[2][1], T[2][2]])
BA = A-B
BC = C-B
print(BA, BC)
print(A,B,C)
cosangle = BA.dot(BC) / (np.linalg.norm(BA) * np.linalg.norm(BC))
# cosangle = cos_dist(BA,BC)
Lba = np.sum(np.linalg.norm(BA))
Lbc = np.sum(np.linalg.norm(BC))
print("BA.BC=",BA.dot(BC))
print("Lba=", Lba)
print("Lbc=", Lbc)
print("cos=", cosangle)
angle = np.arccos(cosangle)
print(np.degrees(angle))
ax = plt.subplot(111, projection='3d') # 创建一个三维的绘图工程
# 将数据点分成三部分画,在颜色上有区分度
ax.scatter(T[0][0], T[0][1], T[0][2], c='y') # 绘制数据点
ax.scatter(T[1][0], T[1][1], T[1][2], c='r')
ax.scatter(T[2][0], T[2][1], T[2][2], c='g')
ax.plot([A[0], B[0], C[0]], [A[1], B[1], C[1]], [A[2], B[2], C[2]], label='parametric curve')
ax.set_zlabel('Z') # 坐标轴
ax.set_ylabel('Y')
ax.set_xlabel('X')
plt.show()
重投影矩阵Q实现了世界坐标系{world}和像素坐标系{pixel}之间的转换。具体如下:
这里Q矩阵中的参数都是左相机的参数,除了Cx‘以外,但一般校正正确后,Cx = Cx’,所以Q矩阵的最后一项为0,然后用左图片的特征点跟视差求得三维坐标,并且这里默认世界坐标系是跟左相机坐标系重合的,如下:所示
其中d = Xl - Xr,Xl为左图片点像素坐标,Xr为右图片点像素坐标。
至此,就能获得特征点三维坐标。