作者:yuzhenhua09 | 来源:互联网 | 2023-09-12 13:00
API函数
1、获取仿射矩阵
(1)getAffineTransform //设置原图像与目标图像上三点计算矩阵
Mat A=getAffineTransform(const Point2f* src, const Point2f* dst)
参数const Point2f* src:原图的三个固定顶点
参数const Point2f* dst:目标图像的三个固定顶点
返回值:Mat型变换矩阵,可直接用于warpAffine()函数
注意,顶点数组长度超过3个,则会自动以前3个为变换顶点;数组可用Point2f[]或Point2f*表示
(2)getRotationMatrix2D //计算二维旋转变换矩阵
Mat B=getRotationMatrix2D (CvPoint2D32f center,double angle,double scale)
参数CvPoint2D32f center,表示源图像旋转中心
参数double angle,旋转角度,正值表示逆时针旋转
参数double scale,缩放系数
2、进行仿射变换
C++ void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
//参数InputArray src:输入变换前图像
//参数OutputArray dst:输出变换后图像,需要初始化一个空矩阵用来保存结果,不用设定矩阵尺寸
//参数InputArray M:变换矩阵,用另一个函数getAffineTransform()计算
//参数Size dsize:设置输出图像大小
//参数int flags = INTER_LINEAR:设置插值方式,默认方式为线性插值(另一种WARP_FILL_OUTLIERS)
//参数int borderMode=BORDER_CONSTANT:边界像素模式,默认值BORDER_CONSTANT
//参数const Scalar& borderValue=Scalar(),在恒定边界情况下取的值,默认值为Scalar(),即0
示例代码
#include
#include
using namespace cv;
using namespace std;//全局变量
Mat warpmat(2, 3, CV_32FC1);
Mat ropmat(2, 3, CV_32FC1);
int s11, s12, s21, s22, s31, s32;
int d11, d12, d21, d22, d31, d32;void warp()
{//定义原图与目标图像的三组点Point2f src_point[3];Point2f dst_point[3];cout <<"请输入原图像的第一个点" <> s11;cin >> s12;src_point[0] &#61; Point2f(s11, s12);cout <<"请输入原图像的第二个点" <> s21;cin >> s22;src_point[1] &#61; Point2f(s21, s22); cout <<"请输入原图像的第三个点" <> s31;cin >> s32;src_point[2] &#61; Point2f(s31, s32);cout <<"原图像的三个点为&#xff1a;" <> d11;cin >> d12;dst_point[0] &#61; Point2f(d11, d12);cout <<"请输入目标图像的第二个点" <> d21;cin >> d22;dst_point[1] &#61; Point2f(d21,d22);cout <<"请输入目标图像的第三个点" <> d31;cin >> d32;dst_point[2] &#61; Point2f(d31, d32);cout <<"目标图像的三个点为&#xff1a;" <}void rot(Mat src)
{//图像旋转中心Point center &#61; Point(src.cols / 2, src.rows / 2);//旋转角度&#xff1a;角度为正表示逆时针旋转double angle;cout <<"旋转角度为&#xff1a;" <> angle;//缩放系数double scale;cout <<"缩放系数为" <> scale;cout <<"——————————————" <}int main()
{//载入原图Mat src &#61; imread("12.bmp");cvtColor(src, src, COLOR_BGR2GRAY);Mat dst&#61;Mat::zeros(src.size(),src.type());Mat dst1 &#61; Mat::zeros(src.size(), src.type());//改变console(控制台)字体颜色 system("color 0B");//判断图片是否读入if (!src.data){printf("读取图片image0错误~&#xff01; \n");return false;}//先显示原图namedWindow("【原始图像】");imshow("【原始图像】", src);//循环轮询按键while (1){cout <<"\n此图像的大小为&#xff1a;" <> c;if (c &#61;&#61; 1){cout <<"您正在进行坐标变换图像操作" <}