Mat类型的创建及运算--OpenCV01

Mat类型的构造方式有二十多种,仅学习了常用的构造方式。

1)利用im.read函数读入图像

    Mat Img1 = imread("C:/Users/Desktop/lena.jpg");//读入图像 路径用/递进
    namedWindow("Input img",WINDOW_AUTOSIZE); //创建一个窗口1
    imshow("Input img", Img1); //在窗口1上展示图片

2)拷贝构造

    Mat Img2;
    Img2 = Img1.clone(); // Img2就拷贝了一份Img1的图像
    imshow("output img", Img2);

3)相同类型构造

    Mat Img3;
    Img3 = Mat(Img1.size(), Img1.type()); //取图像1的大小 图像1的类型相同构造一个大小相同的矩阵
    Img3 = Scalar(255, 0, 0); //BGR 三位 
         //由于Img1是三通道的,故Scalar可以有三个参数赋值 
         //分别对应三通道的BGR  Blue Green Red
    namedWindow("Output img", WINDOW_AUTOSIZE); //创建一个窗口1
    imshow("Output img", Img2);

 4)构造时赋值操作

    //rows为行数,cols为列数  Size(cols,rows)
    Mat Img3(Size(480, 640), CV_8UC1); //构造一个行为640 列为480的 8位无符号单通道矩阵
    Img3 = Scalar(255);  //此单通道灰度图像 可以将所以的单元赋值为255 灰度值

    ///还可以直接在开始便进行赋值操作
    Mat a(2, 2, CV_8UC3, Scalar(255, 255, 255)); // 2*2 8位无符号三通道矩阵 每个元素都是255

5)利用数组构造

    Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    //利用枚举法赋值操作
    Mat c = cv::Mat_<int>(3, 3); //创建一个的3*3的矩阵
    for (int i = 0;i < c.rows;i++)
        for (int j = 0;j < c.cols;j++)
            c.at<int>(i, j) = i+j;  //给每个元素赋值操作

    //利用数组进行赋值//

    unsigned char arr[8] = { 5,6,7,8,1,2,3,4 };
    Mat f = cv::Mat(2, 2, CV_8UC2, arr);

6)类方法赋值


    //类方法赋值//

    Mat a = cv::Mat::eye(3,3,CV_8UC1); //构建3*3单位矩阵 对角元素为1

    Mat b = (cv::Mat_<int>(1, 3) << 1, 2, 3); //构建1*3的矩阵 数据为 1 2 3

    Mat c = cv::Mat::diag(b);  //c的对角元素为b的元素 其余都是0

    Mat d = cv::Mat::ones(3, 3, CV_8UC1); //构建单通道全为1的3*3矩阵

    Mat e = cv::Mat::zeros(4, 2, CV_8UC1); //构建单通道全为0的 4*2的矩阵

                                                                      Mat类的运算

Mat创建的是图像矩阵,其运算规则类似与矩阵的运算。 乘法分为矩阵的乘法与数乘运算

    Mat a = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    
    //加法减法就是矩阵的加法减法 --乘法除法为数乘数除
    c = a + b; 
    d = a - b;
    e = 2 * a;
    f = a / 2;

    Mat a1 = (cv::Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
    Mat b1 = (cv::Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);

     Mat g;

    
    g = a1 * b1;  
    //要进行矩阵乘法 元素类型必须都是CV_32FC1 CV_64FC1 CV_32FC1 CV_64FC2
    //即矩阵类型为float或者double类型


    double k;
    k = a.dot(b); //dot返回类型是double
    //即把a矩阵扩展成一个行向量
    //b矩阵扩展成一个列向量 然后进行内积乘 
    // 结果即是1+4+9+16..... 1-9的平方和
    cout << k << endl;


    Mat m;
    m = a.mul(b); //a与b进行数乘运算 每个对应的矩阵元素相乘 而不是进行矩阵乘法,内积运算

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值