OpenCV图像处理笔记(一):图片基本操作
一、基本介绍
1、简介
- OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法。
- 是Intel公司贡献出来的,俄罗斯工程师贡献大部分C/C++带代码。
- 在多数图像处理相关的应用程序中被采用,BSD许可,可以免费应用在商业和研究领域
- 最新版本是OpenCV 3.1.0,当前SDK支持语言包括了Java、Python、IOS和Android版本。
- 官方主页: http://opencv.org/opencv-3-1.html
- 其它Matlab、Halcon
2、核心模块
- HighGUI部分
- Image Process
- 2D Feature
- Camera Calibration and 3D reconstruction
- Video Analysis
- Object Detection
- Machine Learning
- GPU加速
3、安装(vs2015环境 && openCV 3.x)
==如果有报无法找到opencv_world343.dll的Error,请把C:\opencv\build\x64\vc14\bin下的opencv_world343.dll文件复制到C:\Windows 目录下即可==
二、图像处理
1、加载、修改、保存图像
加载图像(用cv::imread)
imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称
第二个参数,表示加载的图像是什么类型,支持常见的三个参数值
- IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变
- IMREAD_GRAYSCALE ( 0)表示把原图作为灰度图像加载进来
- IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来
==注意:== OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载
显示图像 (cv::namedWindos 与cv::imshow)
namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,你无需取销毁它。
常见用法namedWindow(“Window Title”, WINDOW_AUTOSIZE)
WINDOW_AUTOSIZE会自动根据图像大小,显示窗口大小,不能人为改变窗口大小
WINDOW_NORMAL,跟QT集成的时候会使用,允许修改窗口大小。
imshow根据窗口名称显示图像到指定的窗口上去,第一个参数是窗口名称,第二参数是Mat对象
修改图像 (cv::cvtColor)
- cvtColor的功能是把图像从一个彩色空间转换到另外一个色彩空间,有三个参数,第一个参数表示源图像、第二参数表示色彩空间转换之后的图像、第三个参数表示源和目标色彩空间如:COLOR_BGR2HLS 、COLOR_BGR2GRAY 等
- cvtColor( image, gray_image, COLOR_BGR2GRAY );
保存图像(cv::imwrite)
- 保存图像文件到指定目录路径
- 只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存
- 保存PNG格式的时候可以保存透明通道的图片
- 可以指定压缩参数
2、矩阵的掩膜操作
获取图像像素指针
- CV_Assert(myImage.depth() == CV_8U);
- Mat.ptr
(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。 - 获得当前行指针const uchar* current= myImage.ptr
(row ); - 获取当前像素点P(row, col)的像素值 p(row, col) =current[col]
像素范围处理saturate_cast
- saturate_cast
(-100),返回 0。 - saturate_cast
(288),返回255 - saturate_cast
(100),返回100 - 这个函数的功能是确保RGB值得范围在0~255之间
1 |
|
函数调用filter2D功能
- 定义掩膜:Mat kernel = (Mat_
(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); - filter2D( src, dst, src.depth(), kernel );其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
1 | Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); |
3、Mat对象
Mat对象与IplImage对象
- Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分
- IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题
==常用方法:==
1 | void copyTo(Mat mat) 克隆 |
复制
- 部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分
1 | Mat A= imread(imgFilePath); |
- 完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
1 | Mat F = A.clone(); 或 Mat G; A.copyTo(G); |
四个要点
- 输出图像的内存是自动分配的
- 使用OpenCV的C++接口,不需要考虑内存分配问题
- 赋值操作和拷贝构造函数只会复制头部分
- 使用clone与copyTo两个函数实现数
Mat对象的创建
1 | cv::Mat::Mat构造函数 |
定义小数组
1 | Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); |
MATLAB风格写法
1 | Mat m2; |
4、图像像素操作
读写像素
- 读一个GRAY像素点的像素值(CV_8UC1)
1 | Scalar intensity = img.at<uchar>(y, x); |
- 读一个RGB像素点的像素值
1 | Vec3f intensity = img.at<Vec3f>(y, x); |
修改像素值
- 灰度图像
1 | img.at<uchar>(y, x) = 128; |
- RGB三通道图像
1
2
3img.at<Vec3b>(y,x)[0]=128; // blue
img.at<Vec3b>(y,x)[1]=128; // green
img.at<Vec3b>(y,x)[2]=128; // red - 空白图像赋值
1
img = Scalar(0);
- ROI选择
1
2Rect r(10, 10, 100, 100);
Mat smallImg = img(r);
示例代码
1 | int main(int argc, char ** argo) { |
5、图像混合
理论-线性混合操作
其中a的取值范围为0~1之间
相关API (addWeighted)
1 | void addWeighted(InputArray src1, |
示例代码
1 | //设置权重 |
6、调整图像亮度与对比度
- 图像变换可以看作如下:
- 像素变换 – 点操作
- 邻域操作 – 区域
- 调整图像亮度和对比度属于像素变换-点操作
重要的API
1 | Mat new_image = Mat::zeros( image.size(), image.type() ); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0 |
示例代码
1 | int height = src1.rows; //高度 |
7、绘制形状与文字
使用cv::Point与cv::Scalar
1 | Point表示2D平面上一个点x,y |
绘制线、矩形、园、椭圆等基本几何形状
1 | 画线 cv::line (LINE_4\LINE_8\LINE_AA) |
==示例代码==
1 |
|
随机数生成cv::RNG
1 | 生成高斯随机数gaussian (double sigma) |
==随机画线代码==
1 | void RandomLineDemo() { |
绘制添加文字
1 | putText函数 中设置fontFace(cv::HersheyFonts), |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MiChong的🏡!
评论