首页 > 编程语言 >C++之OpenCV入门到提高005:005 图像操作

C++之OpenCV入门到提高005:005 图像操作

时间:2024-11-15 10:57:19浏览次数:1  
标签:src int dst C++ 像素 OpenCV 005 col row

一、介绍
    今天是这个系列《C++之 Opencv 入门到提高》得第五篇文章。这篇文章也不难,介绍如何图像的基本操作,比如:读取一张图片的像素值,如何修改一张图片中的像素值,如何读取一张图片,如何保存一张图片等等,这都是基础,为以后的学习做好铺垫。虽然操作很简单,但是背后有很多东西需要我们深究,才能做到知其然知其所以然。OpenCV 具体的简介内容,我就不多说了,网上很多,大家可以自行脑补。
    OpenCV 的官网地址:https://opencv.org/,组件下载地址:https://opencv.org/releases/
    OpenCV 官网学习网站:https://docs.opencv.ac.cn/4.10.0/index.html

    我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。
        操作系统:Windows Professional 10(64位)
        开发组件:OpenCV – 4.10.0
        开发工具:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.8.3
        开发语言:C++(VC16)

二、知识学习
    这些都是图像的基本操作,所以并不会很难,但是这也是学好 openCV的基础。内容很简单,就不说过多的废话了,所有讲解都在代码的注释中。

  1 #include <opencv2/opencv.hpp>
  2 #include <iostream>
  3 #include <math.h>
  4 
  5 using namespace std;
  6 using namespace cv;
  7 
  8 /// <summary>
  9 /// 图像的操作
 10 /// 1、读写图像
 11 /// 2、读写像素
 12 /// 3、修改像素值
 13 /// </summary>
 14 /// <returns></returns>
 15 int main()
 16 {
 17     //1、读写图像
 18     //1.1、imread 可以指定加载灰度或者 RGB 图像
 19     //1.2、imwrite 可以保存图像,类型由扩展名决定。
 20     Mat src;
 21     src = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\demo-gril.png", IMREAD_UNCHANGED);
 22     if (src.empty())
 23     {
 24         cout << "图像加载失败!!!" << endl;
 25         return -1;
 26     }
 27 
 28     namedWindow("原图", WINDOW_AUTOSIZE);
 29     imshow("原图", src);
 30 
 31     //2、读写像素
 32     //2.1、都一个灰度(Gray)像素的像素值(CV_8UC1)
 33     //        Scalar intensity=src.at<uchar>(row,col);
 34     //        Scalar intensity=src.at<uchar>(Point(row,col));
 35     // 
 36     //2.2、读一个彩色(RGB)像素点的像素值。
 37     //        Vec3f intensity=src.at<Vec3f>(row,col);
 38     //        float blue=intensity.val[0];
 39     //        float green=intensity.val[1];
 40     //        float red=intensity.val[2];
 41     //
 42     //        Vec3f 就是 float 类型的 RGB 数据
 43     // 
 44     //2.3、修改单通道灰度像素值
 45     //        src.at<uchar>(row,col)=128;
 46     // 
 47     // 2.4、修改RGB 三通道像素值
 48     //        src.at<Vec3b>(row,col)[0]=128;
 49     //        src.at<Vec3b>(row,col)[1]=128;
 50     //        src.at<Vec3b>(row,col)[2]=128;
 51     // 
 52     // 2.5、空白像素赋值
 53     //        src=Scalar(0);
 54     // 
 55     // 
 56     // 2.6、Vec3b 与 Vec3f
 57     // 2.6.1、Vec3b 对应三通道的顺序是 blue,green,red 的 uchar 类型数据
 58     // 2.6.2、Vec3f 对应三通道的顺序是 blue,green,red 的 float 类型数据
 59     // 2.6.3、把 CV_8UC1 转换为 CV32F1 实现如下:src.convertTo(dst,CV_32F);
 60     // 
 61     //2.1、读取单通道像素值,示例代码:
 62     Mat graySrc;
 63     cvtColor(src, graySrc, COLOR_BGR2GRAY);//将彩色的 RGB 3 通道的转换为灰度单通道的图片。
 64     namedWindow("单通道灰度图像", WINDOW_AUTOSIZE);
 65     imshow("单通道灰度图像", graySrc);
 66 
 67     int width = graySrc.cols;
 68     int height = graySrc.rows;
 69 
 70     for (int row = 0; row < height; row++)
 71     {
 72         for (int col = 0; col < width; col++)
 73         {
 74             //读取单通道、灰度的像素值
 75             int gray = graySrc.at<uchar>(row, col);
 76             //修改单通道、灰度的像素值
 77             graySrc.at<uchar>(row, col) = 255 - gray;
 78         }
 79     }
 80 
 81     imshow("修改后单通道灰度图像", graySrc);//可以直接使用显示图像,他会自动创建显示图片的窗口。
 82 
 83     //处理多通道、彩色的图像
 84     width = src.cols;
 85     height = src.rows;
 86     int channes = src.channels();
 87 
 88     Mat dst;
 89     dst.create(src.size(),src.type());
 90 
 91     for (int row = 0; row < height; row++)
 92     {
 93         for (int col = 0; col < width; col++)
 94         {
 95             if (channes == 1)
 96             {
 97                 //读取单通道、灰度的像素值
 98                 int gray = src.at<uchar>(row, col);
 99                 //修改单通道、灰度的像素值
100                 src.at<uchar>(row, col) = 255 - gray;
101             }
102             else
103             {
104                 //读取多通道、彩色像素值。Vec3b 就是指具有3个通道的 BGR 的数据结构
105                 Vec3b myvalue=src.at<Vec3b>(row, col);
106                 int b = myvalue.val[0];
107                 int g = myvalue.val[1];
108                 int r = myvalue.val[2];
109 
110                 //修改多通道、彩色像素值,这是取反效果。
111                 /*dst.at<Vec3b>(row, col)[0] = 255 - b;
112                 dst.at<Vec3b>(row, col)[1] = 255 - g;
113                 dst.at<Vec3b>(row, col)[2] = 255 - r;*/
114 
115                 //修改多通道、彩色像素值,这是只包含蓝色和绿色,青就是色。
116                 /*dst.at<Vec3b>(row, col)[0] = b;
117                 dst.at<Vec3b>(row, col)[1] = g;
118                 dst.at<Vec3b>(row, col)[2] = 0;*/
119 
120                 //修改多通道、彩色像素值,这是只包含蓝色和红色,就是紫色。
121                 /*dst.at<Vec3b>(row, col)[0] = b;
122                 dst.at<Vec3b>(row, col)[1] = 0;
123                 dst.at<Vec3b>(row, col)[2] = r;*/
124 
125                 //修改多通道、彩色像素值,这是只包含绿色和红色,就是黄色。
126                 dst.at<Vec3b>(row, col)[0] = 0;
127                 dst.at<Vec3b>(row, col)[1] = g;
128                 dst.at<Vec3b>(row, col)[2] = r;
129 
130                 //graySrc.at<uchar>(row, col) = min(r,min(b,g));取灰色第二个方法
131             }
132         }
133     }
134 
135     imshow("修改后单、多通道图像", dst);//可以直接使用显示图像,他会自动创建显示图片的窗口。
136     //imshow("单通道灰度图像", graySrc);
137     //opencv 接口也可以实现这样反差的效果
138     bitwise_not(src, dst);
139 
140     imshow("bitwise_not 修改后单、多通道图像", dst);//可以直接使用显示图像,他会自动创建显示图片的窗口。
141 
142     
143     waitKey(0);
144 
145     system("pause");
146     return 0;
147 }

 

    代码很简单,就不多说了。

    效果如图:

    

    

    

    

    

    以上就是图像修改后的效果图。


