opencv 通过旋转向量和平移向量 转换图片
时间: 2024-12-24 18:40:45 浏览: 4
在OpenCV中,如果你想通过旋转和平移来变换图像,可以使用仿射变换(Affine Transformation),它是一种线性的变换,通过一个称为仿射变换矩阵的3x3矩阵来描述。这个矩阵由旋转向量和平移向量共同构成。
首先,我们需要两个向量,一个是旋转向量(`(angle, 0)`),表示绕某一点(通常是原图像中心)进行旋转;另一个是平移向量(`(dx, dy)`),表示沿x和y轴移动的距离。
假设我们已经有了旋转角`angle`和平移距离`(dx, dy)`,以及输入图像`src`,转换过程可以分为以下几个步骤:
1. **获取旋转矩阵**:
```cpp
double angleInDegrees = angle * CV_PI / 180.0; // 将角度转换为弧度
Point2f center(src.cols/2.0, src.rows/2.0); // 假设旋转中心是图像中心
Mat rotMat = getRotationMatrix2D(center, angleInDegrees, 1.0);
```
2. **添加平移**:
为了将旋转和平移结合,你需要将旋转矩阵与一个表示平移的2x3增量矩阵相加。增量矩阵的形式为`[[0, 0, dx], [0, 0, dy]]`。由于OpenCV通常处理的是2D变换,所以我们不需要考虑缩放,因此增量矩阵的最后一个元素是1。
```cpp
Mat transMat = (Mat_<double>(2, 3) << 0, 0, dx, 0, 0, dy, 0, 0, 1);
```
3. **应用变换**:
最后,将这两个矩阵合并并通过`warpAffine`函数应用于源图像上得到变换后的图像`dst`:
```cpp
Mat dst;
warpAffine(src, dst, rotMat + transMat, src.size(), INTER_LINEAR);
```
请注意,`INTER_LINEAR`是一个插值方法选择,这里我们使用线性插值保持图像的质量。还有其他选项如`INTER_CUBIC`提供更高质量的插值。
阅读全文