opencv03-Mat矩阵API的使用

opencv03-Mat矩阵API的使用

构造方法(具体介绍看API文档)

cpp 复制代码
int main() {
    Mat m1 = Mat(200, 100, CV_8UC1);
    imshow("o1", m1);
    Mat m2 = Mat(Size(100, 200), CV_8UC1);
    imshow("o2", m2);

    Mat m3 = Mat(200, 100, CV_8UC3, Scalar(255, 0, 0));
    imshow("o3", m3);

    const int sizes[] = {200, 3};
    Mat m4 = Mat(2, sizes, CV_8UC3);
    imshow("m4", m4);

    waitKey(0);
    return 0;
}

成员方法

cpp 复制代码
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/**
 * Mat操作
 */
int main() {
    string filename = "D:/workspace/cpp_workspace/my-cv/data/img/lena.jpg";
    Mat img = imread(filename, ImreadModes::IMREAD_COLOR);

    Mat b = Mat(img); //部分复制Mat,只复制对象的头和指针,不复制数据


    /**
     * 1. int channels() 返回矩阵的channel
     */
    cout << img.channels() << endl; // 3

    Mat img2;
    cvtColor(img, img2, COLOR_BGR2GRAY); // 彩色转换为灰白
    imshow("img2", img2);
    cout << img2.channels() << endl; // 1

    /**
     *2. int depth() 返回一个矩阵元素的深度
     * img.cols:矩阵的列数
     * img.dims:矩阵的维数 >=2
     * img.rows:矩阵的行数
     * img.size:矩阵的行数*列数
     * img.row(0); //
     * bool empty(); 判断矩阵是否为空
     */
    cout << img.depth() << endl; // 0
    cout << img2.depth() << endl;// 0
    cout << img.cols << endl; // 512
    cout << img2.cols << endl; // 512

    cout << img.dims << endl; // 2 -维数
    cout << img.size << endl; // 512 x 512

    cout << img.rows << endl; // 512
    cout << img2.rows << endl; // 512
    cout << img.row(0).size << endl; // 1 x 512
    cout << img.col(0).size << endl; // 512 x 1

    // Returns true if the array has no elements.
    cout << img.empty() << endl;


    /**
     * 3. void copyTo(Mat mat) 将矩阵复制到另一个矩阵, 参数 mat为目标矩阵,如果在操作前没有适当的大小或类型,则为重新分配。
     * 该方法将矩阵数据复制到另一个矩阵。在复制数据之前,该方法调用
     *          m.create(this->size(), this->type());
     * 以便在需要时重新分配目标矩阵。While m.copyTo(m); works flawlessly, 函数不处理源矩阵和目标矩阵之间部分重叠的情况。
     * 指定操作掩码时,如果上面显示的 Mat::create 调用重新分配矩阵,在复制数据之前,新分配的矩阵将初始化为全零。
     *
     * 完全复制Mat,包括对象的头,指针和数据
     */
    Mat copyTo;
    img.copyTo(copyTo);
    imshow("copyTo", copyTo);

    /**
     * 4. void convertTo(Mat dst, int type)
     *
     */
    Mat convertTo;
    img.convertTo(convertTo, CV_8UC4);
    imshow("convertTo", convertTo);

    /**
     * 5. Mat clone(): 创建一个完整的mat的copy, 完全复制Mat,包括对象的头,指针和数据
     */
    Mat clone = img.clone();
    imshow("clone", clone);

    cout << ".............................." << endl;
    /**
     * 6. uchar* ptr(i=0)
     */
    Mat M;
    M.create(4, 3, CV_8UC2);
    M = Scalar(127, 127);
    cout << "M = " << endl << " " << M << endl << endl;
    uchar *firstRow = M.ptr<uchar>(1);
    printf("%d\n", *firstRow);

    Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    cout << "C = " << endl << " " << C << endl << endl;


    cout << ".............................." << endl;
    cv::Mat image = cv::Mat::ones(5, 10, CV_8UC1); //宽5,长10
    uchar *data00 = image.ptr<uchar>(0); // data00是指向image第一行第一个元素的指针。
    uchar *data10 = image.ptr<uchar>(1); // data10是指向image第二行第一个元素的指针。
    uchar data01 = image.ptr<uchar>(0)[1]; // data01是指向image第一行第二个元素的指针。
    printf("%d\n", *data00); // 1
    printf("%d\n", data01); // 1
    cout << image << endl; //


    waitKey(0);
    return 0;
}

成员方法 create

cpp 复制代码
/**
 *
 * 1. void create(int rows, int cols, int type);
 * 2. void create(Size size, int type);
 * 3. void create(int ndims, const int* sizes, int type);
 * 4. void create(const std::vector<int>& sizes, int type);
 */
int main() {

    //1. void create(int rows, int cols, int type);
    Mat m;
    m.create(2, 3, CV_8UC1);

    //3. void create(int ndims, const int* sizes, int type);
    Mat m3;
    const int sizes[] = {3, 4};
    m3.create(2, sizes, CV_8UC3);
    cout << m3 << endl;


    // 4. void create(const std::vector<int>& sizes, int type);
    Mat m4;
    std::vector<int> sizes2 = vector<int>();
    sizes2.push_back(3);
    sizes2.push_back(4);

    m4.create(sizes2, CV_8UC3);
    cout << m4 << endl;
    waitKey(0);
    return 0;
}
相关推荐
才思喷涌的小书虫16 分钟前
小白玩转 DINO-X MCP(2):基于 DINO-X MCP 搭建饮食规划工作流
计算机视觉·mcp
计算机sci论文精选2 小时前
CVPR 2025 | 具身智能 | HOLODECK:一句话召唤3D世界,智能体的“元宇宙练功房”来了
人工智能·深度学习·机器学习·计算机视觉·机器人·cvpr·具身智能
山烛3 小时前
OpenCV 图像处理基础操作指南(二)
人工智能·python·opencv·计算机视觉
CoovallyAIHub3 小时前
线性复杂度破局!Swin Transformer 移位窗口颠覆高分辨率视觉建模
深度学习·算法·计算机视觉
点云SLAM4 小时前
Eigen中Dense 模块简要介绍和实战应用示例(最小二乘拟合直线、协方差矩阵计算和稀疏求解等)
线性代数·算法·机器学习·矩阵·机器人/slam·密集矩阵与向量·eigen库
R-G-B7 小时前
【P38 6】OpenCV Python——图片的运算(算术运算、逻辑运算)加法add、subtract减法、乘法multiply、除法divide
人工智能·python·opencv·图片的运算·图片加法add·图片subtract减法·图片乘法multiply
硅谷秋水7 小时前
在相机空间中落地动作:以观察为中心的视觉-语言-行动策略
机器学习·计算机视觉·语言模型·机器人
hllqkbb8 小时前
从 SGD 到梯度累积:Epoch、Batch、Step 的关系全解析
开发语言·人工智能·opencv·计算机视觉·batch
若天明20 小时前
深度学习-计算机视觉-微调 Fine-tune
人工智能·python·深度学习·机器学习·计算机视觉·ai·cnn
GitLqr20 小时前
AI洞察 | 混元、昆仑 重塑 3D 世界新方向
计算机视觉·游戏开发·音视频开发