#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");
}
mat转二维数组 二维数组转mat以及进行高斯滤波和sobel
于 2022-10-18 10:42:43 首次发布