opencv学习之路(11)、图像几何变换

一、图像缩放

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main(){
 5     Mat src=imread("E://0.jpg");
 6     Mat dst;
 7     resize(src,dst,Size(300,300));
 8     imshow("src",src);
 9     imshow("dst",dst);
10     waitKey(0);
11 }

二、图像平移

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 //不改变图像大小
 5 Mat imgTranslate(Mat &src,int x_off,int y_off){//x方向偏移,y方向偏移
 6     int rows=src.rows;//行
 7     int cols=src.cols;//列
 8     Mat dst=Mat::zeros(src.size(),src.type());//创建一个全黑图像
 9     for (int i = 0; i < rows; i++)//遍历行
10     {
11         for (int j = 0; j < cols; j++)//遍历列
12         {
13
14             int x=j+x_off;//列坐标+x方向偏移=当前x坐标
15             int y=i+y_off;
16             if(x>=0&&y>=0&&x<cols&&y<rows){
17                 dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);//赋值,(y,x)对应(i,j),详情见下面图示
18             }
19         }
20     }
21     return dst;
22 }
23 //改变图像大小
24 Mat imgTranslate2(Mat &src,int x_off,int y_off){
25     int rows=src.rows+y_off;
26     int cols=src.cols+x_off;
27     Mat dst=Mat::zeros(rows,cols,src.type());//注意与上面的差别,行列重新选值
28     for (int i = 0; i < rows; i++)
29     {
30         for (int j = 0; j < cols; j++)
31         {
32
33             int x=j+x_off;
34             int y=i+y_off;
35             if(x>=0&&y>=0&&x<cols&&y<rows){
36                 dst.at<Vec3b>(y,x)=src.at<Vec3b>(i,j);
37             }
38         }
39     }
40     return dst;
41 }
42
43 void main(){
44     Mat src=imread("E://0.jpg");
45     //Mat dst=imgTranslate(src,20,30);
46     Mat dst=imgTranslate2(src,-20,-30);
47     imshow("src",src);
48     imshow("dst",dst);
49     waitKey(0);
50 }

三、图像旋转

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main(){
 5     Mat src=imread("E://0.jpg");
 6     Point2f center=Point2f(src.cols/2,src.rows/2);//旋转中心
 7     double angle=15;//旋转角度
 8     double scale=0.5;//缩放尺度
 9     Mat rotate=getRotationMatrix2D(center,angle,scale);//旋转矩阵
10     Mat dst;
11     warpAffine(src,dst,rotate,Size(600,400));//仿射变换
12
13     imshow("src",src);
14     imshow("dst",dst);
15     waitKey(0);
16 }

四、转置和镜像

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main(){
 5     Mat src=imread("E://1.jpg");
 6     Mat dst;
 7     //transpose(src,dst);//先左右翻转,然后再逆时针旋转90°
 8     //flip(src,dst,0);//沿x轴翻转
 9     //flip(src,dst,1);//大于0,沿y轴翻转
10     flip(src,dst,-1);//小于0,沿原点翻转
11
12     imshow("src",src);
13     imshow("dst",dst);
14     waitKey(0);
15 }
transpose效果如下:

flipCode = 0, 垂直翻转(沿X轴翻转),效果如下:

flipCode > 0, 水平翻转(沿Y轴翻转),效果如下:

flipCode < 0, 水平垂直翻转(180°中心对称),效果如下:

五、重映射remap

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main(){
 5     Mat src=imread("E://0.jpg");
 6     Mat dst;
 7
 8     int rows=src.rows;
 9     int cols=src.cols;
10     Mat xMap=Mat::zeros(src.size(),CV_32FC1);//map1
11     Mat yMap=Mat::zeros(src.size(),CV_32FC1);//map2
12
13     for (int i = 0; i < rows; i++)
14     {
15         for (int j = 0; j < cols; j++)
16         {
17             xMap.at<float>(i,j)=j;//保持列不变
18             //yMap.at<float>(i,j)=i+5*sin(j/10.0);//sin水波效果
19             yMap.at<float>(i,j)=rows-i;//上下翻转
20         }
21     }
22     remap(src,dst,xMap,yMap,CV_INTER_LINEAR);
23
24     imshow("src",src);
25     imshow("dst",dst);
26     waitKey(0);
27 }

时间: 2024-10-25 17:56:16

opencv学习之路(11)、图像几何变换的相关文章

opencv学习之路(13)、图像阈值化

一.图像阈值化简介 二.固定阈值 三.自适应阈值 1 #include<opencv2/opencv.hpp> 2 using namespace cv; 3 4 void main(){ 5 Mat src=imread("E://1.jpg",0);//以灰度模式读入 6 Mat dst; 7 //threshold(src,dst,100,255,CV_THRESH_BINARY); 8 //adaptiveThreshold(src,dst,255,CV_ADAPT

opencv学习之路(12)、图像滤波

一.图像滤波简介 二.方框滤波--boxFilter() 1 #include<opencv2/opencv.hpp> 2 using namespace cv; 3 4 void main(){ 5 Mat src=imread("E://1.jpg"); 6 Mat dst; 7 //方框滤波器,-1代表原图像深度,size内核大小,true按权重相加(此时等于均值滤波),false按原像素相加(所以很多像素点都大于了255,如上图所示) 8 boxFilter(src

opencv学习之路(8)、基本图像运算——加减与或

一.图像加法 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 void main(){ 7 Mat img1=imread("E://1.jpg"); 8 Mat img2=imread("E://2.jpg"); 9 Mat dst;//存储结果 10 imshow("img1&

OpenCV成长之路:图像直方图的应用

2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ronny.blog.51cto.com/8801997/1394118 正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要先提取图像中皮肤区域来缩小人脸的检

opencv学习之路(21)、模板匹配及应用

一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() 7 { 8 Mat temp=imread("E://mu.jpg"); 9 Mat src=imread("E://lena.jpg"); 10 Mat dst=src.c

opencv学习之路(20)、直方图应用

一.直方图均衡化--equalizeHist() 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 Mat srcImg = imread("E://02.jpg", 0); //以灰度方式打开,需要输入单通道图像 7 imshow("src", srcImg); 8 Mat dstImg; //均衡化后的图像 9 equalizeHist(sr

opencv学习之路(5)、鼠标和滑动条操作

一.鼠标事件 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 Mat img(500,500,CV_8UC3,Scalar(255,255,255));//定义成全局变量 7 8 void OnMouse(int event,int x,int y,int flags,void* param){ 9 if(event==CV_EV

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但

opencv学习之路(2)、读取视频,读取摄像头

一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open("1.avi"); B. VideoCapture cap("1.avi"); ②循环显示每一帧: while(1) { Mat frame; //定义Mat变量,用来存储每一帧 cap>>frame; //读取当前帧方法一 //cap.read(frame); /