OpenCV——图像的平移旋转

1.学习图像数据格式Mat

像素就是把图形分割成很多大小相等的小正方形,其中每一个都是一个像素。我们常见的800*600的图形,800代表宽度,600代表高度。

灰度图像就是黑白灰,只有这三种颜色,其实就是不同程度的灰色。灰度图像中的像素用8位无符号数,0表示黑色,255表示白色,中间的则为不同程度的灰色。8位无符号数就是2的8次方,即255。一个8位色的像素,可以显示的颜色为2的八次方,0到255,就是能显示出256中颜色。

**需要掌握的基础函数操作:

Mat img; //定义一个可以存储图像的空间名为img

imread(“e:\1.jpg”); //读取路径中的图像

Imwrite(“e:\2.jpg”,img); //将img中存储的图像保存到e盘并命名为2.jpg

if(img.empty()); //如果img中没有存储图像,则img.empty()=1否则为0

namedWindow("原图像"); //命名一个窗口的名称为“原图像”

imshow("原图像", img); //展示img图像到“原图像”窗口

destroyWindow("原图像"); //销毁(关闭)窗口

cvtColor(img,img,CV_BGR2GRAY); //将img图转换为灰度图存到img中

img.at<Vec3b>(i, j)[0] = 0; //img彩色图像中坐标为(i,j)的像素点,将其蓝通道设置为黑色

Matdst = img.clone(); //将img复制存储到dst中

2图片的提取

#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
    Mat picture = imread("Jmu.jpg");//图片必须添加到工程目录下
                                    
    imshow("测试程序", picture);
    waitKey(0);
}
using namespace cv;
int main()
{
    Mat picture = imread("Jmu.jpg");//图片必须添加到工程目录下
                                    
    imshow("测试程序", picture);
    waitKey(0);
}

运行结果:

 

3.图形的读取、转灰度图、显示、保存

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char **argv )
{
    Mat img = imread("h:\\1.jpg");//将一张图片存储,读取到img
    Mat grayimg;
    cvtColor(img, grayimg, CV_BGR2GRAY);//将原图转化成灰度图片,存储到grayimg
    imwrite("h:\\grayimg.jpg", grayimg);
​
    if (img.empty())//如果图片不存在的情况
    {
        cout << "error"<<endl;
        system("pause");
        return 0;
    }
​
    imwrite("h:\\2.bmp", img);//将图片转化为其他格式存储
    cout << "像素列数(宽度):" << img.cols << endl << "像素行数(高度):" << img.rows;
​
    namedWindow("原图像");//命名一个图像窗口
    imshow("原图像",img);//显示图像
    cvtColor(img, img, CV_BGR2GRAY);
    namedWindow("灰度图像");
    imshow("灰度图像",img);
​
​
    system("pause");
    //销毁窗口
    destroyWindow("原图像");
    destroyWindow("灰度图像");
​
    return 0;
}
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char **argv )
{
    Mat img = imread("h:\\1.jpg");//将一张图片存储,读取到img
    Mat grayimg;
    cvtColor(img, grayimg, CV_BGR2GRAY);//将原图转化成灰度图片,存储到grayimg
    imwrite("h:\\grayimg.jpg", grayimg);
​
    if (img.empty())//如果图片不存在的情况
    {
        cout << "error"<<endl;
        system("pause");
        return 0;
    }
​
    imwrite("h:\\2.bmp", img);//将图片转化为其他格式存储
    cout << "像素列数(宽度):" << img.cols << endl << "像素行数(高度):" << img.rows;
​
    namedWindow("原图像");//命名一个图像窗口
    imshow("原图像",img);//显示图像
    cvtColor(img, img, CV_BGR2GRAY);
    namedWindow("灰度图像");
    imshow("灰度图像",img);
​
​
    system("pause");
    //销毁窗口
    destroyWindow("原图像");
    destroyWindow("灰度图像");
​
    return 0;
}

通常在结尾return 0;前面使用waitKey(0);用于观测实验结果,否则实现结果往往一闪而过。

或者参考使用system(“pause”);

4.图片的平移

