精华内容
下载资源
问答
  • Mat M(2,2,CV_8UC3,Scalar(0,0,255)); 其中“2,2”表示Rows和Cols各为2; CV_8UC3表示M矩阵对应的参数类型是Unsigned char 8bits,3通道; 标量Scalar(0,0,255)表示每个像素所对应的像素值 补充: 8-bit unsigned ...

    OpenCV官方文档中三通道图片像素生成是这样实现的
    在这里插入图片描述

    1. Mat M(2,2,CV_8UC3,Scalar(0,0,255)); 其中“2,2”表示Rows和Cols各为2;
    2. CV_8UC3表示M矩阵对应的参数类型是Unsigned char 8bits,3通道;
    3. 标量Scalar(0,0,255)表示每个像素所对应的像素值

    补充:
    8-bit unsigned integer (uchar)
    8-bit signed integer (schar)
    16-bit unsigned integer (ushort)
    16-bit signed integer (short)
    32-bit signed integer (int)
    32-bit floating-point number (float)
    64-bit floating-point number (double)
    a tuple of several elements where all elements have the same type
    (one of the above). An array whose elements are such tuples, are
    called multi-channel arrays, as opposite to the single-channel
    arrays, whose elements are scalar values. The maximum possible number
    of channels is defined by the CV_CN_MAX constant, which is currently
    set to 512.
    对于以上这些基本类型, 有以下应用枚举:

    enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };
    

    当然也可以自定义Mat的数据类型

    Example:
    目的:生成一个2x3x5的矩阵,数据类型为double,并进行赋值

        //自定义数据类型
        typedef cv::Vec<double, 5> Vec5d;
        //生成一个2x3x5的Mat,数据为double型
        Mat M = cv::Mat::zeros(2, 3, CV_64FC(5));                                             
        std::cout << "channel = " << M.channels() << endl;//输出为5
        for (int i = 0; i < M.rows; i++)
        {
            for (int j = 0; j < M.cols; j++)
            {
                for (int c = 0; c <M.channels(); c++)
                {
                    //给M的每一个元素赋值                
                    M.at<Vec5d>(i, j)[c] = c*0.01;              
                }
            }
        }
        cout <<M << endl;//输出矩阵
    
    展开全文
  • cv::Mat在SLAM经常用于存储图像数据以及相机位姿,其兼容的数据类型多种多样,使用此数据结构前要明确搞清楚当前矩阵元素是什么类型的,不然后面进行逐个元素访问或者计算时会经常出错。 1、数据类型查看方法: cv::...

    cv::Mat在SLAM经常用于存储图像数据以及相机位姿,其兼容的数据类型多种多样,使用此数据结构前要明确搞清楚当前矩阵元素是什么类型的,不然后面进行逐个元素访问或者计算时会经常出错。
    1、数据类型查看方法:

    cv::Mat T;
    std::cout<<T.type()<<endl;
    

    2、type()返回值与数据类型对应关系:

    返回值 C1 C2 C3 C4
    CV_8U 0 8 16 24
    CV_8S 1 9 17 25
    CV_16U 2 10 18 26
    CV_16S 3 11 19 27
    CV_32S 4 12 20 28
    CV_32F 5 13 21 29
    CV_64F 6 14 22 30

    3、使用at进行逐个元素访问:

    std::cout<<T.at<float>(0,0)<<endl;
    

    at括号中的关键字要与T的真实类型匹配,不然会出错,例如CV_8U要用T.at< unsigned char> 访问.
    对应关系如下:

    数据类型 关键字 占用字节 范围
    CV_8U unsigned char 1 字节 0 到 255
    CV_8S char 1 字节 -128 到 127
    CV_16U unsigned short 2 字节 0 到 65,535
    CV_16S short 2 字节 -32768 到 32767
    CV_32S int 4 字节 -2147483648 到 2147483647
    CV_32F float 4 字节 +/- 3.4e +/- 38 (~7 个数字)
    CV_64F double 8 字节 +/- 1.7e +/- 308 (~15 个数字)

    4、出错现象总结
    (1)访问和赋值时数据类型不对时Mat里面就开始乱存数据了,但不会报错,很难找

    Mat Tcw = Mat::zeros(4, 4, CV_32FC1);
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                Tcw.at<double>(i, j) = rotation_matrix1(i, j); 
    

    (2)不同数据类型矩阵相乘也会出错,这个错误在编译时是会报出的

    Mat Tcw = Mat::zeros(4, 4, CV_32FC1);
    cv::Mat t(4,1,CV_64F);
    t = Tcw * t;
    

    5、多维矩阵元素访问

     const int histSize[] = {N, N, N}; 
     cv::Mat mColorHist;
     mColorHist.create(3, histSize, CV_32F); 
     
     cv::Mat_<cv::Vec3b>::iterator it = mColorHist.begin<cv::Vec3b>();
     cv::Mat_<cv::Vec3b>::iterator it_end = mColorHist.end<cv::Vec3b>();
     
     for(; it != it_end; ++it)
     {
         const cv::Vec3b& pix = *it;
         cout<<mColorHist.at<float>(pix[0], pix[1], pix[2])<<" ";
     }
    

    6、图片像素访问
    一、.png格式
    png格式图片有四个通道,读取顺序为rgba:

    cv::imPNG =cv::imread("1.png",CV_LOAD_IMAGE_UNCHANGED);  //CV_8UC4  bgra
    for ( int m=0; m<kf->imPNG.rows; m+=4 )
        {
            for ( int n=0; n<kf->imPNG.cols; n+=4 )
            {
                pcl::PointXYZRGBA p;
    //            p.r = imPNG.ptr<uchar>(m)[n*4+0];
    //            p.g = imPNG.ptr<uchar>(m)[n*4+1];
    //            p.b = imPNG.ptr<uchar>(m)[n*4+2];
    //            p.a = imPNG.ptr<uchar>(m)[n*4+3];
                p.r = imPNG.at<cv::Vec4b>(m,n)[0];
                p.g = imPNG.at<cv::Vec4b>(m,n)[1];
                p.b = imPNG.at<cv::Vec4b>(m,n)[2];
                p.a = imPNG.at<cv::Vec4b>(m,n)[3];
                tmp->points.push_back(p);
            }
        }
        
    

    二、.jpg格式
    jpg格式图片有三个通道,读取顺序为bgr:

    cv::imJPG =cv::imread("1.png",CV_LOAD_IMAGE_UNCHANGED);  //CV_8UC4  bgra
    for ( int m=0; m<kf->imJPG.rows; m+=4 )
        {
            for ( int n=0; n<kf->imJPG.cols; n+=4 )
            {
                pcl::PointXYZRGBA p;
    //            p.r = imJPG.ptr<uchar>(m)[n*3+0];
    //            p.g = imJPG.ptr<uchar>(m)[n*3+1];
    //            p.b = imJPG.ptr<uchar>(m)[n*3+2];
                p.r = imJPG.at<cv::Vec3b>(m,n)[0];
                p.g = imJPG.at<cv::Vec3b>(m,n)[1];
                p.b = imJPG.at<cv::Vec3b>(m,n)[2];
                tmp->points.push_back(p);
            }
        }
    

    注:Vec3b - for uchar, Vec3i - for int, Vec3f - for float, Vec3d - for double

    参考博客:
    https://www.runoob.com/cplusplus/cpp-data-types.html
    https://blog.csdn.net/weixin_35695879/article/details/85948011
    http://cn.voidcc.com/question/p-yxesasxj-th.html
    https://blog.csdn.net/qq_30815237/article/details/86656631

    展开全文
  • Mat多维数组初始化 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> int main() { //定义一个...

    Mat多维数组初始化

    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    int main()
    {
        //定义一个float数组
        float a[4] = {1,2,3,4};
        //将数组转换为矩阵,2行2列的矩阵
        cv::Mat a_mat = cv::Mat(2,2,CV_32F,a);
        //输出矩阵
        std::cout << a_mat << std::endl;
        //查看矩阵的某个元素,查看矩阵第一行第二列的元素值
        std::cout << a_mat.at<float>(0, 1) << std::endl;
    }

    输出信息

    [1, 2;
     3, 4]
    2

    Mat的dot

    在使用Mat做dot需要注意,前一个矩阵列数必须等于后一个矩阵的行数

    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    int main()
    {
        //定义一个float数组
        float a[4] = {1,2,3,4};
        //将数组转换为矩阵,2行2列的矩阵
        cv::Mat a_mat = cv::Mat(2,2,CV_32F,a);
        float b[2] = { 5,6 };
        //将数组转换为2行一列的矩阵
        cv::Mat b_mat = cv::Mat(2, 1, CV_32F, b);
        //矩阵的dot
        cv::Mat c_mat = a_mat * b_mat;
        std::cout << c_mat << std::endl;
    }

    输出信息

    [17;
     39]

    Mat的Element-wise

    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    int main()
    {
        //定义一个float数组
        float a[4] = {1,2,3,4};
        //将数组转换为矩阵,2行2列的矩阵
        cv::Mat a_mat = cv::Mat(2,2,CV_32F,a);
        float b[4] = { 5,6,7,8 };
        //将数组转换为2行2列的矩阵
        cv::Mat b_mat = cv::Mat(2, 2, CV_32F, b);
        //矩阵的dot
        cv::Mat c_mat = a_mat.mul(b_mat);
        std::cout << c_mat << std::endl;
    }

    输出信息

    [5, 12;
     21, 32]

     

    展开全文
  • 转载 论numpy中matrix 和 array的区别Numpy mat必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。在...

    转载 论numpy中matrix 和 array的区别

    Numpy mat必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。

    在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。

    import numpy as np

    import numpy as np

    a=np.mat([[1,2], [3,4]])

    b=np.mat([[5,6],[7,8]])

    print(a)

    print(b)

    print(a*b)

    输出

    [[1 2]

    [3 4]]

    [[5 6]

    [7 8]]

    [[19 22]

    [43 50]]

    matrix 和 array 都可以通过objects后面加.T 得到其转置。但是 matrix objects 还可以在后面加 .H f得到共轭矩阵, 加 .I 得到逆矩阵。

    相反的是在numpy里面arrays遵从逐个元素的运算,所以array:c 和d的cd运算相当于matlab里面的c.*d运算。

    c=np.array([[4, 3], [2, 1]])

    d=np.array([[1, 2], [3, 4]])

    print(c*d)

    # [[4 6]

    # [6 4]]

    而矩阵相乘,则需要numpy里面的dot命令 :

    print(np.dot(c,d))

    # [[13 20]

    # [ 5 8]]

    ** 运算符的作用也不一样 :

    print(a**2)

    # [[22 15]

    # [10 7]]

    print(c**2)

    # [[16 9]

    # [ 4 1]]

    因为a是个matrix,所以a2返回的是aa,相当于矩阵相乘。而c是array,c*2相当于,c中的元素逐个求平方。

    问题就出来了,如果一个程序里面既有matrix 又有array,会让人脑袋大。但是如果只用array,你不仅可以实现matrix所有的功能,还减少了编程和阅读的麻烦。

    当然你可以通过下面的两条命令轻松的实现两者之间的转换:np.asmatrix和np.asarray

    展开全文
  • OpenCV:创建Mat矩阵的几种常用方法

    千次阅读 2019-05-16 23:49:48
    创建多维矩阵 创建特殊矩阵 创建二维矩阵 默认构造函数 函数原型: Mat(); 示例: Mat m(480,640,CV_8UC3); Mat n; n=m; 创建无颜色矩阵 函数原型: void Mat::create(int _rows, int _cols, int _type...
  • Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处理的都是二维矩阵,是一个平面上的矩阵。 可以理解为房屋是一个一层的平房,三维或更多维的则是多层楼房; .rows: Mat矩阵的行数...
  • Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处理的都是二维矩阵,是一 个平面上的矩阵。 可以理解为房屋是一个一层的平房,三维或更多维的则是多层楼房; rows: Mat矩阵的行数。可...
  • Python调Matlab function多维numpy矩阵输入

    千次阅读 2019-02-25 14:42:45
    假设matlab中某一个函数的输入参数是多维矩阵,那我们可以把python中定义好的数组先转成list,如下: np_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) mat_a = matlab.double(np_a.tolist()) 这样生成的mat_a...
  • 不过在转化的时候得注意,特别是涉及到1维矩阵转化为多维矩阵的操作时,MATLAB与Pythonh,Mathematica有本质的不同,MATLAB是按照先“列”后“行”的顺序存数据的,而Mathematica和Python是按照先“行...
  • Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处理的都是二维矩阵,是一 个平面上的矩阵。 可以理解为房屋是一个一层的平房,三维或更多维的则是多层楼房; rows: Mat矩阵的...
  • 掌握NumPy矩阵与通用函数NumPy对于多维数组的运算,默认情况下并不进行矩阵运算。如果需要对数组进行矩阵运算,则可以调用相应的函数。1、创建NumPy矩阵在NumPy中,矩阵是ndarray的子类。在NumPy中,数组和矩阵有着...
  • 多维 opencv Mat访问

    2020-12-12 12:35:26
    下面是对各维度矩阵的介绍:   注意:下面的操作只是我常用的操作方法,不是唯一的方法,对于那些没有思路的同学,下面的内容希望起到抛砖引玉的效果。   我以单通道的uchar类型的图片做例子 1. 二维Mat  ...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 228
精华内容 91
关键字:

mat多维矩阵