将这一段代码的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 15:58:13 浏览: 55
openCv-python中文教程_段力辉-译(14章几何变换训练代码)
要将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操作合并为一次,即先将原图进行旋转和平移,再将结果进行裁剪。
6. 将旋转和平移操作合并为一个变换矩阵,使用cv::transform进行变换。
修改后的代码如下:
```
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::Mat_<double> inputPoints(3, 4);
inputPoints(0, 0) = 0;
inputPoints(1, 0) = 0;
inputPoints(0, 1) = RoiMat.cols;
inputPoints(1, 1) = 0;
inputPoints(0, 2) = RoiMat.cols;
inputPoints(1, 2) = RoiMat.rows;
inputPoints(0, 3) = 0;
inputPoints(1, 3) = RoiMat.rows;
inputPoints(2, 0) = inputPoints(2, 1) = inputPoints(2, 2) = inputPoints(2, 3) = 1;
cv::Mat_<double> outputPoints(3, 4);
cv::transform(inputPoints, outputPoints, M);
double minX = std::min(std::min(std::min(outputPoints(0, 0), outputPoints(0, 1)), outputPoints(0, 2)), outputPoints(0, 3));
double minY = std::min(std::min(std::min(outputPoints(1, 0), outputPoints(1, 1)), outputPoints(1, 2)), outputPoints(1, 3));
M(0, 2) += -minX;
M(1, 2) += -minY;
cv::warpAffine(RoiMat, m_mInputMat, M(cv::Rect(0, 0, 3, 2)), cv::Size2d(m_dLength, m_dHeight), cv::INTER_LINEAR);
```
注意:修改后的代码仅供参考,具体的实现可能需要根据代码的上下文进行适当的调整。
阅读全文