【OpenCV】重映射及仿射变换
重映射Remapping
void cv::remap ( InputArray src, OutputArray dst,InputArray map1, InputArray map2,int interpolation, int borderMode = BORDER_CONSTANT,const Scalar & borderValue = Scalar()
) 说明src: 源图像dst: 目标图像,与 src 相同大小map_x: x方向的映射参数. 它相当于方法 h(i,j) 的第一个参数map_y: y方向的映射参数. 注意 map_y 和 map_x 与 src 的大小一致。CV_INTER_LINEAR: 非整数像素坐标插值标志. 这里给出的是默认值(双线性插值)。BORDER_CONSTANT: 默认
代码示例
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>using namespace cv;
using namespace std;Mat src, dst;
Mat map_x, map_y;
char* remap_window = "Remap Demo";
int ind = 0;void update_map(void);int main(int argc, char** argv)
{CommandLineParser parser(argc, argv, "{@image | ../data/lena.jpg | input image}");string filename = parser.get<string>(0);src = imread(filename, IMREAD_COLOR);dst.create(src.size(), src.type());map_x.create(src.size(), CV_32FC1); // 32位浮点型单通道矩阵map_y.create(src.size(), CV_32FC1);while (true){char c = (char)waitKey(1000);if (c == 27) { break; }update_map();remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0)); // 重映射imshow(remap_window, dst);}return 0;
}void update_map(void)
{ind = ind % 4;for(int j =0;j<src.rows;j++)for (int i = 0; i < src.cols; i++){switch (ind){case 0: // 图像宽高缩小一半,并显示在中间if (i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75){map_x.at<float>(j, i) = 2 * (i - src.cols*0.25f) + 0.5f;map_y.at<float>(j, i) = 2 * (j - src.rows*0.25f) + 0.5f;}else{map_x.at<float>(j, i) = 0;map_y.at<float>(j, i) = 0;}break;case 1: // 图像上下颠倒map_x.at<float>(j, i) = (float)i;map_y.at<float>(j, i) = (float)(src.rows - j);break;case 2: // 图像左右颠倒map_x.at<float>(j, i) = (float)(src.cols - i);map_y.at<float>(j, i) = (float)j;break;case 3: // 同时执行b和c的操作map_x.at<float>(j, i) = (float)(src.cols - i);map_y.at<float>(j, i) = (float)(src.rows - j);break;}}ind++;
}
运行结果
仿射变换Affine Transformations
void cv::warpAffine ( InputArray src, OutputArray dst,InputArray M, Size dsize,int flags = INTER_LINEAR,int borderMode = BORDER_CONSTANT,const Scalar & borderValue = Scalar()
)说明src: 输入源图像dst: 输出图像M : 仿射变换矩阵dsize: 输出图像的尺寸
代码示例
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>using namespace cv;
using namespace std;char* source_window = "Source image";
char* warp_window = "Warp";
char* warp_rotate_window = "Warp + Rotate";int main(int, char** argv)
{Point2f srcTri[3]; // 三角形三个顶点Point2f dstTri[3];Mat rot_mat(2, 3, CV_32FC1);Mat warp_mat(2, 3, CV_32FC1);Mat src, warp_dst, warp_rotate_dst;char* filename = "../data/lena.jpg";src = imread(filename, IMREAD_COLOR);warp_dst = Mat::zeros(src.rows, src.cols, src.type());srcTri[0] = Point2f(0, 0); // 图像左上角srcTri[1] = Point2f(src.cols - 1.f, 0); // 图像右上角srcTri[2] = Point2f(0, src.rows - 1.f); // 图像左下角dstTri[0] = Point2f(src.cols*0.0f, src.rows*0.33f);dstTri[1] = Point2f(src.cols*0.85f, src.rows*0.25f);dstTri[2] = Point2f(src.cols*0.15f, src.rows*0.7f);warp_mat = getAffineTransform(srcTri, dstTri); // 得到仿射矩阵warpAffine(src, warp_dst, warp_mat, warp_dst.size()); // 仿射变换Point center = Point(warp_dst.cols / 2, warp_dst.rows / 2);double angle = -50.0;double scale = 0.6;rot_mat = getRotationMatrix2D(center, angle, scale);warpAffine(warp_dst, warp_rotate_dst, rot_mat, warp_dst.size()); // 旋转仿射变换imshow(source_window, src);imshow(warp_window, warp_dst);imshow(warp_rotate_window, warp_rotate_dst);waitKey(0);return 0;
}
运行结果
【OpenCV】重映射及仿射变换相关推荐
- 【OpenCV入门教程之十七】OpenCV重映射 SURF特征点检测合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨) ...
- OpenCV探索之路(八):重映射与仿射变换
重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在Open ...
- OpenCV精进之路(七):图像变换——重映射与仿射变换
重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在Open ...
- 边缘检测、霍夫变换、重映射、仿射变换、直方图均衡化
文章目录 1.基于 OpenCV 的边缘检测 1.1 边缘检测的一般步骤 1.2 canny 算子 1.2.1 canny 边缘检测的步骤 1.2.2 Canny 边缘检测:Canny() 函数 1. ...
- opencv 重映射、x轴翻转,y轴翻转,xy轴镜像,图像缩小
本章内容 重映射.x轴翻转,y轴翻转,xy轴镜像,图像缩小 输出结果: 源码 #include <ostream> #include <opencv.hpp> #include ...
- OpenCV:remap()简单重映射
学习自:[OpenCV入门教程之十七]OpenCV重映射 重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程. 为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与 ...
- C语言printf重入,单片机中printf函数的重映射
单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...
- OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换
霍夫线变换 目标 在这个部分您将学习到: 使用OpenCV的以下函数 HoughLines 和 HoughLinesP 来检测图像中的直线. 原理 Note 以下原理的说明来自书籍 学习OpenCV ...
- 【OpenCV 】Remapping 重映射¶
目录 1.1目标 1.2 理论 1.3 代码 1.4 运行结果 1.1目标 展示如何使用OpenCV函数 remap 来实现简单重映射. 1.2 理论 把一个图像中一个位置的像素放置到另一个图片指定位 ...
最新文章
- 部署SCCM2012之先决条件准备
- OpenCvSharp 形态学操作(膨胀、腐蚀)
- 通过NVIDIA PilotNet,人人都能变成人工智能的老师
- Android之事件总线EventBus详解
- 计算机应用考试其一级属于中级,计算机软件水平考试可以直接考中级吗?
- CCSP2020比赛太原理工学子再创佳绩
- Cockos REAPER 6 for Mac - 强大的数字音频工作站
- wex5中集成的mysql数据库 打开时一闪而过 报错
- 17. Window confirm() 方法
- php vld扩展,Linux安装php-vld扩展
- lnmp一键安装远程连接mysql_阿里云 lnmp一键安装包远程访问Mysql
- vbscript 微软教程网址
- KeilC51基础 利用仿真测试代码的运行时间
- Default interface methods are only supported starting with Android N (--min-api 24):
- 方舟生存服务器没有响应怎么办,方舟生存进化搜服务器闪退怎么办? Fata error临时解决办法一览...
- 工程师的18个梦想,你有几个?
- 关于vue ui启动没反应问题
- 如何减少APP电量消耗?
- AES-GCM模式代码演示
- 凡人无法打开的文件9
热门文章
- 关于计算机网络的主题报告,计算机网络与物联网工程研究所组织开展“安全先锋沙龙”主题报告活动...
- 计算机驱动伺服的程序,伺服调试软件V-ASSISTANT始终找不到驱动-工业支持中心-西门子中国...
- Python 小白学习
- Tensorflow:TensorFlow基础(一)
- Anaconda下改变python的版本
- Anaconda——conda换源可以直接通过conda命令来实现
- Windows下anyproxy的配置文件路径
- 将pdbqt文件转成SMILES文件
- 38K红外遥控发射与接收电路设计与选型、正向压降、限流电阻、半值角
- 物联网设备获取北京时间、年月日、星期几,GMT格林威治标准时间转换为北京时间,授时api Fiddler抓包调试