c++实现hs光流法报错未定义标识符

img


为啥使用c++的这个函数会报错呢?用的是2413版本的opencv,想使用hs光流法,按照有些博客上面的说了添加了一个头文件,又显示源文件打不开这种错误,如果有人懂得话麻烦告知

img

头文件包含错误导致的,在你的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>

【相关推荐】



  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7780799
  • 这篇博客你也可以参考下:关于opencv更改摄像头参数(帧率,分辨率,曝光度……)的几个问题
  • 您还可以看一下 夏曹俊老师的C++ 11 14 17 20内存管理-指针、智能指针和内存池课程中的 示例指针操作二维数组对opencv灰度图做反色小节, 巩固相关知识点
  • 除此之外, 这篇博客: opencv双目视觉标定,激光结构光提取,指定特征点获取世界坐标中的 二维点转换为三维点 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    二维点的获取就是特征点的获取,因为的需求很简单, 只需要左右两个点和拐点就行,因此提取很简单,就不发出来了,主要说一下特征点是如何获得三维点的。
    简单说就是根据前面的标定获得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为右图片点像素坐标。
    至此,就能获得特征点三维坐标。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^