怎样从内存中读取图像并转为mat格式

怎样从内存中读取图像并转为mat格式,第1张

IplImage 转 cv::Mat

IplImage pImg = cvLoadImage("lenajpg");

Mat img(pImg,0); // 0是不复制影像,也就是pImg与img的data共用同个记忆体位置,header各自有

可以使用 imwrite 函数。将其放在一个循环中,可以批量处理多个矩阵。下面是一个实现的示例代码:

1、for i = 1:n

2、假设你有n个矩阵并将它们保存在名为mat1、mat2、、matn的变量中

3、假设你要生成名为 image1png、image2png、、image_npng 的图像文件。

4、filename = ['image', num2str(i), 'png']; 使用 imwrite 函数将矩阵转换为图像文件。

5、imwrite(eval(['mat', num2str(i)]), filename)。在上述代码中,eval(['mat', num2str(i)]) 将字符串 mat 和迭代变量 i 组合起来,以便动态地选择要转换的矩阵。因此,在循环中,imwrite 函数将依次生成一个名为 image1png、image2png、、image_npng 的图像文件。

#include "stdafxh"

#include <string>

#include <iostream>

#include <opencv2/opencvhpp>

using namespace std;

using namespace cv;

int _tmain(int argc, _TCHAR argv[])

{

//创建一个用1+3j填充的 7 x 7 复矩阵-----1

Mat M(7, 7, CV_32FC2, Scalar(1,3));

//现在将 M转换为100 x 60的CV_8UC(15)的矩阵,旧内容将会被释放

Mcreate(100, 60, CV_8UC(15));//不能为矩阵设置初值

//第 5行,乘以 3,加到第 3 行,

Mrow(3) = Mrow(3) + Mrow (5) 3;

//现在将第7列复制到第1列, Mcol(1) = Mcol(7);//这个不能实现,对列 *** 作时要新建一个Mat

Mat M1 = Mcol(1);

Mcol(7)copyTo(M1);

//创建一种新的 320 x 240 图像-----2

Mat img(Size(320,240), CV_8UC3, Scalar::all(255));

string strWindowName = "ShowImage";

namedWindow(strWindowName, WINDOW_AUTOSIZE);

imshow(strWindowName, img);

waitKey(0);

//选择ROI(region of interest)

Mat roi(img, Rect(10, 10, 100, 100));

//填充 (0,255,0) 的ROI (这是RGB 空间中的绿色),320 x 240 原始图像将被修改

roi = Scalar(0, 255, 0) ;

imshow(strWindowName, img);

waitKey(0);

//获取数组中的子块-----3

Mat A = Mat::eye(10, 10, CV_32S);

//提取 A 的1 (含)到 3 (不包含)列

Mat B = A(Range::all(), Range(1, 3));

//提取 B 的5 (含)到 9 (不包含)行,即 C ~ A(Range(5,9),Range (1,3))

Mat C = B(Range(5, 9), Range::all());

Size size;

Point ofs;

ClocateROI(size, ofs);//使用locateROI() 计算子数组在主容器数组中的相对的位置

cout<<sizewidth<<" "<<sizeheight<<" "<<ofsx<<" "<<ofsy<<endl;

//快速初始化小矩阵-----4

double m[3][3] = {{1, 2, 3}, {1, 2, 5}, {3, 4, 6}};

Mat M2 = Mat(3, 3, CV_64F, m);//inv();

Mat E = Mat::eye(4, 4, CV_64F);

cout<<"E = "<<endl<<" "<<E<<endl;

Mat O = Mat::ones(2, 2, CV_32F);

cout<<"O = "<<endl<<" "<<O<<endl;

Mat Z = Mat::zeros(3,3, CV_8UC1);

cout<<"Z = "<<endl<<" "<<Z<<endl;

//IplImage、Mat、CvMat互转-----5

IplImage img1 = cvLoadImage("aajpg", 2 | 4);

Mat mtx(img1);//IplImage -> Mat,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头// or : Mat mtx = img1;

CvMat oldmat = mtx;//Mat-> CvMat //只是创建矩阵头,而没有复制数据,oldmat不用手动释放

CV_Assert((oldmatcols == img1->width) && (oldmatrows == img1->height) && (oldmatdataptr == (uchar )img1->imageData) && (oldmatstep == img1->widthStep));

imshow(strWindowName, mtx);

waitKey(0);

cvNamedWindow(strWindowNamec_str(), 0);

cvShowImage(strWindowNamec_str(), &oldmat);

cvWaitKey(0);

IplImage img2 = mtx;//Mat->IplImage //只是创建图像头,而没有复制数据,img2不用手动释放

cvShowImage(strWindowNamec_str(), &img2);

cvWaitKey(0);

Mat mat3(&oldmat);//CvMat->Mat

imshow(strWindowName, mat3);

waitKey(0);

cvDestroyWindow(strWindowNamec_str());

cvReleaseImage(&img1);

//创建 3 x 3 双精度恒等矩阵-----6

Mat M3 = (Mat_ <double>(3,3) <<1,0,0, 0,1,0, 0,0,1);

//访问数组元素-----7

M2at<double>(0, 0) += 10f;

double sum = 0;//计算元素和,方法一

for (int i=0; i<M2rows; i++)

{

const double Mi = M2ptr<double>(i) ;

for (int j=0; j<M2cols; j++)

{

sum += std::max(Mi[j], 0);

}

}

cout<<sum<<endl;

sum = 0;//计算元素和,方法二

int cols =M2cols, rows = M2rows ;

if (M2isContinuous())

{

cols = rows;

rows = 1 ;

}

for (int i=0; i<rows; i++)

{

const double Mi = M2ptr <double>(i);

for (int j=0; j<cols; j++)

{

sum += std::max(Mi[j], 0);

}

}

cout<<sum<<endl;

sum = 0;//计算元素和,方法三

MatConstIterator_<double> it = M2begin<double>(), it_end = M2end<double>();

for(; it != it_end; ++it)

{

sum += std::max(it, 0);

}

cout<<sum<<endl;

return 0;

}

以上就是关于怎样从内存中读取图像并转为mat格式全部的内容,包括:怎样从内存中读取图像并转为mat格式、matlab批量把矩阵mat转化为图片、opencv 中 Mat 数据结构的用法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9462968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存