opencv放射warpAffine函数和getRotationMatrix2D函数

    xiaoxiao2021-03-25  119

    

    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矩阵得到反变换。

    转载请注明原文地址: https://ju.6miu.com/read-8541.html

    最新回复(0)