【c++ Opencv】Opencv中Mat的一些相关操作

这篇具有很好参考价值的文章主要介绍了【c++ Opencv】Opencv中Mat的一些相关操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++中的Mat类是OpenCV库中最核心的数据结构之一,用于表示图像和矩阵等二维、三维数据。Mat类的主要特点是可轻松地访问像素点,支持各种矩阵运算,可以实现各种图像处理算法。下面是一些常见的Mat操作:

1. 创建Mat对象:可以通过构造函数、静态方法或赋值操作符来创建Mat对象,例如:

cv::Mat mat1; //创建空的Mat对象
cv::Mat mat2(100, 200, CV_8UC3); //创建大小为100x200,类型为CV_8UC3的Mat对象
cv::Mat mat3 = cv::Mat::zeros(200, 300, CV_8UC1); //创建大小为200x300,类型为CV_8UC1,像素值为0的Mat对象
cv::Mat mat4 = cv::imread("test.jpg"); //从文件中读取图像,返回一个Mat对象

2. 访问像素点:可以通过at()方法或指针方式访问Mat对象中的像素点,例如:

int value1 = mat1.at<int>(row, col); //获取Mat对象中(row, col)处的像素值
uchar value2 = mat2.ptr<uchar>(row)[col * 3]; //获取Mat对象中(row, col)处的B通道的像素值(类型为CV_8UC3)

3. 修改像素点:可以通过at()方法或指针方式修改Mat对象中的像素点,例如:

mat1.at<int>(row, col) = value1; //将Mat对象中(row, col)处的像素值设为value1
mat2.ptr<uchar>(row)[col * 3] = value2; //将Mat对象中(row, col)处的B通道的像素值(类型为CV_8UC3)设为value2

4. 访问Mat对象的属性:可以通过rows、cols和type等属性访问Mat对象的大小和类型,例如:

int rows = mat1.rows; //获取Mat对象的行数
int cols = mat2.cols; //获取Mat对象的列数
int type = mat3.type(); //获取Mat对象的像素类型

5. 矩阵运算:可以利用Mat对象进行各种矩阵运算,例如:

cv::Mat mat5 = mat2 * 2; //将Mat对象中所有像素值乘以2
cv::Mat mat6 = mat2 + mat3; //将两个Mat对象中的像素值相加
cv::Mat mat7 = mat3.t(); //将Mat对象转置

6. 通道分离和合并:可以将多通道的Mat对象分离成单通道的Mat对象,或将多个单通道的Mat对象合并成多通道的Mat对象,例如:

std::vector<cv::Mat> channels;
cv::split(mat2, channels); //将Mat对象的三个通道分离成三个Mat对象
cv::merge(channels, mat2); //将三个Mat对象合并成一个Mat对象

7. 图像缩放:可以通过resize()方法对Mat对象进行缩放,例如:

cv::Mat dst;
cv::resize(src, dst, cv::Size(200, 100)); //将src Mat对象缩放为大小为200x100的dst Mat对象

8. 图像平移:可以通过warpAffine()方法对Mat对象进行平移,例如:

cv::Mat dst;
cv::Mat M = (cv::Mat_<float>(2,3) << 1, 0, 50, 0, 1, 100); //定义平移矩阵
cv::warpAffine(src, dst, M, src.size()); //进行平移操作,输出结果保存在dst Mat对象中

9. 图像旋转:可以通过warpAffine()方法对Mat对象进行旋转,例如:

cv::Mat dst;
cv::Point2f center(src.cols/2.0, src.rows/2.0); //定义旋转中心
cv::Mat M = cv::getRotationMatrix2D(center, 45, 1.0); //定义旋转矩阵
cv::warpAffine(src, dst, M, src.size()); //进行旋转操作,输出结果保存在dst Mat对象中

10. 图像翻转:可以通过flip()方法对Mat对象进行翻转,例如:

cv::Mat dst;
cv::flip(src, dst, 1); //将src Mat对象水平翻转,输出结果保存在dst Mat对象中

11. 图像膨胀和腐蚀:可以通过dilate()和erode()方法对Mat对象进行膨胀和腐蚀操作,例如:

cv::Mat dst1, dst2;
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)); //定义膨胀和腐蚀时的结构元素
cv::dilate(src, dst1, kernel); //对src Mat对象进行膨胀操作,输出结果保存在dst1 Mat对象中
cv::erode(src, dst2, kernel); //对src Mat对象进行腐蚀操作,输出结果保存在dst2 Mat对象中

12. 直方图均衡化:可以通过equalizeHist()方法对Mat对象进行直方图均衡化操作,用于改善图像对比度,例如:

cv::Mat dst;
cv::equalizeHist(src, dst); //对src Mat对象进行直方图均衡化操作,输出结果保存在dst Mat对象中

13. 高斯滤波:可以通过GaussianBlur()方法对Mat对象进行高斯滤波操作,用于去噪和平滑图像,例如:

cv::Mat dst;
cv::GaussianBlur(src, dst, cv::Size(3,3), 0); //对src Mat对象进行高斯滤波操作,输出结果保存在dst Mat对象中

14. Canny边缘检测:可以通过Canny()方法对Mat对象进行Canny边缘检测操作,例如:

cv::Mat dst;
cv::Canny(src, dst, 50, 150); //对src Mat对象进行Canny边缘检测操作,输出结果保存在dst Mat对象中

15. Hough变换:可以通过HoughLines()和HoughCircles()方法对Mat对象进行Hough变换,用于检测直线和圆等形状,例如:

