javamat⼆维矩阵_OpenCV中Mat与⼆维数组之间的转换---恢复内容开始---
在OpenCV中将Mat(⼆维)与⼆维数组相对应,即将Mat中的每个像素值赋给⼀个⼆维数组。
全部代码如下:
#include #include#include //包含imread, imshow等标识符
#include "opencv2/imgproc/imgproc.hpp" //包含cvtColor等
using namespacestd;using namespacecv;//测试Mat
voidmain(){//读⼊图像
Mat mat = imread("trabeculae.jpg");//判断读⼊图⽚是否有误
pty())
{if (!mat.data) {
printf("Oh,no,读取图⽚⽂件错误~! \n");
}
cout<< "error" <
}//进⾏图像灰度化操作
cvtColor(mat, mat, CV_BGR2GRAY);
//获取mat 的⾏和列
int row =ws;int col =ls;
cout<< "ws :" << ws <
cout<< "ls :" << ls <
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(i, j);
}
}
// 释放分配空间for (int i = 0; i < row; i ++){delete[]La[i];
}delete[] La;cout<
waitKey(0);
system("pause");
}
分析:
1. 读⼊⼀幅图像
//读⼊图像
Mat mat = imread("trabeculae.jpg");//判断读⼊图⽚是否有误
pty())
{if (!mat.data) {
printf("Oh,no,读取图⽚⽂件错误~! \n");
}
cout<< "error" <
}
2. 对图像进⾏灰度化操作,将Mat转为⼆维。
//进⾏图像灰度化操作
cvtColor(mat, mat, CV_BGR2GRAY);
3. Mat有rows和cols属性,rows表⽰对应矩阵⾏数,cols表⽰对应矩阵列数://保存mat的⾏和列
int row =ws;int col = ls;
4. Mat还具有size () ⽅法,该⽅法可以得到width宽度和height⾼度:
Size s =mat.size();int width =s.width;int height = s.height;
5. rows,cols,width,height 之间的关系:
cout << "s.width :" << s.width <
cout<< "s.height :" << s.height <
cout<< "ws :" << ws <
cout<< "ls :" << ls << endl;
6. 打印结果:
7. 结论:
由第5步和第6步可得:
mat.size().width =ls;
mat.size().height= ws;
8. 动态创建⼆维数组:
例:创建⼀个4⾏3列的⼆维数组,如下:
{ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }
即:{ { 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
}
//创建⼀个⼆维数组中包含4个⼀维数组,即先定义4⾏
int **array = new int *[4];//循环⼆维数组,并将⼆维数组中的每个元素创建为包含3个元素的⼀维数组//先分配多少⾏,再每⾏分配多少列
for (int i = 0; i < 4; i ++){
array[i]= new int[3];
}//循环遍历⼆维数组,⾏作为外循环,列作为内循环,⼀⾏⼀⾏地遍历
for (int i = 0; i < 4; i ++){for (int j = 0; j < 3; j ++){
array[i][j]= 0;
cout<< " " <
}
cout<
}//使⽤完请求分配的数值需要释放分配空间(内存)//释放分配空间,⼀⾏⼀⾏的删除
for (int i = 0; i < 4; i ++){delete[]array[i];
java定义一维数组并赋值}delete [] array;
结果:
9. 使⽤Mat图像的宽度和⾼度进⾏动态创建⼆维数组,Height(row)代表具有多少⾏,width(col)代表具有多少列。
//创建⼀个⼆维数组,height(row)⾏width(col)列
int **La = new int *[height];for (int i = 0; i < height; i ++){
La[i]= new int[width];
}//循环将Mat中对应的值赋给La⼆维数组
for (int i = 0; i < row; i ++){for (int j = 0; j < col; j ++){
La[i][j]= mat.at(i, j);//cout << " " << La[i][j] ;
}//cout << endl;
}//释放分配空间
for (int i = 0; i < height; i ++){delete[]La[i];
}delete [] La;
10. 创建⼀个和⼆维数组⾏列⼤⼩的Mat:
当知道⼆维数组的⼤⼩,需要将⼆维数组中的值赋给同样⼤⼩的Mat,使⽤Mat显⽰。//创建⼀个Mat变量 height(row)⾏width(col)列
Mat temp = Mat(height, width, CV_8U, Scalar::all(0));//循环赋值
for (int i = 0; i < height; i ++){for (int j = 0; j < width; j ++){
mat.at(i, j) =La[i][j];
}
}
---恢复内容结束---
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论