【OpenCV+Cpp】day3Mat对象的使用

【OpenCV+Cpp】day3Mat对象的使用



前言

本文主要介绍了Mat对象的构造函数和常用方法,创建图像可以使用Mat对象和IpIImage对象:

  1. Mat对象是OpenCV2.0之后引进的图像数据结构,它可以自动分配内存,且不存在内存泄露的问题,是面向对象的数据结构。Mat对象分为两个部分,即头部数据部分
  2. IpIImage是从2001年OpenCV发布之后就一直存在的数据结构,他是一种C语言风格的数据结构,需要开发者自己分配与管理内存,在处理较大程序时它会出现内存泄漏问题。

一、Mat对象构造函数与常用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以下是构造函数和方法的代码示例:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src;
	src = imread("./1.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image", src);	
	
	Mat dst;
	// 初始化一个Mat对象(创建一张空白图像)
	dst = Mat(src.size(), src.type());
	dst = Scalar(127, 0, 255);
	//imshow("output1", dst);
	
	//1. 克隆
	Mat img1 = src.clone();
	Mat img2;
	src.copyTo(img2);
	imshow("output2", img1);
	imshow("output3", img2);

	//2. 图像类型转换,RGB→灰度图,通道数由3到1
	cvtColor(src, img2, COLOR_BGR2GRAY);
	printf("input image channels: %d\n",src.channels());
	printf("output iamge channels: %d\n", img2.channels());

	//3. 显示图像行数和列数
	int cols = img2.cols;
	int rows = img2.rows;
	printf("rows: %d cols: %d\n", cols, rows);
	//输出第一行的像素数(指针指向第0行)
	const uchar* firstRow = img2.ptr<uchar>(0);
	printf("first pixel value: %d\n", *firstRow);
	
	//4. 创建一个自定义的图像矩阵
	
	/*这行代码创建了一个大小为234x234的图像矩阵M,它的每个元素是一个3通道的像素值。
	CV_8UC3表示每个通道使用8位无符号整数来表示,
	Scalar(0, 0, 255)表示初始像素值为红色,即B=0、G=0、R=255。
	/*
	  CV_8UC3:可以拆解为3个部分
	  8:bit_depth表示bit数,代表图片中每个像素点所占空间的大小
	  S|U|F:
	    S:signed int 有符号整型
		U: unsign int 无符号整型
		F:float 单精度浮点型
	  C:图像通道数
	*/
	Mat M(234, 234, CV_8UC3, Scalar(0, 0, 255));
	cout << "M=" << endl << M << endl;
	imshow("output4", M);
	imshow("output3", img2);

	//5. 创建多维数组
	Mat img3;
	Mat m1;
	m1.create(src.size(), src.type());
	m1 = Scalar(0, 0, 255);
	//imshow("outputm", m1);
	//定义卷积核(实际上是一个矩阵,调整它的值可以得到不同对比度的图像)
	Mat kernel = (Mat_<float>(3, 3) << 0, 3, 0, 5, 2, 6, 0, -1, 0);
	// 增强对比度(滤波函数)(-1表示与输入图像保持相同的深度)
	filter2D(src, img3, -1, kernel);
	//imshow("outputimg3", img3);

	//初始化 创建一个2*2大小的8位有符号单通道图像
	Mat m2 = Mat::zeros(2, 2, CV_8SC1);
	//cout << "M=" << endl << M << endl;
	/*imshow("outputimg3", m2);*/
	waitKey(0);
	return 0;
}

实验结果就不在这里展示啦。


总结

以上就是对于Mat对象使用的全部内容啦,具体的实现还是要上机操作哦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值