三、总结
    这是 C++ 使用 OpenCV 的第五篇文章,其实也没那么难,感觉是不是还是很好入门的,那就继续。初见成效,继续努力。皇天不负有心人,不忘初心,继续努力,做自己喜欢做的,开心就好。

标签:src,int,dst,C++,像素,OpenCV,005,col,row
From: https://www.cnblogs.com/PatrickLiu/p/18540141

相关文章

  • C++ RAII 范式指南
    1.RAII概述RAII(ResourceAcquisitionIsInitialization)是C++中最重要的资源管理机制之一,它将资源的生命周期与对象的生命周期绑定,确保资源的安全使用和自动释放。历史背景:RAII概念由BjarneStroustrup在1984-1989年间提出最早用于解决C++异常处理中的资源泄......
  • Windows下搭建Cmake编译环境进行C/C++文件的编译
    文章目录1.下载Cmake2.安装MinGW-w643.进行C/C++文件的编译1.下载Cmake网址:https://cmake.org/download/  下载完成后安装,勾选“AddCMaketothesystemPATHforthecurrentuser"  点击Finish完成安装,在cmd窗口验证一下是否安装成功,出现如下图情况则安装成......
  • Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百
    一、前言说明已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有。无论哪个地图厂家,提供的接口都是没有唯一标识参数的,也就类似于学号,这就是需要自己主动定一个属性用来存储唯一标......
  • 【洛谷】P1047 [NOIP2005 普及组] 校门外的树
    题目描述某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 l 的位置;数轴上的每个整数点即 0,1,2,…,l都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数......
  • 构造函数C++
    1.构造函数的介绍功能:专门用于对象的初始化工作,在类的对象创建时定义初始状态特点构造函数的名字和类名是相同的构造函数是没有返回值类型的,也不能写void。可以有形参(也可以重载)在创建对象的时候,会自动调用。而且是一定会调用,但是只会调用一次,不能通过已有......
  • 每日OJ题_牛客_计算字符串的编辑距离_DP_C++_Java
    目录牛客_计算字符串的编辑距离_DP题目解析C++代码Java代码牛客_计算字符串的编辑距离_DP计算字符串的编辑距离_牛客题霸_牛客网描述:Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换......
  • C++函数的返回值在内存中的传递过程及什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可
    1) C++函数的返回值在内存中的传递过程在C++中,函数返回值在内存中的传递过程如下:基本数据类型返回值传递当函数返回基本数据类型(如`int`、`double`、`char`等)时,函数会将返回值存储在一个临时的寄存器中。然后,调用函数的地方会从这个寄存器中获取返回值,并将其存储到相应......
  • 什么是C++命名空间 有什么作用?如何定义使用命名空间?且交代命名空间是否允许嵌套?
    1)什么是C++命名空间有什么作用?命名空间的定义:在C++中,命名空间(Namespace)是一种将代码组织成逻辑组的机制,用于避免不同代码模块之间的命名冲突。它提供了一个声明区域,在该区域内可以定义各种类型、函数、变量等,并且这些定义的名称在该命名空间内是唯一的。命名空间的作用:......
  • C++基础编程(一)
    If语句,条件运算符&&||,运算符优先级,for循环语句,switch语句,continue,break,do,while打印一个锥形1~9矩阵,打印9*9乘法表,For(初始化;条件;每次循环必执行语句)输出abcd....ABCD....0123....输出从1~1000,能被7整除的数While输入一组数,0为结束,计算他们的和......
  • C++ 友元跨命名空间使用
    以+运算符重载为例:#include<iostream>#include<string>//前置声明是必须的namespacemydog{classDog;}namespacemyadd{mydog::Dogoperator+(constmydog::Dogdog1,constmydog::Dogdog2);}namespacemydog{classDog{friend......