#include<opencv2\opencv.hpp>
​
#include<iostream>
using namespace std;
using namespace cv;
void imMove(Mat img, Mat &dst, int x, int y)
{
    int MaxHeight = img.rows;//设定最大高度为图形高度
    int MaxWidth = img.cols;//设定最大宽度为图形宽度
    int i;
    int j;
    for (i = 0 ; i < MaxHeight; i++)
    {
        for (j = 0; j < MaxWidth; j++)
        {
            //判断位置后将像素逐个赋予到新的位置
            if (i - x > 0 && i - x < MaxHeight&&j - y>0 && j - y < MaxWidth)
                dst.at<Vec3b>(i, j) = img.at<Vec3b>(i - x, j - y);
            else
            {
                dst.at<Vec3b>(i, j)[0] = 0;
                dst.at<Vec3b>(i, j)[1] = 0;
                dst.at<Vec3b>(i, j)[2] = 0;
​
            }
        }
    }
}
​
int main(void)
{
    Mat img = imread("h:\\1.jpg");
    Mat dst = img.clone();
    imshow("原图", img);
​
    int x, y;
    cout << "水平移动的距离" << endl;
    cin >> x;
    cout << endl << "输入垂直移动距离";
    cin >> y;
    imMove(img, dst, y, x);
    imshow("平移后的图像",dst);
    imwrite("h:\\2.jpg", dst);//保存平移后的图片
    waitKey(0);
​
    return 0;
​
}
​
#include<iostream>
using namespace std;
using namespace cv;
void imMove(Mat img, Mat &dst, int x, int y)
{
    int MaxHeight = img.rows;//设定最大高度为图形高度
    int MaxWidth = img.cols;//设定最大宽度为图形宽度
    int i;
    int j;
    for (i = 0 ; i < MaxHeight; i++)
    {
        for (j = 0; j < MaxWidth; j++)
        {
            //判断位置后将像素逐个赋予到新的位置
            if (i - x > 0 && i - x < MaxHeight&&j - y>0 && j - y < MaxWidth)
                dst.at<Vec3b>(i, j) = img.at<Vec3b>(i - x, j - y);
            else
            {
                dst.at<Vec3b>(i, j)[0] = 0;
                dst.at<Vec3b>(i, j)[1] = 0;
                dst.at<Vec3b>(i, j)[2] = 0;
​
            }
        }
    }
}
​
int main(void)
{
    Mat img = imread("h:\\1.jpg");
    Mat dst = img.clone();
    imshow("原图", img);
​
    int x, y;
    cout << "水平移动的距离" << endl;
    cin >> x;
    cout << endl << "输入垂直移动距离";
    cin >> y;
    imMove(img, dst, y, x);
    imshow("平移后的图像",dst);
    imwrite("h:\\2.jpg", dst);//保存平移后的图片
    waitKey(0);
​
    return 0;
​
}

 

运行结果:

5.图片的旋转,缩放

getRotationMatrix2D(1.图像旋转中心, 2.旋转角度 ,3.缩放尺寸)

warpAffine(1.输入源图像 ,2.输出图像,3.仿射变换矩阵,4.输出图像的尺寸)

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
​
int main()
{
    //Point2f就类似定义一个float型
    Mat img = imread("h:\\1.jpg");
    Point2f center = Point2f(img.cols / 2, img.rows / 2);//设定旋转中心
    double angle;//旋转角度
    double scale;//缩放尺度
    printf("输入旋转的角度:");
    cin >> angle;
    printf("输入缩放的尺度:");
    cin >> scale;
​
​
    Mat rotateMat;
    rotateMat = getRotationMatrix2D(center, angle, scale);
    //旋转中心,旋转角度,缩放尺度
    Mat rotateImg;
    warpAffine(img, rotateImg, rotateMat, img.size());
    //输入源图像,输出图像,仿射变换矩阵,输出图像尺寸
    imshow("原图像", img);
    imshow("旋转后的图像", rotateImg);
    imwrite("h://2.jpg", rotateImg);//存储旋转后的图片
    waitKey(0);
    system("pause");
    return 0;
}
​
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
​
int main()
{
    //Point2f就类似定义一个float型
    Mat img = imread("h:\\1.jpg");
    Point2f center = Point2f(img.cols / 2, img.rows / 2);//设定旋转中心
    double angle;//旋转角度
    double scale;//缩放尺度
    printf("输入旋转的角度:");
    cin >> angle;
    printf("输入缩放的尺度:");
    cin >> scale;
​
​
    Mat rotateMat;
    rotateMat = getRotationMatrix2D(center, angle, scale);
    //旋转中心,旋转角度,缩放尺度
    Mat rotateImg;
    warpAffine(img, rotateImg, rotateMat, img.size());
    //输入源图像,输出图像,仿射变换矩阵,输出图像尺寸
    imshow("原图像", img);
    imshow("旋转后的图像", rotateImg);
    imwrite("h://2.jpg", rotateImg);//存储旋转后的图片
    waitKey(0);
    system("pause");
    return 0;
}
​

6.实验楼 实验1

 

解释器

Python 是一个脚本语言,你可以在 Python 解释器中直接写代码或者将代码写到一个文件里,然后执行这个文件(即脚本文件)。首先,我们从使用解释器开始,打开终端,键入python3 并回车。这个时候解释器便工作于交互模式。按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器。

脚本文件

先启动 Vim 并编辑 China。py,启动后不要乱按键。然后按 i 键进入插入模式,此时你可以看到左下角有 “插入” 两个字,现在你可以键入代码了。然后按 Esc 键退出插入模式,再键入 :wq 回车,Vim 就会保存文件并退出。要运行脚本文件 China.py,还要为文件添加可执行权限: chmod +x helloworld.py,然后执行脚本文件:$ ./helloworld.py

完成本实验后,明白了如何使用交互模式的 Python3 解释器,如何简单使用 vim 编写脚本文件并执行这个脚本文件,要特别注意的是,Python 使用缩进来定义语句块,缩进是 Python 语法的一部分,这与其它大多数语言不同。

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值