C++ OpenCV4.5环境搭建(一)
记录一些常用OpenCV常用API的使用介绍,长期更新,当做操作手册使用
Mat对象是OpenCV2.0之后引进的图像数据结构;自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构;分了两个部分,头部和数据部分;
Mat();
Mat(int rows, int cols, int type);
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);
Mat(Size size, int type, const Scalar& s);
Mat(int ndims, const int* sizes, int type);
Mat(int ndims, const int* sizes, int type, const Scalar& s);
void copyTo(Mat mat);
void convertTo(Mat dst, int type);
Mat clone();
int channels();
int depth();
bool empty();
uchar* ptr(int i0=0);
#include
#include
using namespace std;
using namespace cv;
int main(void)
{
Mat srcImg, dstImg;
srcImg = imread("D:\\1.jpg");
if (!srcImg.data)
{
cout << "can not load image.." << endl;
return -1;
}
namedWindow("测试");
imshow("测试", srcImg);
/************************示例一*************************/
/*
// 创建了一个和源图像大小、图像类型一样的Mat对象,但是没有值
//dstImg = Mat(srcImg.size(), srcImg.type());
dstImg.create(srcImg.size(), srcImg.type());
// 给Mat对象设置一个颜色值
dstImg = Scalar(125, 125, 125);
*/
/************************示例二*************************/
/*
// 创建一个3通道的100*100像素的Mat对象,每个像素点的BGR是(0, 0, 255)
// 参数一:行数
// 参数二:列数
// 参数三:CV_8UC3中8表示每个通道占8位、U表示无符号、C表示char类型、3表示通道数目是3
// 参数四:向量,表示初始化每个像素值是多少,向量长度对应通道数目
//Mat mat(100, 100, CV_8UC1, Scalar(255));
Mat mat(100, 100, CV_8UC3, Scalar(0, 0, 255));
namedWindow("测试输出");
imshow("测试输出", mat);
*/
/************************示例三*************************/
/*
// 克隆一个Mat对象,数据完全拷贝
dstImg = srcImg.clone();
*/
/************************示例四*************************/
/*
// 拷贝一个Mat对象
srcImg.copyTo(dstImg);
*/
/************************示例五*************************/
// 将图像转换为灰色图像
cvtColor(srcImg, dstImg, COLOR_BGR2GRAY);
/************************示例六*************************/
// 获取图像通道数
cout << "srcImg channels:" << srcImg.channels() << endl;
cout << "dstImg channels:" << dstImg.channels() << endl;
/************************示例七*************************/
// 获取图像第一行的像素值
const uchar* pFirstRow = dstImg.ptr<uchar>(0);
cout << "dstImg first pixel value:" << *pFirstRow << endl;
/************************示例八*************************/
// 获取图像的行数和列数
cout << "dstImg rows:" << srcImg.rows << endl;
cout << "dstImg clos:" << srcImg.cols << endl;
/************************示例九*************************/
// 创建一个3*3的Mat数组
Mat kernel = (Mat_<uchar>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << endl << kernel << endl;
/************************示例十*************************/
// 初始化一个和源图像大小、类型一致的纯黑色对象
Mat mat = Mat::zeros(srcImg.size(), srcImg.type());
/************************示例十一*************************/
// 初始化一个单通道的2*2的纯黑色对象
//Mat mat2 = Mat::zeros(2, 2, CV_8UC1);
// 初始化一个单通道的2*2的眼睛对象
Mat mat2 = Mat::eye(2, 2, CV_8UC1);
cout << endl << mat2 << endl;
namedWindow("测试输出");
imshow("测试输出", dstImg);
waitKey(0);
return 0;
}
部分复制:一般情况只会复制Mat对象的头部,不会复制数据部分
Mat A = imread("D:\\1.jpg");
Mat B(A); // 只复制头部
完全复制:如果想要复制完整的头部和数据部分,使用如下API
// 方法一
Mat C = A.clone();
// 方法二
Mat D;
A.copyTo(A);
Mat 使用总结:
1、输出图像的内存是自动分配的
2、使用OpenCV的C++接口,不需要考虑内存分配问题
3、赋值操作和拷贝构造函数只会复制头部
4、使用clone与copyTo两个函数可实现数据完全复制
// 功能:加载图像文件成为一个Mat对象
// 参数:filename 图像路径
// flags 加载图像的标识,常见有
// IMREAD_UNCHANGED(-1):表示加载原图,不做任何改变
// IMREAD_GRAYSCALE(0):把原图作为灰度图像加载进来
// IMREAD_COLOR(1):将原图作为RGB图像加载进来---默认值
// 返回:成功返回一个Mat图像数据对象
Mat imread( const String& filename, int flags = IMREAD_COLOR );
// 功能:创建一个OpenCV窗口,由OpenCV自动创建和释放,无需手动销毁
// 参数:winname 窗口名称
// flags 窗口标识,主要用到
// WINDOW_AUTOSIZE:自动根据图像大小,显示窗口大小,不能人为改变窗口大小---默认值
// WINDOW_NORMAL:跟QT集成时用到,允许修改窗口大小
// 返回:无
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
// 功能:根据窗口名称显示图像到指定窗口
// 参数:winname 窗口名称
// mat Mat图像数据对象
// 返回:无
void imshow(const String& winname, InputArray mat);
// 功能:把图像从一个彩色空间转换到另一个色彩空间
// 参数:src 源图像, Mat对象类型
// dst 色彩空间转换后的图像,Mat对象类型
// code 源和目标色彩空间,如:COLOR_BGR2HLS(饱和度)、COLOR_BGR2GRAY(灰度)等
// dstCn ...-默认为0
// 返回:无
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
// 功能:保存图像文件到指定路径,只有8位和16位的PNG、JPG和Tiff文件格式,并且是单通道或三通道的BGR的图像才可通过改方式保存;保存PNG格式的时候可以保存透明通道图片;可以指定压缩参数
// 参数:filename 保存的图像的路径
// img 要保存的图像,Mat对象类型
// params 格式化指定参数编码---默认为空
// 返回:无
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
// 功能:无限期地等待按键事件或延迟
// 参数:delay 延迟(单位:ms),0表示无限期地等待按键事件
// 返回:如果在延时之前按下键,返回对应的键的值,否则返回-1
int waitKey(int delay = 0);
// 功能:翻转图像颜色,目标图像的像素值 = 255 - 源图像的像素值
// 参数:src 源图像,Mat对象类型
// dst 目标图像,Mat对象类型
// mask ...
// 返回:无
void bitwise_not(InputArray src, OutputArray dst,
InputArray mask = noArray());
// 功能:图像卷积运算函数
// 参数:src 源图像,Mat对象类型
// dst 目标图像,Mat对象类型
// ddepth 位图深度,有32、24、8等
// kernel 掩膜,Mat类型对象
// ...其他都是默认值
// 返回:无
void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
// 功能:图像混合,两张图像的大小和类型必须一致
// 参数:src1 输入图像1,Mat对象类型
// alpha 输入图像1的混合权重
// src2 输入图像2,Mat对象类型
// beta 输入图像2的混合权重
// gamma 图像1与图像2的像素值、通过上面的公式相加后,会加上该数值
// dst 输出混合图像,Mat对象类型
// dtype ...默认-1
// 返回:无
void addWeighted(InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype = -1);
// 功能:绘制一条连接两个点的线段
// 参数:img 图像源,Mat对象类型
// pt1 线段的点1
// pt2 线段的点2
// color 线条颜色
// thickness 线条厚度
// lineType 线型类型(LINE_4\LINE_8\LINE_AA)
// shift 移动点坐标中小数位数
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
int thickness = 1, int lineType = LINE_8, int shift = 0);
// 功能:绘制一个矩形
// 参数:img 图像源,Mat对象类型
// rec 矩形
// color 矩形颜色或亮度(灰度图像)
// thickness 线条厚度
// lineType 线型类型(LINE_4\LINE_8\LINE_AA)
// shift 移动点坐标中小数位数
void rectangle(Mat& img, Rect rec, const Scalar& color,
int thickness = 1, int lineType = LINE_8, int shift = 0);
// 功能:绘制一个圆
// 参数:img 图像源,Mat对象类型
// center 圆的中心
// radius 圆的半径
// color 圆的颜色
// thickness 线条厚度
// lineType 线型类型(LINE_4\LINE_8\LINE_AA)
// shift 移动点坐标中小数位数
void circle(InputOutputArray img, Point center, int radius,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);
// 功能:绘制一个椭圆
// 参数:img 图像源,Mat对象类型
// center 椭圆的中心点
// axes 椭圆主轴大小的一半
// angle 椭圆旋转角度(度)
// startAngle 椭圆弧的起始角(度)
// startAngle 椭圆弧的结束角(度)
// color 矩形颜色或亮度(灰度图像)
// thickness 线条厚度
// lineType 线型类型(LINE_4\LINE_8\LINE_AA)
// shift 移动点坐标中小数位数
void ellipse(InputOutputArray img, Point center, Size axes,
double angle, double startAngle, double endAngle,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);
// 功能:填充多边形
// 参数:img 图像源,Mat对象类型
// pts 多边形数组,其中每个多边形都表示为一个点数组
// npts
// ncontours
// color 填充的颜色
// lineType 线型类型(LINE_4\LINE_8\LINE_AA)
// shift 移动点坐标中小数位数
// offset 等高线所有点的可选偏移
void fillPoly(Mat& img, const Point** pts,
const int* npts, int ncontours,
const Scalar& color, int lineType = LINE_8, int shift = 0,
Point offset = Point() );
// 功能:绘制字符串
// 参数:img 图像源,Mat对象类型
// text 要绘制的字符串
// org 图像中字符串的起始位置(左下角)
// fontFace 字体类型
// fontScale 字体大小
// color 字体颜色
// thickness 绘制字符串的线条的粗细
// lineType 线型类型(LINE_4\LINE_8\LINE_AA)
// bottomLeftOrigin 如果为true,则图像数据原点位于左下角。否则,它在左上角。
void putText( InputOutputArray img, const String& text, Point org,
int fontFace, double fontScale, Scalar color,
int thickness = 1, int lineType = LINE_8,
bool bottomLeftOrigin = false );