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日轮休。

  • 相关阅读:
    一个简单XQuery查询的例子
    《Microsoft Sql server 2008 Internals》读书笔记第七章Special Storage(1)
    《Microsoft Sql server 2008 Internals》读书笔记第八章The Query Optimizer(4)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(4)
    SQL Server中SMO备份数据库进度条不显示?
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(5)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(3)
    《Microsoft Sql server 2008 Internal》读书笔记第八章The Query Optimizer(2)
    省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例
    FireFox意外崩溃时的手工恢复命令
  • 原文地址:https://www.cnblogs.com/Shymuel/p/9316324.html
Copyright © 2011-2022 走看看