opencv放射warpAffine函数和getRotationMatrix2D函数

来源:互联网 发布:剑网3dbm数据 编辑:程序博客网 时间:2024/05/18 16:35



int main(int argc, char** argv)
{
 Mat src = imread("test1.jpg", 1);

 //定义两组点,代表两个三角形
 Point2f srcTriangle[3];
 Point2f dstTriangle[3];
 Mat rotMat(2, 3, CV_32FC1);
 Mat warpMat(2, 3, CV_32FC1);
 Mat src1, src2, src3;
 // 设置目标图像的大小和类型与源图像一致 
 src1 = Mat::zeros(src.rows, src.cols, src.type());
 //设置源图像和目标图像上的三组点以计算仿射变换
 srcTriangle[0] = Point2f(0, 0);
 srcTriangle[1] = Point2f(static_cast<float>(src.cols - 1), 0);
 srcTriangle[2] = Point2f(0, static_cast<float>(src.rows - 1));
 dstTriangle[0] = Point2f(static_cast<float>(src.cols*0.0), static_cast<float>(src.rows*0.33));
 dstTriangle[1] = Point2f(static_cast<float>(src.cols*0.65), static_cast<float>(src.rows*0.35));
 dstTriangle[2] = Point2f(static_cast<float>(src.cols*0.15), static_cast<float>(src.rows*0.6));
 //求得仿射变换
 warpMat = getAffineTransform(srcTriangle, dstTriangle);
 //对源图像应用刚刚求得的仿射变换
 warpAffine(src, src1, warpMat, src1.size());
 //对图像进行缩放后再旋转 
 // 计算绕图像中点顺时针旋转50度缩放因子为0.6的旋转矩阵 
 Point center = Point(src1.cols / 2, src1.rows / 2);
 double angle = -30.0;
 double scale = 0.8;
 // 通过上面的旋转细节信息求得旋转矩阵 
 rotMat = getRotationMatrix2D(center, angle, scale);
 // 旋转已缩放后的图像 
 warpAffine(src1, src2, rotMat, src1.size());

 imshow("效果图", src1);
 waitKey(3000);
 imshow("效果图", src2);
 waitKey(3000);
 return(0);
}

C++: Mat getRotationMatrix2D(Point2fcenter, double angle, double scale)

第一个参数,Point2f类型的center,表示源图像的旋转中心。

  • 第二个参数,double类型的angle,旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)。
  • 第三个参数,double类型的scale,缩放系数。

    C++: void warpAffine(InputArray src,OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

    第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。

  • 第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型。
  • 第三个参数,InputArray类型的M,2×3的变换矩阵。
  • 第四个参数,Size类型的dsize,表示输出图像的尺寸。
  • 第五个参数,int类型的flags,插值方法的标识符。此参数有默认值INTER_LINEAR(线性插值),可选的插值方式如下:
      • INTER_NEAREST - 最近邻插值
      • INTER_LINEAR - 线性插值(默认值)
      • INTER_AREA - 区域插值
      • INTER_CUBIC –三次样条插值
      • INTER_LANCZOS4 -Lanczos插值
      • CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
      • CV_WARP_INVERSE_MAP –表示M为输出图像到输入图像的反变换,即 。因此可以直接用来做象素插值。否则, warpAffine函数从M矩阵得到反变换。


  • 0 0
    原创粉丝点击