zoukankan      html  css  js  c++  java
  • OpenCV学习(7.14)

    图像旋转:
    两种情况:绕原点旋转;绕特定点旋转。
    方法一:用访问像素的方法直接旋转。
    方法二:乘矩阵。

    Mat类型:
    Mat是一个类,有两个部分:矩阵头和一个指向存储所有像素值的矩阵的指针。
    Mat A,C;//只创建信息头
    A=imread("1.jpg");
    Mat B(A);//使用拷贝构造函数
    C=A;//赋值运算符
    不仅如此,我们还可以创建仅包含部分边界信息的信息头。
    Mat D(A,Rect(10,10,100,100));//给出矩形角上的两个点
    Mat E=A(Range:all(), Range(1,3));//??这种方法有问题,过不了编译。

    如果确实想复制一个完整的矩阵,使用函数clone()或copyTo()
    Mat F=A.clone();
    Mat G;
    A.copyTo(G);


    因为需要图像旋转,学习了仿射变换。
    仿射变换:一个向量空间进行一次线性变换并接上一个平移。
    一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。
    所以仿射变换能用来表示如下三种变换形式:
    旋转,rotation;
    平移,translation;
    缩放,scale。
    通常使用2*3的矩阵来表示仿射变换。
    已有(x,y),则新向量为(a00x+a01y+b00,a10x+a11y+b10)。

    getRotationMatrix2D函数

    主要用于获得图像绕着 某一点的旋转矩阵
    函数调用形式:
    Mat getRotationMatrix2D(Point2f center, double angle, double scale)

    参数详解:
    Point2f center:表示旋转的中心点
    double angle:表示旋转的角度,正值表示逆时针旋转
    double scale:图像缩放因子

    void warpAffine(InputArray src, OutputArray dis,
    InputArray M, Size dsize, int flags=INTER_LINEAR, intborderMode=BORDER_CONSTANT,
    const Scalar& borderValue=Scalar() );

    第一个参数,存储输入图像的矩阵;
    第二个参数,存储运算结果的矩阵;
    第三个参数,2*3的变换矩阵;
    第四个参数,输出图像的尺寸;
    第五个参数,flags,插值方式;
    第六个参数,边界像素模式;
    第七个参数,恒定的边界情况下取得值,默认为0。

    已经调试到没问题了。

    // 图像左(右)转.cpp : 定义控制台应用程序的入口点。
    
    #include "stdafx.h"
    
    using namespace std;
    using namespace cv;
    
    double a = 480, b = 640;//长宽
    
    int main()
    {
    VideoCapture capture;
    capture.open(0);
    
    
    //构件旋转矩阵(2x3矩阵)
    Mat rot_matl = (Mat_<double>(2, 3) << 0, 1, 0 , -1, 0, b);
    Mat rot_matr = (Mat_<double>(2, 3) << 0, -1, a, 1, 0, 0);
    //rot_matl.at<int,int>(0, 2) = rot_matl.at<int,int >(1, 2) = 0;
    
    while (1)
    {
    Mat frame;
    capture >> frame;
    Mat cameral,camerar;
    
    Size src_sz = frame.size();
    Size dst_sz(src_sz.width, src_sz.height);
    
    
    //指定旋转中心
    Point2f center(340, 230);
    
    
    //cout << rot_matl << endl;
    //waitKey(0);
    //根据旋转矩阵进行仿射变换
    warpAffine(frame, cameral, rot_matl, dst_sz);
    warpAffine(frame, camerar, rot_matr, dst_sz);
    
    //显示旋转效果
    namedWindow("image", WINDOW_AUTOSIZE); namedWindow("result", WINDOW_AUTOSIZE);
    imshow("image", frame);
    imshow("result", cameral);
    imshow("result2", camerar);
    waitKey(33);
    
    }
    return 0;
    }

    void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
    img – 图像;pt1 – 直线起点;pt2 – 直线终点;color – 颜色;thickness – 粗细
    lineType – 直线类型,可以是如下值
    8 (or omitted) - 8-connected 线
    4 - 4-connected 线.
    CV_AA - 抗锯齿线.
    shift – 分位的点坐标

    第二版直升机程序快写完了。

     7月15日轮休。

  • 相关阅读:
    SpringMVC 2
    MySQL--事务,隔离性和隔离级别
    String.intern()
    初识消息队列--ActiveMq
    Java后台上传图片到七牛云
    Thread.interrupt(),Thread.isInterrupted(),Thread.interrupted()碎碎念
    Java基础--对象
    Java后台调用gcc编译C语言代码
    ToolProvider.getSystemJavaCompiler()方法空指针的排坑
    [LeetCode]29 两数相除和一个小坑点
  • 原文地址:https://www.cnblogs.com/Shymuel/p/9316324.html
Copyright © 2011-2022 走看看