将这一段代码的warpAffine效果不变的情况下转换成transform实现 Mat RotateMat = getRotationMatrix2D(m_pdCenter, -m_dAngle, 1); warpAffine(RoiMat, RoiMat, RotateMat, m_mInputMat.size(), WARP_INVERSE_MAP); Mat newCenter = RotateMat * (Mat_<double>(3, 1) << m_pdCenter.x, m_pdCenter.y, 1); double x = newCenter.at<double>(0, 0); double y = newCenter.at<double>(1, 0); Mat M = (Mat_<double>(2, 3) << 1, 0, x - m_dLength * 0.5, 0, 1, y - m_dHeight * 0.5); warpAffine(RoiMat, m_mInputMat, M, Size2d(m_dLength, m_dHeight), WARP_INVERSE_MAP);
时间: 2024-02-27 11:58:07 浏览: 77
要将warpAffine转换成transform实现,可以按照以下步骤进行:
1. 将getRotationMatrix2D替换为cv::getRotationMatrix2D,因为transform使用的是cv命名空间下的函数。
2. 将warpAffine替换为cv::warpAffine,因为transform使用的是cv命名空间下的函数。
3. 将WARP_INVERSE_MAP替换为cv::INTER_LINEAR,因为transform使用的是cv::INTER_LINEAR方式进行插值。
4. 将矩阵类型统一修改为cv::Mat_<double>,以符合transform的要求。
5. 将两次warpAffine操作合并为一次,即先将原图进行旋转和平移,再将结果进行裁剪。
修改后的代码如下:
```
cv::Mat_<double> RotateMat = cv::getRotationMatrix2D(m_pdCenter, -m_dAngle, 1);
cv::Mat_<double> M = cv::Mat_<double>::eye(3, 3);
M(0, 0) = RotateMat(0, 0);
M(0, 1) = RotateMat(0, 1);
M(1, 0) = RotateMat(1, 0);
M(1, 1) = RotateMat(1, 1);
M(0, 2) = m_pdCenter.x - m_dLength * 0.5 * RotateMat(0, 0) - m_dHeight * 0.5 * RotateMat(0, 1);
M(1, 2) = m_pdCenter.y - m_dLength * 0.5 * RotateMat(1, 0) - m_dHeight * 0.5 * RotateMat(1, 1);
cv::warpAffine(RoiMat, m_mInputMat, M(cv::Rect(0, 0, 3, 2)), cv::Size2d(m_dLength, m_dHeight), cv::INTER_LINEAR);
```
注意:修改后的代码仅供参考,具体的实现可能需要根据代码的上下文进行适当的调整。
阅读全文