IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Opencv之投影变换 -> 正文阅读

[人工智能]Opencv之投影变换

学习资料参考:

张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.


原理

平面的物体若在三维空间发生了旋转,那么这就是投影变换。平面的物体可以借助二维投影变换进行三维变换模型化得到修正。


处理函数

c++中的getPerspectiveTransform(src,dst)函数需要四组对应的坐标变换,返回值类型为CV_64F

//原坐标
Point2f src[]={Point2f(0,0),Point2f(200.0,0),Point2f(0,200.0),Point2f(200,200)};

//投影变换后坐标
Point2f dst[]={Point2f(100,20),Point2f(200,20),Point2f(50,70),Point2f(250,70)};

//计算投影变换矩阵
Mat p = getPerspectiveTransform(src,dst);

当然上述是能够确定坐标的情况下的实现,一般情况下,不会这么做。下面提供一种交互的方式确定坐标,完成投影变换:

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
Mat I;//原图
Mat pI;//投影变换后的图
Point2f IPoint, pIPoint;
int i = 0, j = 0;
Point2f src[4],dst[4]; //原坐标与变换后的坐标
void mouse_I(int event, int x, int y, int flags, void* param) {
	switch (event) {
	case EVENT_LBUTTONDOWN:
		IPoint = Point2f(x, y);
		break;
	case EVENT_LBUTTONUP:
		src[i] = IPoint;
		circle(I, src[i], 7, Scalar(0), 3);
		i += 1;
		break;
	default:
		break;
	}
}
void mouse_pI(int event, int x, int y, int flags, void* param) {
	switch (event) {
	case EVENT_LBUTTONDOWN:
		pIPoint = Point2f(x, y);
		break;
	case EVENT_LBUTTONUP:
		dst[j] = pIPoint;
		circle(pI, dst[j], 7, Scalar(0), 3);
		j += 1;
		break;
	default:
		break;
	}
}
int main() {
	I = imread("p1.jpg", IMREAD_GRAYSCALE);
	if (!I.data)
		return -1;
	//输出图像
	pI = 255 * Mat::ones(I.size(), CV_8UC1);
	//在原窗口上,定义鼠标事件
	namedWindow("I", 1);
	setMouseCallback("I", mouse_I, NULL);
	//在输出窗口上,定义鼠标事件
	namedWindow("pI", 1);
	setMouseCallback("pI", mouse_pI, NULL);
	imshow("I", I);
	imshow("pI", pI);
	while (i != 4 || j != 4) {
		imshow("I", I);
		imshow("pI", pI);
		if (waitKey(50) == 'q')
			break;
	}
	imshow("I", I);
	imshow("pI", pI);
	//移除鼠标事件
	setMouseCallback("I", NULL, NULL);
	setMouseCallback("pI", NULL, NULL);
	//计算投影变换矩阵
	Mat p = getPerspectiveTransform(src, dst);
	//投影变换
	Mat result;
	warpPerspective(I, result, p, pI.size());
	imshow("投影后效果", result);
	waitKey(0);
	return 0;
}

运行结果
在这里插入图片描述
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:22:35  更:2022-04-09 18:25:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:38:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码