opencv笔记(矩阵Mat的常用操作)

最近将一个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的关系

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值