opencv

核心提示#include "stdafx.h"#include <string>#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace

#include "stdafx.h"

#include <string>

#include <iostream>

#include <opencv2/opencv.hpp>

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)的矩阵,旧内容将会被释放

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

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

M.row(3) = M.row(3) + M.row (5) * 3;

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

Mat M1 = M.col(1);

M.col(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;

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

cout<<size.width<<" "<<size.height<<" "<<ofs.x<<" "<<ofs.y<<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("aa.jpg", 2 | 4);

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

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

CV_Assert((oldmat.cols == img1->width) && (oldmat.rows == img1->height) && (oldmat.data.ptr == (uchar *)img1->imageData) && (oldmat.step == img1->widthStep));

imshow(strWindowName, mtx);

waitKey(0);

cvNamedWindow(strWindowName.c_str(), 0);

cvShowImage(strWindowName.c_str(), &oldmat);

cvWaitKey(0);

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

cvShowImage(strWindowName.c_str(), &img2);

cvWaitKey(0);

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

imshow(strWindowName, mat3);

waitKey(0);

cvDestroyWindow(strWindowName.c_str());

cvReleaseImage(&img1);

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

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

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

M2.at<double>(0, 0) += 10.f;

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

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

{

const double *Mi = M2.ptr<double>(i) ;

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

{

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

}

}

cout<<sum<<endl;

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

int cols =M2.cols, rows = M2.rows ;

if (M2.isContinuous())

{

cols *= rows;

rows = 1 ;

}

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

{

const double *Mi = M2.ptr <double>(i);

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

{

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

}

}

cout<<sum<<endl;

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

MatConstIterator_<double> it = M2.begin<double>(), it_end = M2.end<double>();

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

{

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

}

cout<<sum<<endl;

return 0;

}

1、生成MAT文件

假如你的矩阵A、B都已赋值,现在需要将A、B矩阵保存成mat格式文件,执行如下命令:save matfile1 A B 就会把A B矩阵数据保存在matfile1.mat文件中了

eg:>>A=[1 2];

>>B =[3 4];

>>save matfile1 A B; %回车即可将A B保存在matfile1.mat文件中了。

如果想要单独保存一个数据,例如A,输入以下指令即可:

>> save matfile2 A;

2、保存所有数据为MAT文件

如果有多个矩阵,我们需要将其全部保存,如果数据量很大,就不一一写下保存了,否则会很麻烦,我们直接用下面命令便可:

save mydata3 %保存以上所有数据

这样就会把当前运行空间所有的变量都保存到mydata3.mat文件中了

3、读取mat文件数据

首先是将你想打开的mat文件所在的目录设置为当前工作目录,然后执行如下命令:load mydata,就会将mydata中的所有数据加载到当前工作环境中;

eg:>>load matfile %这样读取的是mat文件中所有的数据

如果想要仅仅读取mat文件中某些特定的数据,那么可以单独调用:load matfile *。

eg: >>load matfile A %这样,A就会被加载到当前工作环境中,而其他的B、C、D都不会被加载。

4、如何设置工作路径

所谓工作路径就是matlab运行时的工作目录,matlab包含很多工具箱,用户在使用时也会产生很多文件,工作路径就是matlab使用这些工具,函数,文件的途径。

4.1、查看搜索路径:path

在命令窗口中输入path,就能查看matlab的搜索路径(比如,输入一条代码,程序会在这些目录中依次搜索是否为变量,是否为函数,M文件等)。

>> path

4.2、当前工作目录:cd

输入命令cd,可以查看当前工作目录。

>>cd

4.3、修改工作路径:userpath('F:matlabwork')

路径可以自己定义。

>>userpath('F:matlabwork')

4.4、保存路径修改:savepath

改完默认路径后需要保存一下。

>>savepath

4.5、也可以用工具操作:pathtool

在命令窗口中输入pathtool,打开工具,在修改完成后,要保存。

 
友情链接
鄂ICP备19019357号-22