OpenCV中图像变换

一、介绍

transform():Transposes a matrix.

perspectiveTransform():Performs the perspective matrix transformation of vectors.

warpAffine():Applies an affine transformation to an image.

warpPerspective():Applies a perspective transformation to an image.

二、transform

cpp 复制代码
	Mat m23 = Mat::zeros(2, 3, CV_32FC1);  // 2*2  2*3
	m23.at<float>(0, 0) = 1.0;
	m23.at<float>(0, 2) = 2.0;
	m23.at<float>(1, 1) = 3.0;
	m23.at<float>(1, 2) = 4.0;
	cout << "m23 = " << endl << m23 << endl;

	// src.channel = m.cols 或 m.cols - 1
	// 当src.channel=m.cols - 1时,src增加一通道,值为1
	Mat src = Mat::zeros(4, 4, CV_8UC3);
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			for (int k = 0; k < src.channels(); k++)
			{
				src.at<Vec3b>(i, j)[k] = 2 * i + j + k;
			}
		}
	}
	cout << "src = " << endl << src << endl;

	Mat dst;
	cv::transform(src, dst, m23);  // dst.channel = m.rows
	cout << "dst = " << endl << dst << endl;

三、perspectiveTransform

cpp 复制代码
	Mat m33 = Mat::zeros(3, 3, CV_32FC1);  // 3*3  4*4
	m33.at<float>(0, 0) = 1.0;
	m33.at<float>(0, 2) = 2.0;
	m33.at<float>(1, 1) = 3.0;
	m33.at<float>(1, 2) = 4.0;
	m33.at<float>(2, 2) = 2.0;
	cout << "m33 = " << endl << m33 << endl;

	// src.channel = m.cols - 1   src增加一个通道,值为1
	Mat src = Mat::zeros(2, 2, CV_32FC2);
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			for (int k = 0; k < src.channels(); k++)
			{
				src.at<Vec2f>(i, j)[k] = 2.0f * i + j + k;
			}
		}
	}
	cout << "src = " << endl << src << endl;

	// dst.size = src.size   dst.channels = src.channels
	// 3*3 * 3*1 = 3*1   4*4 * 4*1 = 4*1    m * v1 = v2
	// m33 * [x,y,1] = [x',y',w], 使用[x'/w, y'/w]作为dst的结果
	Mat dst;
	cv::perspectiveTransform(src, dst, m33);
	cout << "dst = " << endl << dst << endl;

四、warpAffine

cpp 复制代码
	// 仿射变换矩阵 M 2*3 --- 旋转、平移、缩放
	cv::Point2f center = Point2f(img.cols / 2.0f, img.rows / 2.0f);  // 旋转中心
	double angle = 10.0;  // 旋转角度,逆时针为正
	double scale = 1.2;   // 缩放尺寸
	Mat M = cv::getRotationMatrix2D(center, angle, scale);
	int bound_w = (img.rows * fabs(sin(angle * CV_PI / 180)) + img.cols * fabs(cos(angle * CV_PI / 180))) * scale;
	int bound_h = (img.rows * fabs(cos(angle * CV_PI / 180)) + img.cols * fabs(sin(angle * CV_PI / 180))) * scale;
	M.at<double>(0, 2) += (bound_w - img.cols) / 2.0;  // x平移
	M.at<double>(1, 2) += (bound_h - img.rows) / 2.0;  // y平移
	Mat dst;
	cv::warpAffine(img, dst, M, cv::Size(bound_w, bound_h));

五、warpPerspective

cpp 复制代码
	// 透视变换矩阵 M 3*3 --- 投影
	Point2f ptsF[4], ptsT[4];
	ptsF[0] = Point2f(163, 191);
	ptsF[1] = Point2f(735, 160);
	ptsF[2] = Point2f(872, 936);
	ptsF[3] = Point2f(112, 980);
	ptsT[0] = Point2f(163, 191);
	ptsT[1] = Point2f(735, 191);
	ptsT[2] = Point2f(735, 936);
	ptsT[3] = Point2f(163, 936);
	Mat M = cv::getPerspectiveTransform(ptsF, ptsT);
	Mat dst;
	cv::warpPerspective(img, dst, M, img.size());
相关推荐
老蒋新思维14 小时前
创客匠人 2025 全球创始人 IP+AI 万人高峰论坛:AI 赋能下知识变现与 IP 变现的实践沉淀与行业启示
大数据·人工智能·网络协议·tcp/ip·重构·创始人ip·创客匠人
Keep_Trying_Go14 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
AKAMAI14 小时前
Akamai 宣布收购功能即服务公司 Fermyon
人工智能·云计算
河南博为智能科技有限公司14 小时前
高集成度国产八串口联网服务器:工业级多设备联网解决方案
大数据·运维·服务器·数据库·人工智能·物联网
光路科技15 小时前
人工智能时代,工业以太网正在“进化”成什么样?
人工智能
翔云 OCR API15 小时前
承兑汇票识别接口技术解析-开发者接口
开发语言·前端·数据库·人工智能·ocr
roman_日积跬步-终至千里15 小时前
【模式识别与机器学习(16)】聚类分析【1】:基础概念与常见方法
人工智能·机器学习
nvd1115 小时前
一个简单的GitHub AI Agent 实现指南
人工智能·langchain
阿里云大数据AI技术16 小时前
【新模型速递】PAI-Model Gallery云上一键部署DeepSeek-V3.2模型
人工智能
阿恩.77016 小时前
2026年1月最新计算机、人工智能、经济管理国际会议:选对会议 = 论文成功率翻倍
人工智能·经验分享·笔记·计算机网络·金融·区块链