Mat 转二维数组:
int Laplace::TempltExcute(Mat &src,int*tmplt,int tw,intx,int y){
inti,j,py,px;
intsum = 0;
for(i=0;i<tw;i++){
for(j=0;j<tw;j++){
py = y-tw/2+i;
px = x-tw/2+j;
sum+=src.at<ty>(py,px)*tmplt[i*tw+j];
}
}
returnsum;
}
// vs2010.cpp Opencv 2.4.4
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
int main(int argc, char* argv[])
{
IplImage *src = cvLoadImage("lena.jpg", 0);
cvNamedWindow("source", 1);
cvShowImage("source", src);
cvWaitKey();
int m = src->height;
int n = src->width;
int i, j;
printf("channel = %d", src->nChannels);
// 分配内存
int **p;
p = new int *[m];
for (i=0; i<m; i++)
{
p[i] = new int[n];
}
// 将图像数据存到二位数组中
//CvScalar s;
//for (i=0; i<m; i++)
//{
// for (j=0; j<n; j++)
// {
// s = cvGet2D(src, i, j);
// p[i][j] = s.val[0];
// }
//}
/**************************************/
// 或者
uchar *ptr;
for (i=0; i<m; i++)
{
ptr = (uchar*)src->imageData + i*src->widthStep;
for (j=0; j<n; j++)
{
p[i][j] = (int)*(ptr+j);
}
}
/**************************************/
// 将二位数组中的数据载入新的单通道灰度图像中,看是否和原图一致
IplImage *copy = cvCreateImage(cvGetSize(src), 8, 1);
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
cvSetReal2D(copy, i, j, p[i][j]);
}
}
// 显示图像副本
cvNamedWindow("copy", 1);
cvShowImage("copy", copy);
cvWaitKey();
// 释放图像
cvReleaseImage(&src);
cvReleaseImage(©);
cvDestroyAllWindows();
//释放内存
for (i=0; i<m; i++)
delete [] p[i];
delete [] p;
return 0;
}
本文介绍如何使用OpenCV库中的Mat对象进行图像处理,并将其数据转换为二维数组。文章详细展示了从图像加载到创建二维数组的过程,以及如何通过遍历图像像素实现图像数据的读取与操作。
1万+

被折叠的 条评论
为什么被折叠?



