最近将一个matlab中的程序用opencv实现
matlab中涉及到的许多矩阵操作 , 在opencv中对应Mat类的操作
下面是编程过程中用到的一些常用方法,记得比较杂
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的关系