您的位置:首页 > 运维架构

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的关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv mat c++