OpenCV-学习历程3-Mat对象及相关方法 (如何初始化图像,拷贝图像,获取像素强度值等)

OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。

 Mat类型的使用方法

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

using namespace std;
using namespace cv;

int main(int argc, char**argv) {
	
	//Mat1. 创建Mat对象,并且从文件中读取图片显示
	Mat src;
	src = imread("sample.jpg");

	if (src.empty()) {
		cout << "The image is empty,plz check the file route..." << endl;
		return -1;
	}
	namedWindow("Original_image", CV_WINDOW_AUTOSIZE);
	imshow("Original_image",src);

	//Mat2. 复制图像1: 创建Mat对象,复制src对象的尺寸,并且赋值给指定颜色(指定尺寸的纯色图)
	Mat dst;
	dst = Mat(src.size(), src.type());//设置图片尺寸,图片类型
	dst = Scalar(127,0,255);		  //设置纯色图片
	namedWindow("Test1", CV_WINDOW_AUTOSIZE);
	imshow("Empty_Image_test", dst);
	

	//Mat3. 复制图像2: 使用src.clone指令,复制已有图片到新建的图片中
	Mat dst = src.clone();
	namedWindow("Test1", CV_WINDOW_AUTOSIZE);
	imshow("Empty_Image_test", dst); 

	//Mat4. 复制图像3:  src.copyTo指令,将图片复制到dst中
	Mat dst;
	src.copyTo(dst);
	namedWindow("Test1", CV_WINDOW_AUTOSIZE);
	imshow("Empty_Image_test", dst); 


	//Mat5. 复制图像4: 在复制图像的同时,修改图像的格式
	Mat dst;
	cvtColor(src, dst, CV_BGR2GRAY);
	namedWindow("Test1", CV_WINDOW_AUTOSIZE);
	imshow("Empty_Image_test", dst); 
	printf("The input image channel is : %d \n",src.channels());
	printf("The output image channel is : %d \n", dst.channels());


	//Mat6. 显示图像信息(行,列,像素强度)
	Mat dst;
	cvtColor(src, dst, CV_BGR2GRAY);
	namedWindow("Test1", CV_WINDOW_AUTOSIZE);
	imshow("Empty_Image_test", dst);

	int cols = dst.cols;					//获取行和列的信息
	int rows = src.rows;
	printf("The row number of the image is : %d \n", cols);
	printf("The column number of the image is  : %d \n", rows);

	const uchar* firstrow_strangth = dst.ptr<uchar>(0);     //!!! 使用指针,取出第一行第一个元素的强度值
	printf("The strength is  : %d \n", *firstrow_strangth); //!!! 


	//Mat7.Mat 构造函数-创建一个用于测试的数值矩阵
	//重要!! 这个方法可以用于进行程序测试,运行处理程序,检查每个元素的强度是否与设定的一致; 之后再使用真实图片测试,这样比较直观。

	Mat M(3,3,CV_8UC3,Scalar(0,0,255)); //(3x3;每个通道8位,U表示无符号,C表示char类型,3表示通道数是3;每个像素的值是多少(0,0,255))
	cout << "M=" << endl << M << endl;

	//Mat8.Mat 定义一个小数组----掩膜,并用掩膜进行滤波-提高对比度
	Mat csrc;
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(src, csrc, -1, kernel);
	namedWindow("csrc", CV_WINDOW_AUTOSIZE);
	imshow("csrc", csrc);

	//Mat9.Mat Trick: 创建一个与给定图片尺寸一致的图片:纯黑色
	//Mat dst = Mat::zeros(src.size(),src.type());
	Mat dst = Mat::eye(2,2,CV_8UC1);
	namedWindow("black", CV_WINDOW_AUTOSIZE);
	imshow("black", dst); 



	waitKey();
	return 0;
}

上边代码运行时需要注释掉其他不需要的内容,运行效果如下:

->关于如何使用Mat指针获取特定像素值的方法

常用形式:
mat.ptr<type>(row)[col]

对于Mat的ptr函数,返回的是<>中的模板类型指针,指向的是()中的第row行的起点
通常<>中的类型和Mat的元素类型应该一致
然后再用该指针去访问对应col列位置的元素

以下转载自:https://blog.csdn.net/github_35160620/article/details/51708659

单通道
cv::Mat image = cv::Mat(400, 600, CV_8UC1);  //定义了一个Mat变量image。
uchar * data00 = image.ptr<uchar>(0);  //data00是指向image第一行第一个元素的指针。
uchar * data10 = image.ptr<uchar>(1);  //data10是指向image第二行第一个元素的指针。
uchar * data01 = image.ptr<uchar>(0)[1];//data01是指向image第一行第二个元素的指针。

多通道
cv::Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片
cv::Vec3b * data000 = image.ptr<cv::Vec3b>(0);
cv::Vec3b * data100 = image.ptr<cv::Vec3b>(1);
cv::Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1];

cv::Vec3b * data

猜你喜欢

转载自blog.csdn.net/weixin_42503785/article/details/113909033