当前位置: 首页 > news >正文

opencv中的图像操作

图像操作

输入输出

从文件中加载图像:

 Mat img = imread(filename); // 读取灰度图Mat img = imread(filename, IMREAD_GRAYSCALE);

保存图像:

imwrite(filename,img);

文件的格式由其扩展名决定。
使用cv::imdecodecv::imencode从/到内存读取和写入图像,而不是文件。

图像的基本操作

访问像素的强度值

对于单通道图像,如灰度图,每个像素只有一个强度值,可以直接使用**at**来获取。

 Scalar intensity = img.at<uchar>(y, x);

对于多通道图像,通常指三通道BGR色彩图像,则需要使用Vec3b

 Vec3b intensity = img.at<Vec3b>(y, x);uchar blue = intensity.val[0];uchar green = intensity.val[1];uchar red = intensity.val[2];

此外,仅在C++中可以使用std::vector来构造一个矩阵。

 vector<Point2f> points;//... fill the arrayMat pointsMat = Mat(points);

C++还可以使用同样的方法:

 Point2f point = pointsMat.at<Point2f>(i, 0);

内存管理和引用计数

Mat是一个保持矩阵/图像特征(行和列数,数据类型等)和指向数据的指针的结构。也因此,我们其实可以有多个关联到同一个数据的Mat实例。当Mat的一个特定实例被销毁时,Mat会保持一个引用计数,该计数告诉我们数据是否必须被释放。

以下是一个没有拷贝数据创造两个Mat的例子:

 std::vector<Point3f> points;// .. fill the arrayMat pointsMat = Mat(points).reshape(1);// 该方法通常用来处理大量点数据并将其转换成矩阵

结果是我们将会获得一个32FC1(32-bit浮点单通道,其列数为3)的三通道矩阵,而不是32FC3的单通道矩阵。pointsMat使用来自点的数据且不会再销毁时释放内存。但是,在实际的例子中,开发者仍然需要确保points的生命周期比pointsMat更长。如果需要拷贝数据,请使用cv::Mat::copyTocv::Mat::clone来进行复制操作。

 Mat img = imread("image.jpg");Mat img1 = img.clone();

可以为每个函数提供一个空输出Mat。每个实现都为目标矩阵调用Mat::create。如果矩阵为空,则此方法为其分配数据。如果它不为空并且具有正确的大小和类型,则该方法不执行任何操作。但是,如果大小或类型与输入参数不同,则释放(并丢失)旧数据并分配新数据。举个例子:

 Mat img = imread("image.jpg");Mat sobelx;Sobel(img, sobelx, CV_32F, 1, 0);

基础操作

 // 从一个已经存在的灰度图中获取一个黑色的图像img = Scalar(0); // 选取ROI(region of interest)Rect r(10, 10, 100, 100);Mat smallImg = img(r);// 从彩色图转换成灰度图Mat img = imread("image.jpg"); // loading a 8UC3 imageMat grey;cvtColor(img, grey, COLOR_BGR2GRAY);// 将图片从8UC1转换到32FC1src.convertTo(dst, CV_32F);

图像可视化

在开发过程中,能看到你算法的中间结果是非常有帮助的。Opencv提供了一种非常好用的可视化图像的方法。一个8U的图像可以被如下展示:

 Mat img = imread("image.jpg");namedWindow("image", WINDOW_AUTOSIZE);imshow("image", img);waitKey();

waitKey的调用将会形成一个消息传递循环,等待“图像”窗口中的按键才会被中止。一个32F的图像需要被转换成8U的类型,例子如下所示:

 Mat img = imread("image.jpg");Mat grey;cvtColor(img, grey, COLOR_BGR2GRAY);Mat sobelx;Sobel(grey, sobelx, CV_32F, 1, 0);double minVal, maxVal;minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensitiesMat draw;sobelx.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));namedWindow("image", WINDOW_AUTOSIZE);imshow("image", draw);waitKey();

这里cv::namedWindow不是必需的,因为它后面紧跟着cv::imshow。然而,它可以用来改变窗口属性或当使用cv::createTrackbar

相关文章:

  • 端口占用多:UE4/UE5像素流送云推流时如何优化端口使用?
  • mac无法读取windows分区怎么办 苹果硬盘怎么读取
  • Android SDK版本号与API Level 的对应关系
  • ctfshow-web入门-命令执行(web53-web55)
  • 数据结构:手撕代码——顺序表
  • 【Java】解决Java报错:IllegalArgumentException
  • 【QT】记录一次QT程序发布exe过程
  • 硬盘几个关键指标你一定要知道!
  • 程序固化——FPGA学习笔记6
  • vscode插件开发之 - menu配置
  • ffmpeg的部署踩坑及简单使用方式
  • Linux排查问题常用命令
  • C语言详解(文件操作)1
  • ARM的异常处理
  • Android 上展示 GIF 动图的方法
  • [Vue CLI 3] 配置解析之 css.extract
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Facebook AccountKit 接入的坑点
  • JS实现简单的MVC模式开发小游戏
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 笨办法学C 练习34:动态数组
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于使用markdown的方法(引自CSDN教程)
  • 回流、重绘及其优化
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 十年未变!安全,谁之责?(下)
  • 项目管理碎碎念系列之一:干系人管理
  • 异步
  • - 转 Ext2.0 form使用实例
  • #### go map 底层结构 ####
  • #14vue3生成表单并跳转到外部地址的方式
  • #565. 查找之大编号
  • $(selector).each()和$.each()的区别
  • (Python) SOAP Web Service (HTTP POST)
  • (undone) MIT6.824 Lab1
  • (undone) MIT6.824 Lecture1 笔记
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)Linux Shell编程——输入输出重定向
  • (循环依赖问题)学习spring的第九天
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)UDP基本编程步骤
  • (转)平衡树
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core WebAPI中封装Swagger配置
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Core引入性能分析引导优化
  • .Net的DataSet直接与SQL2005交互
  • .NET连接数据库方式
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [1204 寻找子串位置] 解题报告
  • [AIGC] 解题神器:Python中常用的高级数据结构