opencv仿射变换

#include <opencv2/opencv.hpp>

/*

功能:对一系列坐标点进行平移仿射变换

参数:

srcPoints:输入点坐标

dstPoints:变换后的点坐标

x:x方向平移的距离

y:y方向平移的距离

*/

void tranlatePoints(std::vector<cv::Point2f>& srcPoints, std::vector<cv::Point2f>& dstPoints,double x,double y)

{

cv::Mat affineMatrix = (cv::Mat_<double>(2, 3) << 1, 0, x, 0, 1,y);

cv::transform(srcPoints, dstPoints, affineMatrix);

}

/*

功能:对一系列点进行旋转仿射变换

参数:

srcPoints:输入点坐标

dstPoints:变换后的点坐标

basePoint:旋转基准点

zoomRate:缩放比例,默认为1表示不缩放

*/

void rotatePoints(std::vector<cv::Point2f>& srcPoints, std::vector<cv::Point2f>& dstPoints, cv::Point& basePoint,int degree, float zoomRate=1)

{

cv::Mat affineMatrix = cv::getRotationMatrix2D(basePoint,degree,zoomRate);

cv::transform(srcPoints, dstPoints, affineMatrix);

}

/*

功能:对一系列点进行缩放仿射变换

参数:

srcPoints:输入点坐标

dstPoints:变换后的点坐标

basePoint:缩放基准点

zoomRate:缩放比例

*/

void zoomPoints(std::vector<cv::Point2f>& srcPoints, std::vector<cv::Point2f>& dstPoints, cv::Point& basePoint,float zoomRate)

{

cv::Mat affineMatrix = cv::getRotationMatrix2D(basePoint,0,zoomRate);

cv::transform(srcPoints, dstPoints, affineMatrix);

}

/*

功能:对一张图片进行平移

参数:

src:要平移的图片

dst:平移的结果

x:x方向平移的距离

y:y方向平移的距离

*/

void translateImage(cv::Mat& src, cv::Mat& dst, double x, double y)

{

cv::Mat M = (cv::Mat_<double>(2, 3) << 1, 0, x, 0, 1, y);

cv::warpAffine(src, dst, M, src.size());

}

/*

功能:对一张图片进行旋转

参数:

image:输入图像

imgOut:旋转后的图像

angle:旋转角度

*/

void rotateImage(cv::Mat& image, cv::Mat& imgOut, int angle)

{

/*

对旋转的进行改进,由于图形是一个矩形,旋转后的新图像的形状是一个原图像的外接矩形

因此需要重新计算出旋转后的图形的宽和高

*/

int width = image.cols;

int height = image.rows;

double radian = angle * CV_PI / 180.;//角度转换为弧度

double width_rotate = fabs(width*cos(radian)) + fabs(height*sin(radian));

double height_rotate = fabs(width*sin(radian)) + fabs(height*cos(radian));

//旋转中心 原图像中心点

cv::Point2f center((float)width / 2.0, (float)height / 2.0);

//旋转矩阵

cv::Mat m1 = cv::getRotationMatrix2D(center, angle, 1.0);

//m1为2行3列通道数为1的矩阵

//变换矩阵的中心点相当于平移一样 原图像的中心点与新图像的中心点的相对位置

m1.at<double>(0, 2) += (width_rotate - width) / 2.;

m1.at<double>(1, 2) += (height_rotate - height) / 2.;

if (image.channels() == 1)

{

cv::warpAffine(image, imgOut, m1, cv::Size(width_rotate, height_rotate), cv::INTER_LINEAR, 0, cv::Scalar(0));

}

else if (image.channels() == 3)

{

cv::warpAffine(image, imgOut, m1, cv::Size(width_rotate, height_rotate), cv::INTER_LINEAR, 0, cv::Scalar(0,0,0));

}

}

/*

功能:对一张图片进行缩放

参数:

src:输入图像

dst:缩放后的图像

basePoint:缩放基准点

zoomRate:缩放比例

*/

void zoomImage(cv::Mat& src, cv::Mat& dst, cv::Point& rotaPoint, float zoomRate)

{

cv::Mat M = cv::getRotationMatrix2D(rotaPoint, 0, zoomRate);

cv::warpAffine(src, dst, M, src.size());

}

//#define TESTPOINTS

#define TESTIMAGE

int main() {

#ifdef TESTPOINTS

// 创建原始点集

std::vector<cv::Point2f> srcPoints = { cv::Point2f(100, 100), cv::Point2f(200, 200), cv::Point2f(300, 300) };

//变换点集

std::vector<cv::Point2f> dstPoints;

//tranlatePoints(srcPoints, dstPoints, 10, 10);

cv::Point point(0, 0);

//rotatePoints(srcPoints, dstPoints, point,180);

//zoomPoints(srcPoints, dstPoints, point, 0.5);

// 输出结果

std::cout << "原始点集: ";

for (const auto& point : srcPoints) {

std::cout << point << " ";

}

std::cout << std::endl;

std::cout << "仿射变换后的点集: ";

for (const auto& point : dstPoints) {

std::cout << point << " ";

}

std::cout << std::endl;

#endif // TESTPOINTS

#ifdef TESTIMAGE

cv::Mat img1 = cv::imread("D:/20240103141532.png");

cv::Mat dst;

//translateImage(img1, dst, -50, 50);

//cv::imshow("src",img1);

//cv::imshow("1", dst);

//cv::waitKey(0);

//for (int i = 0; i < 36; i++)

//{

// rotateImage(img1, dst,i * 10);

// cv::imshow("1", dst);

// cv::waitKey(0);

//}

//int width = img1.cols;

//int height = img1.rows;

//cv::Point basePoint((float)width / 2.0, (float)height / 2.0);

//zoomImage(img1, dst, basePoint, 0.5);

//cv::imshow("src", img1);

//cv::imshow("1", dst);

//cv::waitKey(0);

#endif // TESTIMAGE

return 0;

}

相关推荐
irislinAmelia5 小时前
缺陷检测AI关键点在哪
人工智能·嵌入式硬件·1024程序员节
Ai-_Man5 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
安托智造5 小时前
MBD:从二维图纸到三维模型的制造革命(下)
大数据·人工智能·制造·mbd
火山引擎开发者社区5 小时前
VeOps 深度调查:让 AI 排障从“能用”走向“可靠”
人工智能
梓豪csd5 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
王中阳Go5 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
武天旭5 小时前
AI安全--AI大模型的隐私保护与法律法规
人工智能·安全
Solange__5 小时前
影视预演怎么用AI生成3D场景?从分镜、Blockout到镜头交付的完整流程
人工智能·游戏·3d·ai·自然语言处理·aigc·游戏策划
冬奇Lab6 小时前
一次 Skill 评测的复盘:我推翻了一份现成的模型选型结论,然后自己造了个评测平台
人工智能·llm·agent
不脱发的程序猿7 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节