C++ OpenCV4.5常用API查询手册(二)

系列文章目录

C++ OpenCV4.5环境搭建(一)


文章目录

  • 系列文章目录
  • 前言
  • 一、Mat对象
    • 1、简介
    • 2、构造函数和常用方法
      • 常用构造函数
      • 常用方法
      • Mat对象使用
  • 二、imread
  • 三、namedWindow
  • 四、imshow
  • 五、cvtColor
  • 六、imwrite
  • 七、waitKey
  • 七、bitwise_not
  • 八、filter2D
  • 九、addWeighted
  • 十、line
  • 十一、rectangle
  • 十二、circle
  • 十三、ellipse
  • 十四、fillPoly
  • 十五、putText


前言

记录一些常用OpenCV常用API的使用介绍,长期更新,当做操作手册使用



一、Mat对象

1、简介

Mat对象是OpenCV2.0之后引进的图像数据结构;自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构;分了两个部分,头部和数据部分;

2、构造函数和常用方法

常用构造函数

    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对象的头部,不会复制数据部分

	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两个函数可实现数据完全复制

二、imread

// 功能:加载图像文件成为一个Mat对象
// 参数:filename 图像路径
// 		flags 加载图像的标识,常见有
//			IMREAD_UNCHANGED(-1):表示加载原图,不做任何改变
// 			IMREAD_GRAYSCALE(0):把原图作为灰度图像加载进来
//			IMREAD_COLOR(1):将原图作为RGB图像加载进来---默认值
// 返回:成功返回一个Mat图像数据对象
Mat imread( const String& filename, int flags = IMREAD_COLOR );

三、namedWindow

// 功能:创建一个OpenCV窗口,由OpenCV自动创建和释放,无需手动销毁
// 参数:winname 窗口名称
// 		flags 窗口标识,主要用到
//			WINDOW_AUTOSIZE:自动根据图像大小,显示窗口大小,不能人为改变窗口大小---默认值
//			WINDOW_NORMAL:跟QT集成时用到,允许修改窗口大小
// 返回:无
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);

四、imshow

// 功能:根据窗口名称显示图像到指定窗口
// 参数:winname 窗口名称
// 		mat Mat图像数据对象
// 返回:无
void imshow(const String& winname, InputArray mat);

五、cvtColor

// 功能:把图像从一个彩色空间转换到另一个色彩空间
// 参数:src 源图像, Mat对象类型
// 		dst 色彩空间转换后的图像,Mat对象类型
//		code 源和目标色彩空间,如:COLOR_BGR2HLS(饱和度)、COLOR_BGR2GRAY(灰度)等
//		dstCn ...-默认为0
// 返回:无
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );

六、imwrite

// 功能:保存图像文件到指定路径,只有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>());

七、waitKey

// 功能:无限期地等待按键事件或延迟
// 参数:delay 延迟(单位:ms),0表示无限期地等待按键事件
// 返回:如果在延时之前按下键,返回对应的键的值,否则返回-1
int waitKey(int delay = 0);

七、bitwise_not

// 功能:翻转图像颜色,目标图像的像素值 = 255 - 源图像的像素值 
// 参数:src 源图像,Mat对象类型
//		dst 目标图像,Mat对象类型
//		mask ...
// 返回:无
void bitwise_not(InputArray src, OutputArray dst,
                              InputArray mask = noArray());

八、filter2D

// 功能:图像卷积运算函数
// 参数: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 );

九、addWeighted

// 功能:图像混合,两张图像的大小和类型必须一致
// 参数: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);

十、line

// 功能:绘制一条连接两个点的线段
// 参数: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);

十一、rectangle

// 功能:绘制一个矩形
// 参数: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);

十二、circle

// 功能:绘制一个圆
// 参数: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);  

十三、ellipse

// 功能:绘制一个椭圆
// 参数: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);  

十四、fillPoly

// 功能:填充多边形
// 参数: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() );

十五、putText

// 功能:绘制字符串
// 参数: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 );

你可能感兴趣的:(OpenCV4.5学习记录,opencv,c++)