opencv笔记(矩阵Mat的常用操作)
2016-04-25 15:17
453 查看
最近将一个matlab中的程序用opencv实现
matlab中涉及到的许多矩阵操作 , 在opencv中对应Mat类的操作
下面是编程过程中用到的一些常用方法,记得比较杂
CV_<bit_depth>(S|U|F)C<number_of_channels>
S = 符号整型 U = 无符号整型 F = 浮点型
可通过binImg.type() != CV_8UC1来查看类型
图像转化为浮点型
img.convertTo(img,CV_32F);
转成三通道
cvtColor(lineImage, lineImage, CV_GRAY2BGR);
转成单通道
cvtColor(input1, gray, CV_BGR2GRAY);
Mat::size[0]表示行数
size[1]表示列数
Mat构造函数的时候是矩阵的概念也是先行后列
只有Size构造函数的时候是尺寸的概念是先 宽 后 高 Size(宽,高) 也就是先列后行
还有Point构造函数(x,y)的概念
对于点Point,的坐标x,y,原点在图像的左上角
图像的img.at<>(y,x)也是左上角为原点,注意是y,x 也就是第y行,第x列
构造一个矩阵
Mat Vt = Mat::zeros( img.size[0], img.size[1] , CV_32FC1);//uchar是CV_8U int是CV_32SC1
X = Mat(h,w,CV_32FC1,Scalar::all(0));
访问图像某一像素
X.at<类型>(i,j) 类型若为3通道则为Vec3b,单通道图中默认是uchar(是CV_8U)
要转成float用img1.convertTo(img1,CV_32F);也可用(uchar)(i)转成uchar
//提取eyemat的1-2行,3-4列
Mat submat=eyemat(Range(0,2),Range(2,4));
//提取第一行
Mat row = fx.rowRange(0,1).clone();
以上两种中的数字可以理解为每行(列)的间隙的位置
Mat src = imread(“xx.jpg”);
Mat srcROI = src(Rect(0,0,src.cols/2,src.rows/2));
构造一个矩阵
Mat a=(Mat_<float>(3,3)<<0,-1,0,
-1,5,-1,
0,-1,0);
double minVal , maxVal ;
int minIdx , maxIdx;
minMaxIdx(a,&minVal, &maxVal , &minIdx , &maxIdx);//不需要用NULL替代 如minMaxIdx(a,NULL, &maxVal , NULL , &maxIdx);
寻找最小值最大值及位置 &minIdx和&maxIdx必须是指向包含两个以上元素的指针
Mat a=(Mat_<int>(3,3)<<0,-1,110,
-1,5,44,
-100,-1,0);
Mat b = a.diag();//返回 b = [0;
5;
0]
//翻转(镜像),dst是Mat,可用于矩阵和图像
flip(dst, dst2, 1); // flip by y axis
flip(dst, dst3, 0); // flip by x axis
flip(dst, dst4, -1); // flip by both axises//先x 后y 就相当于旋转180度
///用STL 的vector 取中值
vector< float > vect;
Mat a=(Mat_<float>(3,3)<<0,1,110,
2,5,44,
-100,7,0);
for ( i = 0 ; i < a.size[0] ; i++)
{
for ( j = 0 ; j < a.size[1] ; j++)
{
if ( a.at<float>(i,j) > 0 )
vect.push_back(a.at<float>(i,j));
}
}
sort(vect.begin(), vect.end());
mid = vect[(int)vect.size()/2] ;
/////求矩阵所有值的和
float b =sum(a)[0];//a是单通道Mat
//sum返回的是一个Scalar,Vect4x类型,后面三个都是0,所以取[0]
卷积滤波 filter2D说明是卷积 实际上是相关运算!
filter2D(srcimg,dstimg,img.depth(),kernel);
通道分离合并
vector<Mat> channels;
split(srcImage, channels);
Mat image0, image1, image2;
image0 = channels.at(0);
image1 = channels.at(1);
image2 = channels.at(2);
imshow("image0", image0);
imshow("image1", image1);
imshow("image2", image2);
merge(channels, dstImage);
imshow("dstImage", dstImage);
OPENCV的HSV中的H是到180,而PS中的H是到360,应该是1/2的关系
matlab中涉及到的许多矩阵操作 , 在opencv中对应Mat类的操作
下面是编程过程中用到的一些常用方法,记得比较杂
CV_<bit_depth>(S|U|F)C<number_of_channels>
S = 符号整型 U = 无符号整型 F = 浮点型
可通过binImg.type() != CV_8UC1来查看类型
图像转化为浮点型
img.convertTo(img,CV_32F);
转成三通道
cvtColor(lineImage, lineImage, CV_GRAY2BGR);
转成单通道
cvtColor(input1, gray, CV_BGR2GRAY);
Mat::size[0]表示行数
size[1]表示列数
Mat构造函数的时候是矩阵的概念也是先行后列
只有Size构造函数的时候是尺寸的概念是先 宽 后 高 Size(宽,高) 也就是先列后行
还有Point构造函数(x,y)的概念
对于点Point,的坐标x,y,原点在图像的左上角
图像的img.at<>(y,x)也是左上角为原点,注意是y,x 也就是第y行,第x列
构造一个矩阵
Mat Vt = Mat::zeros( img.size[0], img.size[1] , CV_32FC1);//uchar是CV_8U int是CV_32SC1
X = Mat(h,w,CV_32FC1,Scalar::all(0));
访问图像某一像素
X.at<类型>(i,j) 类型若为3通道则为Vec3b,单通道图中默认是uchar(是CV_8U)
要转成float用img1.convertTo(img1,CV_32F);也可用(uchar)(i)转成uchar
//提取eyemat的1-2行,3-4列
Mat submat=eyemat(Range(0,2),Range(2,4));
//提取第一行
Mat row = fx.rowRange(0,1).clone();
以上两种中的数字可以理解为每行(列)的间隙的位置
Mat src = imread(“xx.jpg”);
Mat srcROI = src(Rect(0,0,src.cols/2,src.rows/2));
构造一个矩阵
Mat a=(Mat_<float>(3,3)<<0,-1,0,
-1,5,-1,
0,-1,0);
double minVal , maxVal ;
int minIdx , maxIdx;
minMaxIdx(a,&minVal, &maxVal , &minIdx , &maxIdx);//不需要用NULL替代 如minMaxIdx(a,NULL, &maxVal , NULL , &maxIdx);
寻找最小值最大值及位置 &minIdx和&maxIdx必须是指向包含两个以上元素的指针
Mat a=(Mat_<int>(3,3)<<0,-1,110,
-1,5,44,
-100,-1,0);
Mat b = a.diag();//返回 b = [0;
5;
0]
//翻转(镜像),dst是Mat,可用于矩阵和图像
flip(dst, dst2, 1); // flip by y axis
flip(dst, dst3, 0); // flip by x axis
flip(dst, dst4, -1); // flip by both axises//先x 后y 就相当于旋转180度
///用STL 的vector 取中值
vector< float > vect;
Mat a=(Mat_<float>(3,3)<<0,1,110,
2,5,44,
-100,7,0);
for ( i = 0 ; i < a.size[0] ; i++)
{
for ( j = 0 ; j < a.size[1] ; j++)
{
if ( a.at<float>(i,j) > 0 )
vect.push_back(a.at<float>(i,j));
}
}
sort(vect.begin(), vect.end());
mid = vect[(int)vect.size()/2] ;
/////求矩阵所有值的和
float b =sum(a)[0];//a是单通道Mat
//sum返回的是一个Scalar,Vect4x类型,后面三个都是0,所以取[0]
卷积滤波 filter2D说明是卷积 实际上是相关运算!
filter2D(srcimg,dstimg,img.depth(),kernel);
通道分离合并
vector<Mat> channels;
split(srcImage, channels);
Mat image0, image1, image2;
image0 = channels.at(0);
image1 = channels.at(1);
image2 = channels.at(2);
imshow("image0", image0);
imshow("image1", image1);
imshow("image2", image2);
merge(channels, dstImage);
imshow("dstImage", dstImage);
OPENCV的HSV中的H是到180,而PS中的H是到360,应该是1/2的关系
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性