std::vector<cv::Vec2f> lines;
cv::HoughLines(dst, lines, 1, CV_PI/180, 100); //对dst Mat对象进行Hough直线检测操作,输出结果保存在lines中
std::vector<cv::Vec3f> circles;
cv::HoughCircles(dst, circles, CV_HOUGH_GRADIENT, 1, src.rows/8, 200, 100, 0, 0); //对dst Mat对象进行Hough圆检测操作,输出结果保存在circles中

16. 分水岭算法:可以通过distanceTransform()、threshold()和watershed()方法对Mat对象进行分水岭算法,用于图像分割,例如:文章来源地址https://www.toymoban.com/news/detail-635760.html

cv::Mat dst, binary, distance;
cv::distanceTransform(src, distance, cv::DIST_L2, 3); //对src Mat对象进行距离变换,输出结果保存在distance Mat对象中
cv::threshold(distance, binary, 0.7 * cv::norm(distance), 255, cv::THRESH_BINARY); //对distance Mat对象进行二值化,输出结果保存在binary Mat对象中
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3));
cv::morphologyEx(binary, binary, cv::MORPH_OPEN, kernel); //对binary Mat对象进行形态学开运算
cv::Mat markers(binary.size(), CV_8U, cv::Scalar(0));
markers = binary + 1;
cv::watershed(src, markers); //对src Mat对象进行分水岭算法,输出结果保存在markers Mat对象中

到了这里,关于【c++ Opencv】Opencv中Mat的一些相关操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用 OpenCV4 和 C++ 构建计算机视觉项目:1~5

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

    2023年04月20日
    浏览(51)
  • C++计算机视觉库OpenCV在Visual Studio 2022的配置方法

      本文介绍在 Visual Studio 2022 中配置、编译 C++ 计算机视觉库 OpenCV 的方法。   首先,我们进行 OpenCV 库的下载与安装。作为一个开源的库,我们直接在其官方下载网站(https://opencv.org/releases/)中进行下载即可;如下图所示,我们首先选择需要下载的操作系统。   随后

    2024年02月16日
    浏览(60)
  • 用于计算机视觉的 OpenCV(C++ 与 Python)与 MATLAB之间的优缺点比较

    我们经常混淆我们的工具和我们的手艺。工具可以帮助你练习手艺,但它们并不能使你成为一名优秀的工匠。一个好工匠的口袋里有许多不同的工具,她会明智地使用适合工作的工具。她没有嫁给这些工具。她嫁给了她的手艺。 我经常被关于编程语言的战争逗乐。人们对哪一

    2024年02月13日
    浏览(50)
  • opencv c++ (1):创建Mat对象的常用方法

    对于学过的东西,想系统记录一下,这里记录的是在Ai 旅途中常用到的opencv 相关知识,快速带你进阶opencv opencv c++ 中最常见的就是Mat类型。Mat 它是一个类,它所创建的对象类似于python 版opencv 中numpy 数据结构,因此也可以把他理解为一个存放矩阵的容器。Mat类的详细介绍可以

    2024年02月08日
    浏览(37)
  • [OpenCV][C++编程] cv::mat的定义与赋值

    可以通过在/目录下直接搜索opencv,确定opencv所在的目录: lopencv_core 是opencv的核心, -lopencv_highgui包含读取图像和显示图像的函数 -lopencv_imgproc包含图像处理函数(非机器学习方法),例如线性滤波,边缘检测、膨胀腐蚀、检测直线、仿射变换等等。 -lopencv_ml包含机器学习算法

    2024年02月09日
    浏览(48)
  • [C++] opencv - Mat::convertTo函数介绍和使用场景

    Converts an array to another data type with optional scaling.    该函数主要用于数据类型的相互转换。 The method converts source pixel values to the target data type. saturate_cast is applied at the end to avoid possible overflows: m(x,y)=saturate_castrtype(α(∗this)(x,y)+β)    这是函数底层算法实现公式,了解算法方便我们

    2024年01月18日
    浏览(52)
  • 一些计算机相关知识

    intel 和 amd 两家公司 Intel 占四分之三,最早提出8086等等处理器,所以叫x86 amd 占四分之一,最早提出向下兼容的64位系统,所以叫x64 arm的主要专利技术在arm公司手中,像高通,三星,苹果这些公司需要拿到arm的授权 指令集其实就是机器码,机器码上是汇编,汇编之上是C++ 核

    2024年02月12日
    浏览(43)
  • C++如何打印输出OpenCV的Mat对象的像素数据?

    直接上源码: ==默认风格== [111, 111, 166, 192, 251, 255, 255, 255, 255, 255;  111,  83,  93,  83, 102,  85, 255, 251, 255, 255;  111,  83, 111, 102, 111, 140, 255, 255, 255, 255;  111,  83, 111,  83, 111, 140, 255, 255, 255, 255;   83,  83, 111,  83, 111, 175, 255, 255, 255, 255;   83,  74,  93,  83, 111, 175, 255, 251, 255, 255;  

    2023年04月08日
    浏览(48)
  • c++ opencv中unsigned char *、Mat、Qimage互相转换

    unsigned char * 转Mat void * 转Qimage qimage转Mat Mat转Qimage

    2024年02月03日
    浏览(62)
  • Opencv 基本操作四 指针数组、vector与Mat之间的相互转换 | Mat切片成Vector<mat>并还原

    在深度学习模型部署中通常存在读取图像为mat,然后将mat转换为float指针传入模型的操作。为了快捷开发,因此对指针数组、vector与Mat之间的相互转换进行整理。实现了指针数组、vector之间的相互转换;vector与Mat之间的相互转换(含单通道图像和多通道图像)。vector转mat主要

    2024年02月08日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包