opencv03-Mat矩阵API的使用

这篇具有很好参考价值的文章主要介绍了opencv03-Mat矩阵API的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

opencv03-Mat矩阵API的使用

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

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;
}

成员方法

#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

/**
 *
 * 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;
}

文章来源地址https://www.toymoban.com/news/detail-624021.html

到了这里,关于opencv03-Mat矩阵API的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Google Vision API进行计算机视觉图像创意分析

    介绍 计算机视觉可以用来从图像、视频和音频中提取有用的信息。它允许计算机看到并理解从视觉输入中可以收集到什么信息。在接收到视觉输入后,它可以在图像中收集有价值的信息,并确定必须采取的下一步。 Google Vision API是一种Google云服务,它允许使用计算机视觉从图

    2024年02月06日
    浏览(49)
  • 计算机视觉传统图像处理库opencv的使用

    人工智能领域的图像处理分支,整理了计算机视觉传统图像处理库opencv的使用网址链接。 opencv使用范围,主要用在计算机视觉、视频分析、机器学习、医学影像处理、自动驾驶、工业检测、游戏开发上。 1):opencv效果视频 opencv10个应用场景 - 知乎 2):opencv介绍 AI必备技能

    2024年02月09日
    浏览(42)
  • 【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测

    人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸的外接矩形在图像中的坐标。使用 haar 特征和 cascade 检测器进行人脸检测是一种传统的方式,下面将给出利用 OpenCV 中的 haarcascade 进行人脸检测的代码。 可选的人脸检测模型(区别是检测速度和精度不同

    2023年04月12日
    浏览(61)
  • 使用 OpenCV4 和 C++ 构建计算机视觉项目:1~5

    原文:Building Computer Vision Projects with OpenCV 4 and C++ 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。 计算

    2023年04月20日
    浏览(50)
  • 实战指南:使用OpenCV 4.0+Python进行机器学习与计算机视觉

    💂 个人网站:【办公神器】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 计算机视觉和机器学习的融合为我们带来了前所未有的机会和挑战。从智能助手到

    2024年02月13日
    浏览(52)
  • 计算机视觉与深度学习-图像分割-视觉识别任务03-实例分割-【北邮鲁鹏】

    论文题目:Mask R-CNN 论文链接:论文下载 论文代码:Facebook代码链接;Tensorflow版本代码链接; Keras and TensorFlow版本代码链接;MxNet版本代码链接 参考:Mask R-CNN详解 将图像中的每个像素与其所属的目标实例进行关联,并为每个像素分配一个特定的标签,以实现像素级别的目标

    2024年02月07日
    浏览(58)
  • 计算机视觉基础:【矩阵】矩阵选取子集

    OpenCV的基础是处理图像,而图像的基础是矩阵。 因此,如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作,从而更好地实现对图像的处理。 示例:选取矩阵中指定的行和列的交集。 例如,在下图中选定第2行、第3行和第

    2024年02月21日
    浏览(35)
  • 【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

    在当今技术日益进步的时代,计算机视觉已成为我们生活中不可或缺的一部分。从智能监控到虚拟现实,计算机视觉技术的应用范围日益广泛。在这篇博客中,我们将探索一个特别实用的计算机视觉案例:使用OpenCV实现摄像头测距。这一技术不仅对专业人士有用,也为编程爱

    2024年02月04日
    浏览(45)
  • 计算机视觉入门 - MacOS搭建Python的OpenCV环境并在VScode上使用的详细步骤(完整版)

    目录 过程: 下载VScode编辑器: 在VScode中安装Python插件:  安装Python解释器: 测试Python程序:  安装wget插件: 安装cmake插件:  安装opencv: 通过程序来测试opencv: 运行成功:  要使用的东西:VScode编辑器、Terminal终端、Homebrew软件包管理工具、Python、OpenCV 首先在Mac上下载

    2024年01月16日
    浏览(50)
  • 计算机视觉(OpenCV+TensorFlow)

    本系列文章是OpenCV系列文章的第三篇,仍然跟随上篇内容主要聚焦于图像的一些操作 在通常情况下我们使用大小恒定的图像。但在某些情况下,我们需要使用不同分辨率的同幅图像,例如,在搜索图像中的某些内容比如脸部信息时,并不确定该内容在图像中占据的大小。这种

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包