void Extract1DEdge::GetProfieMat() { if (m_mInputMat.empty()) { return; } if (m_mInputMat.channels() > 1) { cvtColor(m_mInputMat, m_mInputMat, COLOR_BGR2GRAY); } Mat RotateMat = getRotationMatrix2D(m_pdCenter, -m_dAngle, 1); warpAffine(m_mInputMat, m_mInputMat, 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(m_mInputMat, m_mInputMat, M, Size2d(m_dLength, m_dHeight), WARP_INVERSE_MAP); }如何保持两个warpAffine效果不变的情况下加速这段代码给个例程
时间: 2024-02-17 16:05:30 浏览: 51
以下是一个将两个 warpAffine 合并的例程,可以在保持效果不变的情况下加速代码:
```
void Extract1DEdge::GetProfieMat() {
if (m_mInputMat.empty()) {
return;
}
if (m_mInputMat.channels() > 1) {
cvtColor(m_mInputMat, m_mInputMat, COLOR_BGR2GRAY);
}
Mat RotateMat = getRotationMatrix2D(m_pdCenter, -m_dAngle, 1);
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);
Mat combinedMat = M * RotateMat;
Mat dst;
warpAffine(m_mInputMat, dst, combinedMat, Size2d(m_dLength, m_dHeight), WARP_INVERSE_MAP);
m_mInputMat = dst;
}
```
这里将第一次 warpAffine 的结果保存到一个中间变量 dst 中,然后将其作为第二次 warpAffine 的输入,从而避免了重复计算。最后将结果赋值回 m_mInputMat 中。注意修改后的代码可能需要根据实际情况进行适当的调整。