保证效果不改变的情况下加速这段代码 cv::Mat transformed; cv::warpAffine(RoiMat, transformed, RotateMat, m_mInputMat.size(), cv::WARP_INVERSE_MAP); cv::Mat M = (cv::Mat_<double>(2, 3) << 1, 0, m_pdCenter.x - m_dLength * 0.5, 0, 1, m_pdCenter.y - m_dHeight * 0.5); cv::warpAffine(transformed, transformed, M, cv::Size2d(m_dLength, m_dHeight), cv::WARP_INVERSE_MAP); m_mInputMat = transformed;
时间: 2024-02-28 08:53:02 浏览: 63
AffineTransform_仿射变换_AffineTransform_源码
你可以考虑使用 OpenCV 中的加速函数 cv::resize() 来代替 cv::warpAffine(),并且将两个 cv::warpAffine() 合并为一个。具体地,你可以先将旋转和平移操作合并为一个仿射变换矩阵,然后使用 cv::warpAffine() 进行一次性的变换。代码示例如下:
```
cv::Mat transformMatrix = cv::getRotationMatrix2D(m_pdCenter, m_dAngle, 1.0);
transformMatrix.at<double>(0, 2) += m_pdCenter.x - m_dLength * 0.5;
transformMatrix.at<double>(1, 2) += m_pdCenter.y - m_dHeight * 0.5;
cv::Mat transformed;
cv::warpAffine(RoiMat, transformed, transformMatrix, cv::Size2d(m_dLength, m_dHeight), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar());
m_mInputMat = transformed;
```
上述代码中,首先使用 cv::getRotationMatrix2D() 函数获取旋转和平移操作合并后的仿射变换矩阵 transformMatrix。然后直接使用 cv::warpAffine() 函数进行一次性的变换,并将变换结果保存到 m_mInputMat 中。
注意,上述代码中使用了 cv::INTER_LINEAR 作为插值方式,这是一种比较快速的插值方式。如果你需要更高的变换精度,可以使用 cv::INTER_CUBIC 或 cv::INTER_LANCZOS4 等插值方式。
阅读全文