OpenCV算法精解1--OpenCV中C++基本 *** 作1

OpenCV算法精解1--OpenCV中C++基本 *** 作1,第1张

代码环境:Visual studio2017和Anaconda;
参考书籍:张平《OpenCV算法精解》;
编程语言:Python和C++;
Python3基础学习:Python3基础
C++基础学习:C++基础



1.初识Mat类
// 1.初识Mat
// 1.1 Mat是Matrix的缩写,代表矩阵或数组的意思,该类声明在opencv2\core\core.hpp中;
// 1.2 构造Mat对象相当于构造一个矩阵,需要四个要素:行数(高)、列数(宽)、通道数、数据类型;

// 1.3 Mat类构造函数语法格式:Mat(int rows,int cols,int type)
// 1.3.1 rows:矩阵的行数;
// 1.3.2 cols:矩阵的列数;
// 1.3.3 type:类型,包括通道数和数据类型;

// type可以设置的值:
// CV_8UC(n)、CV_8SC(n)、CV_16SC(n)、CV_16UC(n)、CV_32SC(n)、CV_32FC(n)、CV_64FC(n)、CV_64FC(n); 
// 说明:
// a.8U、8S、16S、16U、32S、32F、64F前的数字代表Mat中每一个数值所占的bit数,1byte=8bit;
// b.32F即占4个字节的float类型,64F即占8个字节的double类型,32S即占4字节的int类型,8U即占1字节的uchar类型;
// c.C(n)代表通道数,n=1,构造单通道或称二维矩阵,n>1,构造多通道矩阵即三维矩阵;
2.构造单通道Mat对象
// 2.构造单通道Mat对象
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	Mat array1 = Mat(3, 4, CV_32FC(1));		// 构造3行4列的矩阵;
	Mat ones = Mat::ones(3, 4, CV_32FC1);	// 构造3行4列全1的float类型的单通道矩阵;
	Mat zeros = Mat::zeros(3, 4, CV_32FC1); // 构造3行4列全0的float类型的单通道矩阵;

	cout << "3行4列全1矩阵:" << "\n" << ones << endl;
	cout << "---------------" << endl;
	cout << "3行4列全0矩阵:" << "\n" << zeros << endl;
	
	return 0;
}
3.获得单通道Mat的基本信息
// 3.获得单通道Mat的基本信息
/*
需要构造的矩阵为:
[
11 12
33 43
51 16
]
*/
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	// 1.使用成员变量rows和cols获取矩阵的行数和列数;
	Mat array1 = (Mat_<int>(3, 2) << 11, 12, 33, 43, 51, 16);	// 构造目标矩阵;
	cout << "矩阵行数:" << array1.rows << endl;		// 打印矩阵的行数;
	cout << "矩阵列数:" << array1.cols << endl;		// 打印矩阵的列数;

	// 2.使用成员函数size()获取矩阵尺寸;
	Size size = array1.size();
	cout << "矩阵尺寸:" << array1.size << endl;

	// 3.使用成员函数channels()得到矩阵的通道数;
	cout << "矩阵通道数:" << array1.channels() << endl;

	// 4.使用成员函数total()得到矩阵的行数乘以列数,即面积;
	cout << "矩阵面积:" << array1.total() << endl;

	// 5.使用成员变量dims获取矩阵的维数;
	cout << "矩阵维数:" << array1.dims << endl;

	return 0;
}
4.访问单通道Mat对象中的值
// 4.访问单通道Mat对象中的值
// 4.1 利用成员函数at访问对象中的值;
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	// 1.利用成员函数at访问对象中的值;
	Mat array1 = (Mat_<int>(3, 2) << 11, 12, 33, 43, 51, 16);	// 构造单通道矩阵;
	for (int r = 0; r < array1.rows; r++)
	{
		for (int c = 0; c < array1.cols; c++) {
			cout << array1.at<int>(r, c) << ",";	// 第r行第c列的值;
		}
		cout << endl;
	}

	return 0;
}
// 4.2 利用成员函数ptr访问对象中的值;
// 对于Mat中的数值在内存中的存储,每一行的值是存储在连续的内存区域中,通过成员函数ptr获得指向每一行首地址的指针;
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	// 2.利用成员函数ptr访问对象中的值;
	Mat array1 = (Mat_<int>(3, 2) << 1, 2, 3, 4, 5, 6);	// 构造单通道矩阵;
	for (int r = 0; r < array1.rows; r++)
	{
		const int *ptr = array1.ptr<int>(r);		// 获得第r行行首的地址;
		for (int c = 0; c < array1.cols; c++) {
			cout << ptr[c] << ",";					// 打印第r行的所有值;
		}
		cout << endl;
	}

	return 0;
}
// 4.3 利用成员函数isContinuous和ptr
// 每一行的所有值存储在连续的内存区域中,行与行之间可能会有间隔,如果isContinuous返回值为true,则代表行与行之间也是连续存储的,即所有值都是连续存储的;
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	// 3.利用成员函数isContinous和ptr访问对象中的值;
	Mat array1 = (Mat_<int>(3, 2) << 1, 2, 3, 4, 5, 6);	// 构造单通道矩阵;

	if (array1.isContinuous())
	{
		int *ptr = array1.ptr<int>(0);		// 得到矩阵的第一个值的地址;
		for (int n = 0; n < array1.rows*array1.cols; n++) {
			cout << ptr[n] << ",";
		}
	}

	return 0;
}
5.向量类Vec
// 5.向量类Vec
// 此处的向量理解为数学意义上的列向量,构造一个_cn×1的列向量,数据类型为_Tp;
// 格式:Vec
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	// 5.向量类Vec
	Vec<int, 4> vi(1, 2, 3, 4);		// 构造一个长度为4,数据类型为int且初始化为1,2,3,4的列向量;

	cout << "向量的行数:" << vi.rows << endl;
	cout << "向量的列数:" << vi.cols << endl;

	// 使用[]或()访问元素;
	cout << "访问第0个元素:" << vi[0] << endl;
	cout << "访问第3个元素:" << vi(3) << endl;

	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/923457.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存