【问题标题】:How to apply a matrix to an image in opencv?如何将矩阵应用于opencv中的图像?
【发布时间】:2011-04-09 03:54:44
【问题描述】:

假设我有一些图像和一个旋转矩阵和平移向量,我想将它们应用于该图像。如何在 opencv 中应用它?

我的假设是我有一些 3D 点(我有 x、y、相对 z)和相关的旋转矩阵(这是一个 3x3 矩阵),我希望将每个点乘以旋转矩阵,得到它在点上“行动”。

【问题讨论】:

    标签: c opencv computer-vision


    【解决方案1】:

    OpenCV 有一个 warp affine 函数用于此目的。

    OpenCV 1(旧 API):

    cvWarpAffine(&srcImage, &dstImage, &mat2x3) ;
    // dst size will be same as src size.
    

    OpenCV 2(新 API):

    cv::warpAffine(&srcImage, &dstImage, &mat2x3, cvSize(dstWidth, dstHeight)) ;
    

    【讨论】:

    • 矩阵必须是 2x3?这在应用 3D 旋转或平移时没有意义
    • 是的,该矩阵存储用于 2D 旋转和平移的基向量,因为图像是 2D 平面上的投影。请更新您的问题,说明您希望实现哪种 3D 转换以及您的假设。
    • 已更新。感谢您的帮助
    【解决方案2】:

    对于 3x3,您可以/应该使用 cv::warpPerspective。

    cv::warpPerspective( image, warpedImage, warpMat, destinationSize );
    

    我不确定这样做是否出于性能原因,但是...

    您也可以使用 warpAffine,但实际上您必须在变形之前将该矩阵转换为 2x3。 opencv API 做起来很麻烦。

    cv::Mat af0 = affine2x3.row( 0 ); // cannot copy directly for some reason
    affine3x3.row( 0 ).copyTo( af0 ); 
    
    cv::Mat af1 = affine2x3.row( 1 ); 
    affine3x3.row( 1 ).copyTo( af1 );
    
    cv::warpPerspective( image, warpedImage, affine2x3, destinationSize );
    

    如果有更简单的方法,我希望有人能纠正我......

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多