zoukankan      html  css  js  c++  java
  • 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 }

  • 相关阅读:
    【转】ios输入框被键盘挡住的解决办法
    【转】操作系统Unix、Windows、Mac OS、Linux的故事
    mac 下删除非空文件夹
    解决Win7 64bit + VS2013 使用opencv时出现提“应用程序无法正常启动(0xc000007b)”错误
    图的邻接表表示
    图的邻接矩阵表示
    并查集
    05-树9 Huffman Codes及基本操作
    05-树7 堆中的路径
    堆的操作集
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7214632.html
Copyright © 2011-2022 走看看