mat转二维数组 二维数组转mat以及进行高斯滤波和sobel

这篇博客演示了如何使用OpenCV库在C++中读取图像、检查图像是否加载成功、进行灰度化处理,并将图像数据存储到二维数组和双精度浮点型矩阵中。还涉及到了动态内存管理和高斯模糊及Sobel算子的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> //包含imread, imshow等标识符
#include "opencv2/imgproc/imgproc.hpp" //包含cvtColor等

using namespace std;
using namespace cv;

//测试Mat
void main() {
	//读入图像
	
	Mat mat= imread("2.jpg",0);
	
	//判断读入图片是否有误
	if (mat.empty())
	{
		if (!mat.data) {
			printf("Oh,no,读取图片文件错误~! \n");
		}
		cout << "error" << endl;
	}

	// 进行图像灰度化操作
	//cvtColor(mat, mat, COLOR_BGR2GRAY);
	//获取 mat 的行和列
	int row = mat.rows;
	int col = mat.cols;
	cout << "  mat.rows : " << mat.rows << endl;
	cout << "  mat.cols : " << mat.cols << endl;


	//动态创建二维数组,row行col列
	int** La = new int* [row];
	for (int i = 0; i < row; i++) {
		La[i] = new int[col];
	}
	// 循环二维数组和mat,并将mat对应值赋给二维数组对应值,
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			La[i][j] = mat.at<uchar>(i, j);
			//cout << La[i][j] << endl;
			
		}
	}
	double(*lad)[500] = new double[500][500];
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			lad[i][j ]=double(La[i][j]);
			

		}
	}
	cv::Mat src_gray(500, 500, CV_64F);
	//cv::Mat  mData(10, 2, CV_16UC1, &data);//这个结果是不对的
	memcpy(src_gray.data, lad, 500 * 500 * sizeof(double));
	


  //  cv::Mat  src_gray(500, 500, CV_64FC1, &lad);
	//cout << "src_gray:" << src_gray << endl;
	//cout << src_gray.at<uchar>(0, 0)<< endl;
	//namedWindow("x_grad", 0);
	//imshow("x_grad", src_gray);
	

	//waitKey(0);


	//cout << src_gray.data << endl;
  //Mat x_grad = src_gray.clone();//, y_grad;
	Mat x_grad(500, 500, CV_64F), y_grad(500, 500, CV_64F);
	GaussianBlur(src_gray, x_grad, Size(5, 3), 0);
	
	Sobel(x_grad, y_grad, CV_8U,0,1);



	delete[] lad;
	// 释放分配空间
	for (int i = 0; i < row; i++) {
		delete[]La[i];
	}
	delete[] La;

	cout << endl;
	waitKey(0);
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值